mirror of https://gitee.com/openkylin/linux.git
[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
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue