Commit 170babc3 authored by Mike Christie's avatar Mike Christie Committed by James Bottomley

[SCSI] qla2xxx: Drop srb reference before waiting for completion.

This patch fixes a regression introduced by commit
083a469d

qla2xxx_eh_wait_on_command() is waiting for an srb to
complete, which will never happen as the routine took
a reference to the srb previously and will only drop it
after this function. So every command abort will fail.
Signed-off-by: default avatarMike Christie <michaelc@cs.wisc.edu>
Signed-off-by: default avatarGiridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: default avatarMadhuranath Iyengar <Madhu.Iyengar@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent e30d1756
...@@ -830,62 +830,44 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) ...@@ -830,62 +830,44 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
{ {
scsi_qla_host_t *vha = shost_priv(cmd->device->host); scsi_qla_host_t *vha = shost_priv(cmd->device->host);
srb_t *sp; srb_t *sp;
int ret, i; int ret;
unsigned int id, lun; unsigned int id, lun;
unsigned long flags; unsigned long flags;
int wait = 0; int wait = 0;
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
struct req_que *req = vha->req;
srb_t *spt;
int got_ref = 0;
fc_block_scsi_eh(cmd); fc_block_scsi_eh(cmd);
if (!CMD_SP(cmd)) if (!CMD_SP(cmd))
return SUCCESS; return SUCCESS;
ret = SUCCESS;
id = cmd->device->id; id = cmd->device->id;
lun = cmd->device->lun; lun = cmd->device->lun;
spt = (srb_t *) CMD_SP(cmd);
if (!spt)
return SUCCESS;
/* Check active list for command command. */
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&ha->hardware_lock, flags);
for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) { sp = (srb_t *) CMD_SP(cmd);
sp = req->outstanding_cmds[i]; if (!sp) {
spin_unlock_irqrestore(&ha->hardware_lock, flags);
if (sp == NULL) return SUCCESS;
continue; }
if ((sp->ctx) && !(sp->flags & SRB_FCP_CMND_DMA_VALID) &&
!IS_PROT_IO(sp))
continue;
if (sp->cmd != cmd)
continue;
DEBUG2(printk("%s(%ld): aborting sp %p from RISC.", DEBUG2(printk("%s(%ld): aborting sp %p from RISC.",
__func__, vha->host_no, sp)); __func__, vha->host_no, sp));
/* Get a reference to the sp and drop the lock.*/ /* Get a reference to the sp and drop the lock.*/
sp_get(sp); sp_get(sp);
got_ref++;
spin_unlock_irqrestore(&ha->hardware_lock, flags);
if (ha->isp_ops->abort_command(sp)) {
DEBUG2(printk("%s(%ld): abort_command "
"mbx failed.\n", __func__, vha->host_no));
ret = FAILED;
} else {
DEBUG3(printk("%s(%ld): abort_command "
"mbx success.\n", __func__, vha->host_no));
wait = 1;
}
spin_lock_irqsave(&ha->hardware_lock, flags);
break;
}
spin_unlock_irqrestore(&ha->hardware_lock, flags); spin_unlock_irqrestore(&ha->hardware_lock, flags);
if (ha->isp_ops->abort_command(sp)) {
DEBUG2(printk("%s(%ld): abort_command "
"mbx failed.\n", __func__, vha->host_no));
ret = FAILED;
} else {
DEBUG3(printk("%s(%ld): abort_command "
"mbx success.\n", __func__, vha->host_no));
wait = 1;
}
qla2x00_sp_compl(ha, sp);
/* Wait for the command to be returned. */ /* Wait for the command to be returned. */
if (wait) { if (wait) {
...@@ -897,9 +879,6 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd) ...@@ -897,9 +879,6 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
} }
} }
if (got_ref)
qla2x00_sp_compl(ha, sp);
qla_printk(KERN_INFO, ha, qla_printk(KERN_INFO, ha,
"scsi(%ld:%d:%d): Abort command issued -- %d %x.\n", "scsi(%ld:%d:%d): Abort command issued -- %d %x.\n",
vha->host_no, id, lun, wait, ret); vha->host_no, id, lun, wait, ret);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment