diff options
author | Mike Christie <michaelc@cs.wisc.edu> | 2010-10-26 08:45:30 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-10-26 12:16:56 -0400 |
commit | a1e0063d0c015145946981262f8d5f9758d8a895 (patch) | |
tree | d44f9702da82f9d99cf03238b8a91e0f6ba606d1 | |
parent | e340c3537239d5b6a2b21d4245c8577d457b0476 (diff) |
[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.c | 8 |
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) | |||
881 | /* Find a command that hasn't completed. */ | 881 | /* Find a command that hasn't completed. */ |
882 | for (index = 0; index < ha->host->can_queue; index++) { | 882 | for (index = 0; index < ha->host->can_queue; index++) { |
883 | cmd = scsi_host_find_tag(ha->host, index); | 883 | cmd = scsi_host_find_tag(ha->host, index); |
884 | if (cmd != NULL) | 884 | /* |
885 | * We cannot just check if the index is valid, | ||
886 | * becase if we are run from the scsi eh, then | ||
887 | * the scsi/block layer is going to prevent | ||
888 | * the tag from being released. | ||
889 | */ | ||
890 | if (cmd != NULL && CMD_SP(cmd)) | ||
885 | break; | 891 | break; |
886 | } | 892 | } |
887 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 893 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |