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 <wenxiong@xxxxxxxxxxxxxxxxxx> --- 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html