Commit 4fc84e9e authored by Alexei Potashnik's avatar Alexei Potashnik Committed by Kamal Mostafa

qla2xxx: Abort stale cmds on qla_tgt_wq when plogi arrives

commit daddf5cf upstream.

cancel any commands from initiator's s_id that are still waiting
on qla_tgt_wq when PLOGI arrives.
Signed-off-by: default avatarAlexei Potashnik <alexei@purestorage.com>
Acked-by: default avatarQuinn Tran <quinn.tran@qlogic.com>
Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: default avatarKamal Mostafa <kamal@canonical.com>
parent 65b2d8f1
......@@ -4061,6 +4061,38 @@ qlt_find_sess_invalidate_other(struct qla_tgt *tgt, uint64_t wwn,
return sess;
}
/* Abort any commands for this s_id waiting on qla_tgt_wq workqueue */
static int abort_cmds_for_s_id(struct scsi_qla_host *vha, port_id_t *s_id)
{
struct qla_tgt_sess_op *op;
struct qla_tgt_cmd *cmd;
uint32_t key;
int count = 0;
key = (((u32)s_id->b.domain << 16) |
((u32)s_id->b.area << 8) |
((u32)s_id->b.al_pa));
spin_lock(&vha->cmd_list_lock);
list_for_each_entry(op, &vha->qla_sess_op_cmd_list, cmd_list) {
uint32_t op_key = sid_to_key(op->atio.u.isp24.fcp_hdr.s_id);
if (op_key == key) {
op->aborted = true;
count++;
}
}
list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) {
uint32_t cmd_key = sid_to_key(cmd->atio.u.isp24.fcp_hdr.s_id);
if (cmd_key == key) {
cmd->state = QLA_TGT_STATE_ABORTED;
count++;
}
}
spin_unlock(&vha->cmd_list_lock);
return count;
}
/*
* ha->hardware_lock supposed to be held on entry. Might drop it, then reaquire
*/
......@@ -4094,6 +4126,9 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha,
switch (iocb->u.isp24.status_subcode) {
case ELS_PLOGI:
/* Mark all stale commands in qla_tgt_wq for deletion */
abort_cmds_for_s_id(vha, &port_id);
if (wwn)
sess = qlt_find_sess_invalidate_other(tgt, wwn,
port_id, loop_id);
......
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