]> git.itanic.dy.fi Git - linux-stable/commitdiff
scsi: lpfc: Return DID_TRANSPORT_DISRUPTED instead of DID_REQUEUE
authorHannes Reinecke <hare@suse.de>
Wed, 24 Aug 2022 06:00:33 +0000 (08:00 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 23 Sep 2022 12:15:50 +0000 (14:15 +0200)
[ Upstream commit c0a50cd389c3ed54831e240023dd12bafa56b3a6 ]

When the driver hits an internal error condition returning DID_REQUEUE the
I/O will be retried on the same ITL nexus.  This will inhibit multipathing,
resulting in endless retries even if the error could have been resolved by
using a different ITL nexus.  Return DID_TRANSPORT_DISRUPTED to allow for
multipath to engage and route I/O to another ITL nexus.

Link: https://lore.kernel.org/r/20220824060033.138661-1-hare@suse.de
Reviewed-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/lpfc/lpfc_scsi.c

index 7da8e4c845df8bdba0cac227c0c518530d77ee59..41313fcaf84a33cda294f5194ae5b8da3748e133 100644 (file)
@@ -4278,7 +4278,7 @@ lpfc_fcp_io_cmd_wqe_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
                    lpfc_cmd->result == IOERR_NO_RESOURCES ||
                    lpfc_cmd->result == IOERR_ABORT_REQUESTED ||
                    lpfc_cmd->result == IOERR_SLER_CMD_RCV_FAILURE) {
-                       cmd->result = DID_REQUEUE << 16;
+                       cmd->result = DID_TRANSPORT_DISRUPTED << 16;
                        break;
                }
                if ((lpfc_cmd->result == IOERR_RX_DMA_FAILED ||
@@ -4567,7 +4567,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
                            lpfc_cmd->result == IOERR_NO_RESOURCES ||
                            lpfc_cmd->result == IOERR_ABORT_REQUESTED ||
                            lpfc_cmd->result == IOERR_SLER_CMD_RCV_FAILURE) {
-                               cmd->result = DID_REQUEUE << 16;
+                               cmd->result = DID_TRANSPORT_DISRUPTED << 16;
                                break;
                        }
                        if ((lpfc_cmd->result == IOERR_RX_DMA_FAILED ||