Re: [PATCH v2 3/4] scsi: st: Modify st.c to use the new scsi_error counters

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Reviewed-by: John Meneghini <jmeneghi@xxxxxxxxxx>
Tested-by: John Meneghini <jmeneghi@xxxxxxxxxx>

On 11/25/24 09:03, Kai Mäkisara wrote:
Compare the stored values of por_ctr and new_media_ctr against
the values in the device struct. In case of mismatch, the
Unit Attention corresponding to the counter has happened.
This is a safeguard against another ULD catching the
Unit Attention sense data.

Remove use of the was_reset flag in struct scsi_device.

Signed-off-by: Kai Mäkisara <Kai.Makisara@xxxxxxxxxxx>
---
  drivers/scsi/st.c | 28 +++++++++++++++++++++++++---
  drivers/scsi/st.h |  4 ++++
  2 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
index a0667a0ae4c9..ad86dfbc8919 100644
--- a/drivers/scsi/st.c
+++ b/drivers/scsi/st.c
@@ -163,9 +163,11 @@ static const char *st_formats[] = {
static int debugging = DEBUG; +/* Setting these non-zero may risk recognizing resets */
  #define MAX_RETRIES 0
  #define MAX_WRITE_RETRIES 0
  #define MAX_READY_RETRIES 0
+
  #define NO_TAPE  NOT_READY
#define ST_TIMEOUT (900 * HZ)
@@ -357,10 +359,18 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)
  {
  	int result = SRpnt->result;
  	u8 scode;
+	unsigned int ctr;
  	DEB(const char *stp;)
  	char *name = STp->name;
  	struct st_cmdstatus *cmdstatp;
+ ctr = scsi_get_ua_por_ctr(STp->device);
+	if (ctr != STp->por_ctr) {
+		STp->por_ctr = ctr;
+		STp->pos_unknown = 1; /* ASC => power on / reset */
+		st_printk(KERN_WARNING, STp, "Power on/reset recognized.");
+	}
+
  	if (!result)
  		return 0;
@@ -413,10 +423,11 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)
  	if (cmdstatp->have_sense &&
  	    cmdstatp->sense_hdr.asc == 0 && cmdstatp->sense_hdr.ascq == 0x17)
  		STp->cleaning_req = 1; /* ASC and ASCQ => cleaning requested */
-	if (cmdstatp->have_sense && scode == UNIT_ATTENTION && cmdstatp->sense_hdr.asc == 0x29)
+	if (cmdstatp->have_sense && scode == UNIT_ATTENTION &&
+		cmdstatp->sense_hdr.asc == 0x29 && !STp->pos_unknown) {
  		STp->pos_unknown = 1; /* ASC => power on / reset */
-
-	STp->pos_unknown |= STp->device->was_reset;
+		st_printk(KERN_WARNING, STp, "Power on/reset recognized.");
+	}
if (cmdstatp->have_sense &&
  	    scode == RECOVERED_ERROR
@@ -968,6 +979,7 @@ static int test_ready(struct scsi_tape *STp, int do_wait)
  {
  	int attentions, waits, max_wait, scode;
  	int retval = CHKRES_READY, new_session = 0;
+	unsigned int ctr;
  	unsigned char cmd[MAX_COMMAND_SIZE];
  	struct st_request *SRpnt = NULL;
  	struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
@@ -1024,6 +1036,13 @@ static int test_ready(struct scsi_tape *STp, int do_wait)
  			}
  		}
+ ctr = scsi_get_ua_new_media_ctr(STp->device);
+		if (ctr != STp->new_media_ctr) {
+			STp->new_media_ctr = ctr;
+			new_session = 1;
+			DEBC_printk(STp, "New tape session.");
+		}
+
  		retval = (STp->buffer)->syscall_result;
  		if (!retval)
  			retval = new_session ? CHKRES_NEW_SESSION : CHKRES_READY;
@@ -4394,6 +4413,9 @@ static int st_probe(struct device *dev)
  		goto out_idr_remove;
  	}
+ tpnt->new_media_ctr = scsi_get_ua_new_media_ctr(SDp);
+	tpnt->por_ctr = scsi_get_ua_por_ctr(SDp);
+
  	dev_set_drvdata(dev, tpnt);
diff --git a/drivers/scsi/st.h b/drivers/scsi/st.h
index 2105c6a5b458..47b0e31b7828 100644
--- a/drivers/scsi/st.h
+++ b/drivers/scsi/st.h
@@ -178,6 +178,10 @@ struct scsi_tape {
  	int recover_count;     /* From tape opening */
  	int recover_reg;       /* From last status call */
+ /* The saved values of midlevel counters */
+	unsigned int new_media_ctr;
+	unsigned int por_ctr;
+
  #if DEBUG
  	unsigned char write_pending;
  	int nbr_finished;





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux