scsi: scsi_dh_alua: Return BLK_STS_AGAIN for ALUA transitioning state
authorHannes Reinecke <hare@suse.de>
Wed, 30 Sep 2020 08:02:54 +0000 (10:02 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 11 Nov 2020 03:58:12 +0000 (22:58 -0500)
When the ALUA state indicates transitioning we should not retry the command
immediately, but rather complete the command with BLK_STS_AGAIN to signal
the completion handler that it might be retried.  This allows multipathing
to redirect the command to another path if possible, and avoid stalls
during lengthy transitioning times.

Link: https://lore.kernel.org/r/20200930080256.90964-3-hare@suse.de
Reviewed-by: Ewan D. Milne <emilne@redhat.com>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/device_handler/scsi_dh_alua.c
drivers/scsi/scsi_lib.c

index f32da0ca529e004f448c6f9803b9c57b145a6609..9e8d32d01d911eaa4793b0c1dafc83fb0885d8e4 100644 (file)
@@ -1091,7 +1091,7 @@ static blk_status_t alua_prep_fn(struct scsi_device *sdev, struct request *req)
        case SCSI_ACCESS_STATE_LBA:
                return BLK_STS_OK;
        case SCSI_ACCESS_STATE_TRANSITIONING:
-               return BLK_STS_RESOURCE;
+               return BLK_STS_AGAIN;
        default:
                req->rq_flags |= RQF_QUIET;
                return BLK_STS_IOERR;
index 20a357563d3dd4fb44a66bcab9dfe375999b9560..7691196f288cdd088043b6c45b98da6afb8802e9 100644 (file)
@@ -1707,6 +1707,11 @@ out_put_budget:
                    scsi_device_blocked(sdev))
                        ret = BLK_STS_DEV_RESOURCE;
                break;
+       case BLK_STS_AGAIN:
+               scsi_req(req)->result = DID_BUS_BUSY << 16;
+               if (req->rq_flags & RQF_DONTPREP)
+                       scsi_mq_uninit_cmd(cmd);
+               break;
        default:
                if (unlikely(!scsi_device_online(sdev)))
                        scsi_req(req)->result = DID_NO_CONNECT << 16;