mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-05 16:37:50 +00:00
[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>
This commit is contained in:
parent
e340c35372
commit
a1e0063d0c
1 changed files with 7 additions and 1 deletions
|
@ -881,7 +881,13 @@ static int qla4xxx_cmd_wait(struct scsi_qla_host *ha)
|
||||||
/* Find a command that hasn't completed. */
|
/* Find a command that hasn't completed. */
|
||||||
for (index = 0; index < ha->host->can_queue; index++) {
|
for (index = 0; index < ha->host->can_queue; index++) {
|
||||||
cmd = scsi_host_find_tag(ha->host, 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;
|
break;
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&ha->hardware_lock, flags);
|
spin_unlock_irqrestore(&ha->hardware_lock, flags);
|
||||||
|
|
Loading…
Reference in a new issue