Fix scsi_send_eh_cmnd to check the return code of queuecommand when
sending commands and retry for a bit if the LLDD returns a busy response.
This fixes an issue seen with the ipr driver where an ipr initiated reset
immediately following an eh_host_reset caused EH initiated commands to fail,
resulting in devices being taken offline. This patch resolves the issue.

Signed-off-by: Wen Xiong <wenxi...@linux.vnet.ibm.com>

---
 drivers/scsi/scsi_error.c |   10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

Index: b/drivers/scsi/scsi_error.c
===================================================================
--- a/drivers/scsi/scsi_error.c 2013-04-10 12:55:57.000000000 -0500
+++ b/drivers/scsi/scsi_error.c 2013-04-10 13:04:12.467858487 -0500
@@ -793,6 +793,7 @@ static int scsi_send_eh_cmnd(struct scsi
        DECLARE_COMPLETION_ONSTACK(done);
        unsigned long timeleft;
        struct scsi_eh_save ses;
+       int attempts = 30;
        int rtn;
 
        scsi_eh_prep_cmnd(scmd, &ses, cmnd, cmnd_size, sense_bytes);
@@ -800,7 +801,14 @@ static int scsi_send_eh_cmnd(struct scsi
 
        scsi_log_send(scmd);
        scmd->scsi_done = scsi_eh_done;
-       shost->hostt->queuecommand(shost, scmd);
+
+       while ((rtn = shost->hostt->queuecommand(shost, scmd)) && attempts) {
+               if (rtn == SCSI_MLQUEUE_DEVICE_BUSY ||
+                   rtn == SCSI_MLQUEUE_TARGET_BUSY ||
+                   rtn == SCSI_MLQUEUE_HOST_BUSY)
+                       attempts--;
+               ssleep(1);
+       }
 
        timeleft = wait_for_completion_timeout(&done, timeout);
 

-- 
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to