Skip to content

Commit e52a8b4

Browse files
alexeipstgNicholas Bellinger
authored andcommitted
qla2xxx: drop cmds/tmrs arrived while session is being deleted
If a new initiator (different WWN) shows up on the same fcport, old initiator's session is scheduled for deletion. But there is a small window between it being marked with QLA_SESS_DELETION_IN_PROGRESS and qlt_unret_sess getting called when new session's commands will keep finding old session in the fcport map. This patch drops cmds/tmrs if they find session in the progress of being deleted. Cc: <stable@vger.kernel.org> # v3.18+ Signed-off-by: Alexei Potashnik <alexei@purestorage.com> Acked-by: Quinn Tran <quinn.tran@qlogic.com> Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
1 parent d20ed91 commit e52a8b4

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

drivers/scsi/qla2xxx/qla_target.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1477,6 +1477,11 @@ static void qlt_24xx_handle_abts(struct scsi_qla_host *vha,
14771477
return;
14781478
}
14791479

1480+
if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) {
1481+
qlt_24xx_send_abts_resp(vha, abts, FCP_TMF_REJECTED, false);
1482+
return;
1483+
}
1484+
14801485
rc = __qlt_24xx_handle_abts(vha, abts, sess);
14811486
if (rc != 0) {
14821487
ql_dbg(ql_dbg_tgt_mgt, vha, 0xf054,
@@ -3768,6 +3773,16 @@ static int qlt_handle_cmd_for_atio(struct scsi_qla_host *vha,
37683773
queue_work(qla_tgt_wq, &op->work);
37693774
return 0;
37703775
}
3776+
3777+
/* Another WWN used to have our s_id. Our PLOGI scheduled its
3778+
* session deletion, but it's still in sess_del_work wq */
3779+
if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) {
3780+
ql_dbg(ql_dbg_io, vha, 0x3061,
3781+
"New command while old session %p is being deleted\n",
3782+
sess);
3783+
return -EFAULT;
3784+
}
3785+
37713786
/*
37723787
* Do kref_get() before returning + dropping qla_hw_data->hardware_lock.
37733788
*/
@@ -3931,6 +3946,9 @@ static int qlt_handle_task_mgmt(struct scsi_qla_host *vha, void *iocb)
39313946
sizeof(struct atio_from_isp));
39323947
}
39333948

3949+
if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS)
3950+
return -EFAULT;
3951+
39343952
return qlt_issue_task_mgmt(sess, unpacked_lun, fn, iocb, 0);
39353953
}
39363954

@@ -5603,6 +5621,11 @@ static void qlt_abort_work(struct qla_tgt *tgt,
56035621
if (!sess)
56045622
goto out_term;
56055623
} else {
5624+
if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) {
5625+
sess = NULL;
5626+
goto out_term;
5627+
}
5628+
56065629
kref_get(&sess->se_sess->sess_kref);
56075630
}
56085631

@@ -5657,6 +5680,11 @@ static void qlt_tmr_work(struct qla_tgt *tgt,
56575680
if (!sess)
56585681
goto out_term;
56595682
} else {
5683+
if (sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) {
5684+
sess = NULL;
5685+
goto out_term;
5686+
}
5687+
56605688
kref_get(&sess->se_sess->sess_kref);
56615689
}
56625690

0 commit comments

Comments
 (0)