scsi: spi: Have midlayer retry spi_execute() UAs
authorMike Christie <michael.christie@oracle.com>
Tue, 23 Jan 2024 00:22:09 +0000 (18:22 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 30 Jan 2024 02:20:53 +0000 (21:20 -0500)
This has spi_execute() have the SCSI midlayer retry UAs instead of driving
them.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
Link: https://lore.kernel.org/r/20240123002220.129141-9-michael.christie@oracle.com
Acked-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/scsi_transport_spi.c

index f668c1c0a98f20bc6b8923687ca451f10351b2aa..64852e6df3e327d97aa74d38f932e11551a69b41 100644 (file)
@@ -108,29 +108,30 @@ static int spi_execute(struct scsi_device *sdev, const void *cmd,
                       enum req_op op, void *buffer, unsigned int bufflen,
                       struct scsi_sense_hdr *sshdr)
 {
-       int i, result;
-       struct scsi_sense_hdr sshdr_tmp;
        blk_opf_t opf = op | REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT |
                        REQ_FAILFAST_DRIVER;
+       struct scsi_failure failure_defs[] = {
+               {
+                       .sense = UNIT_ATTENTION,
+                       .asc = SCMD_FAILURE_ASC_ANY,
+                       .ascq = SCMD_FAILURE_ASCQ_ANY,
+                       .allowed = DV_RETRIES,
+                       .result = SAM_STAT_CHECK_CONDITION,
+               },
+               {}
+       };
+       struct scsi_failures failures = {
+               .failure_definitions = failure_defs,
+       };
        const struct scsi_exec_args exec_args = {
+               /* bypass the SDEV_QUIESCE state with BLK_MQ_REQ_PM */
                .req_flags = BLK_MQ_REQ_PM,
-               .sshdr = sshdr ? : &sshdr_tmp,
+               .sshdr = sshdr,
+               .failures = &failures,
        };
 
-       sshdr = exec_args.sshdr;
-
-       for(i = 0; i < DV_RETRIES; i++) {
-               /*
-                * The purpose of the RQF_PM flag below is to bypass the
-                * SDEV_QUIESCE state.
-                */
-               result = scsi_execute_cmd(sdev, cmd, opf, buffer, bufflen,
-                                         DV_TIMEOUT, 1, &exec_args);
-               if (result < 0 || !scsi_sense_valid(sshdr) ||
-                   sshdr->sense_key != UNIT_ATTENTION)
-                       break;
-       }
-       return result;
+       return scsi_execute_cmd(sdev, cmd, opf, buffer, bufflen, DV_TIMEOUT, 1,
+                               &exec_args);
 }
 
 static struct {