summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Christie <michaelc@cs.wisc.edu>2010-10-26 05:45:30 -0700
committerJames Bottomley <James.Bottomley@suse.de>2010-10-26 11:16:56 -0500
commita1e0063d0c015145946981262f8d5f9758d8a895 (patch)
treed44f9702da82f9d99cf03238b8a91e0f6ba606d1
parente340c3537239d5b6a2b21d4245c8577d457b0476 (diff)
downloadlinux-a1e0063d0c015145946981262f8d5f9758d8a895.tar.gz
linux-a1e0063d0c015145946981262f8d5f9758d8a895.tar.bz2
linux-a1e0063d0c015145946981262f8d5f9758d8a895.zip
[SCSI] qla4xxx: Fix cmd check in qla4xxx_cmd_wait
If the command has timedout then the block layer has called blk_mark_rq_complete. If qla4xxx_cmd_wait is then called from qla4xxx_eh_host_reset, we will always fail, because if the driver calls scsi_done then the the block layer will fail at blk_complete_request's blk_mark_rq_complete call instead of calling the normal completion path including the function, blk_queue_end_tag, which releases the tag. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: Vikas Chaudhary <vikas.chaudhary@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
-rw-r--r--drivers/scsi/qla4xxx/ql4_os.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
index f1c58eb26ba2..f4cd846abf6d 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -881,7 +881,13 @@ static int qla4xxx_cmd_wait(struct scsi_qla_host *ha)
/* Find a command that hasn't completed. */
for (index = 0; index < ha->host->can_queue; index++) {
cmd = scsi_host_find_tag(ha->host, index);
- if (cmd != NULL)
+ /*
+ * We cannot just check if the index is valid,
+ * becase if we are run from the scsi eh, then
+ * the scsi/block layer is going to prevent
+ * the tag from being released.
+ */
+ if (cmd != NULL && CMD_SP(cmd))
break;
}
spin_unlock_irqrestore(&ha->hardware_lock, flags);