Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+20 −41
Original line number Diff line number Diff line
@@ -830,47 +830,32 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
{
	scsi_qla_host_t *vha = shost_priv(cmd->device->host);
	srb_t *sp;
	int ret, i;
	int ret;
	unsigned int id, lun;
	unsigned long flags;
	int wait = 0;
	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);

	if (!CMD_SP(cmd))
		return SUCCESS;

	ret = SUCCESS;

	id = cmd->device->id;
	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);
	for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) {
		sp = req->outstanding_cmds[i];

		if (sp == NULL)
			continue;
		if ((sp->ctx) && !(sp->flags & SRB_FCP_CMND_DMA_VALID) &&
		    !IS_PROT_IO(sp))
			continue;
		if (sp->cmd != cmd)
			continue;
	sp = (srb_t *) CMD_SP(cmd);
	if (!sp) {
		spin_unlock_irqrestore(&ha->hardware_lock, flags);
		return SUCCESS;
	}

	DEBUG2(printk("%s(%ld): aborting sp %p from RISC.",
	    __func__, vha->host_no, sp));

	/* Get a reference to the sp and drop the lock.*/
	sp_get(sp);
		got_ref++;

	spin_unlock_irqrestore(&ha->hardware_lock, flags);
	if (ha->isp_ops->abort_command(sp)) {
@@ -882,10 +867,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
		"mbx success.\n", __func__, vha->host_no));
		wait = 1;
	}
		spin_lock_irqsave(&ha->hardware_lock, flags);
		break;
	}
	spin_unlock_irqrestore(&ha->hardware_lock, flags);
	qla2x00_sp_compl(ha, sp);

	/* Wait for the command to be returned. */
	if (wait) {
@@ -897,9 +879,6 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
		}
	}

	if (got_ref)
		qla2x00_sp_compl(ha, sp);

	qla_printk(KERN_INFO, ha,
	    "scsi(%ld:%d:%d): Abort command issued -- %d %x.\n",
	    vha->host_no, id, lun, wait, ret);