提交 bbead493 编写于 作者: Q Quinn Tran 提交者: Martin K. Petersen

scsi: qla2xxx: Chip reset uses wrong lock during IO flush.

As part of chip reset, all commands from all QPairs are
flushed. This patch fixes code to use Q Pair lock for flush
instead of using old hardware_lock.
Signed-off-by: NQuinn Tran <quinn.tran@cavium.com>
Signed-off-by: NHimanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
上级 d1e3635a
......@@ -1704,25 +1704,21 @@ qla2x00_loop_reset(scsi_qla_host_t *vha)
return QLA_SUCCESS;
}
void
qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
static void
__qla2x00_abort_all_cmds(struct qla_qpair *qp, int res)
{
int que, cnt, status;
int cnt, status;
unsigned long flags;
srb_t *sp;
scsi_qla_host_t *vha = qp->vha;
struct qla_hw_data *ha = vha->hw;
struct req_que *req;
struct qla_tgt *tgt = vha->vha_tgt.qla_tgt;
struct qla_tgt_cmd *cmd;
uint8_t trace = 0;
spin_lock_irqsave(&ha->hardware_lock, flags);
for (que = 0; que < ha->max_req_queues; que++) {
req = ha->req_q_map[que];
if (!req)
continue;
if (!req->outstanding_cmds)
continue;
spin_lock_irqsave(qp->qp_lock_ptr, flags);
req = qp->req;
for (cnt = 1; cnt < req->num_outstanding_cmds; cnt++) {
sp = req->outstanding_cmds[cnt];
if (sp) {
......@@ -1731,11 +1727,11 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
if (sp->type == SRB_NVME_CMD ||
sp->type == SRB_NVME_LS) {
sp_get(sp);
spin_unlock_irqrestore(
&ha->hardware_lock, flags);
spin_unlock_irqrestore(qp->qp_lock_ptr,
flags);
qla_nvme_abort(ha, sp);
spin_lock_irqsave(
&ha->hardware_lock, flags);
spin_lock_irqsave(qp->qp_lock_ptr,
flags);
} else if (GET_CMD_SP(sp) &&
!ha->flags.eeh_busy &&
(!test_bit(ABORT_ISP_ACTIVE,
......@@ -1756,12 +1752,12 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
* result 'res').
*/
sp_get(sp);
spin_unlock_irqrestore(
&ha->hardware_lock, flags);
spin_unlock_irqrestore(qp->qp_lock_ptr,
flags);
status = qla2xxx_eh_abort(
GET_CMD_SP(sp));
spin_lock_irqsave(
&ha->hardware_lock, flags);
spin_lock_irqsave(qp->qp_lock_ptr,
flags);
/*
* Get rid of extra reference
* if immediate exit from
......@@ -1784,13 +1780,27 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
continue;
}
cmd = (struct qla_tgt_cmd *)sp;
qlt_abort_cmd_on_host_reset(cmd->vha,
cmd);
qlt_abort_cmd_on_host_reset(cmd->vha, cmd);
}
}
}
spin_unlock_irqrestore(qp->qp_lock_ptr, flags);
}
void
qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
{
int que;
struct qla_hw_data *ha = vha->hw;
__qla2x00_abort_all_cmds(ha->base_qpair, res);
for (que = 0; que < ha->max_qpairs; que++) {
if (!ha->queue_pair_map[que])
continue;
__qla2x00_abort_all_cmds(ha->queue_pair_map[que], res);
}
spin_unlock_irqrestore(&ha->hardware_lock, flags);
}
static int
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册