scsi: lpfc: Change return code on I/Os received during link bounce
authorJames Smart <jsmart2021@gmail.com>
Sat, 4 Dec 2021 00:26:37 +0000 (16:26 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 7 Dec 2021 03:35:36 +0000 (22:35 -0500)
During heavy I/O testing with issue_lip to bounce the link, occasionally
I/O is terminated with status 3 result 9, which means the RPI is suspended.
The I/O is completed and this type of error will result in immediate retry
by the SCSI layer. The retry count expires and the I/O fails and returns
error to the application.

To avoid these quick retry/retries exhausted scenarios change the return
code given to the midlayer to DID_REQUEUE rather than DID_ERROR. This gets
them retried, and eventually succeed when the link recovers.

Link: https://lore.kernel.org/r/20211204002644.116455-3-jsmart2021@gmail.com
Co-developed-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_hw.h
drivers/scsi/lpfc/lpfc_scsi.c

index 634f8ff..61c9db3 100644 (file)
@@ -3746,7 +3746,7 @@ typedef struct {
 #define IOERR_ILLEGAL_COMMAND         0x06
 #define IOERR_XCHG_DROPPED            0x07
 #define IOERR_ILLEGAL_FIELD           0x08
-#define IOERR_BAD_CONTINUE            0x09
+#define IOERR_RPI_SUSPENDED           0x09
 #define IOERR_TOO_MANY_BUFFERS        0x0A
 #define IOERR_RCV_BUFFER_WAITING      0x0B
 #define IOERR_NO_CONNECTION           0x0C
index 6ccf573..5a3da38 100644 (file)
@@ -4393,6 +4393,7 @@ lpfc_fcp_io_cmd_wqe_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
                if (lpfc_cmd->result == IOERR_INVALID_RPI ||
                    lpfc_cmd->result == IOERR_NO_RESOURCES ||
                    lpfc_cmd->result == IOERR_ABORT_REQUESTED ||
+                   lpfc_cmd->result == IOERR_RPI_SUSPENDED ||
                    lpfc_cmd->result == IOERR_SLER_CMD_RCV_FAILURE) {
                        cmd->result = DID_REQUEUE << 16;
                        break;
@@ -4448,10 +4449,11 @@ lpfc_fcp_io_cmd_wqe_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
 
                lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
                                 "9039 Iodone <%d/%llu> cmd x%px, error "
-                                "x%x SNS x%x x%x Data: x%x x%x\n",
+                                "x%x SNS x%x x%x LBA x%llx Data: x%x x%x\n",
                                 cmd->device->id, cmd->device->lun, cmd,
-                                cmd->result, *lp, *(lp + 3), cmd->retries,
-                                scsi_get_resid(cmd));
+                                cmd->result, *lp, *(lp + 3),
+                                (u64)scsi_get_lba(cmd),
+                                cmd->retries, scsi_get_resid(cmd));
        }
 
        lpfc_update_stats(vport, lpfc_cmd);