Skip to content

Commit 5d3148d

Browse files
Quinn Tranmartinkpetersen
authored andcommitted
scsi: qla2xxx: Fix TMF leak through
Task management can retry up to 5 times when FW resource becomes bottle neck. Between the retries, there is a short sleep. Current code assumes the chip has not reset or session has not changed. Check for chip reset or session change before sending Task management. Cc: stable@vger.kernel.org Fixes: 9803fb5 ("scsi: qla2xxx: Fix task management cmd failure") Signed-off-by: Quinn Tran <qutran@marvell.com> Signed-off-by: Nilesh Javali <njavali@marvell.com> Link: https://lore.kernel.org/r/20230714070104.40052-9-njavali@marvell.com Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent 8ebaa45 commit 5d3148d

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

drivers/scsi/qla2xxx/qla_init.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2038,10 +2038,14 @@ static void qla_marker_sp_done(srb_t *sp, int res)
20382038
complete(&tmf->u.tmf.comp);
20392039
}
20402040

2041-
#define START_SP_W_RETRIES(_sp, _rval) \
2041+
#define START_SP_W_RETRIES(_sp, _rval, _chip_gen, _login_gen) \
20422042
{\
20432043
int cnt = 5; \
20442044
do { \
2045+
if (_chip_gen != sp->vha->hw->chip_reset || _login_gen != sp->fcport->login_gen) {\
2046+
_rval = EINVAL; \
2047+
break; \
2048+
} \
20452049
_rval = qla2x00_start_sp(_sp); \
20462050
if (_rval == EAGAIN) \
20472051
msleep(1); \
@@ -2064,6 +2068,7 @@ qla26xx_marker(struct tmf_arg *arg)
20642068
srb_t *sp;
20652069
int rval = QLA_FUNCTION_FAILED;
20662070
fc_port_t *fcport = arg->fcport;
2071+
u32 chip_gen, login_gen;
20672072

20682073
if (TMF_NOT_READY(arg->fcport)) {
20692074
ql_dbg(ql_dbg_taskm, vha, 0x8039,
@@ -2073,6 +2078,9 @@ qla26xx_marker(struct tmf_arg *arg)
20732078
return QLA_SUSPENDED;
20742079
}
20752080

2081+
chip_gen = vha->hw->chip_reset;
2082+
login_gen = fcport->login_gen;
2083+
20762084
/* ref: INIT */
20772085
sp = qla2xxx_get_qpair_sp(vha, arg->qpair, fcport, GFP_KERNEL);
20782086
if (!sp)
@@ -2090,7 +2098,7 @@ qla26xx_marker(struct tmf_arg *arg)
20902098
tm_iocb->u.tmf.loop_id = fcport->loop_id;
20912099
tm_iocb->u.tmf.vp_index = vha->vp_idx;
20922100

2093-
START_SP_W_RETRIES(sp, rval);
2101+
START_SP_W_RETRIES(sp, rval, chip_gen, login_gen);
20942102

20952103
ql_dbg(ql_dbg_taskm, vha, 0x8006,
20962104
"Async-marker hdl=%x loop-id=%x portid=%06x modifier=%x lun=%lld qp=%d rval %d.\n",
@@ -2159,6 +2167,9 @@ __qla2x00_async_tm_cmd(struct tmf_arg *arg)
21592167
return QLA_SUSPENDED;
21602168
}
21612169

2170+
chip_gen = vha->hw->chip_reset;
2171+
login_gen = fcport->login_gen;
2172+
21622173
/* ref: INIT */
21632174
sp = qla2xxx_get_qpair_sp(vha, arg->qpair, fcport, GFP_KERNEL);
21642175
if (!sp)
@@ -2176,7 +2187,7 @@ __qla2x00_async_tm_cmd(struct tmf_arg *arg)
21762187
tm_iocb->u.tmf.flags = arg->flags;
21772188
tm_iocb->u.tmf.lun = arg->lun;
21782189

2179-
START_SP_W_RETRIES(sp, rval);
2190+
START_SP_W_RETRIES(sp, rval, chip_gen, login_gen);
21802191

21812192
ql_dbg(ql_dbg_taskm, vha, 0x802f,
21822193
"Async-tmf hdl=%x loop-id=%x portid=%06x ctrl=%x lun=%lld qp=%d rval=%x.\n",
@@ -2195,9 +2206,6 @@ __qla2x00_async_tm_cmd(struct tmf_arg *arg)
21952206
}
21962207

21972208
if (!test_bit(UNLOADING, &vha->dpc_flags) && !IS_QLAFX00(vha->hw)) {
2198-
chip_gen = vha->hw->chip_reset;
2199-
login_gen = fcport->login_gen;
2200-
22012209
jif = jiffies;
22022210
if (qla_tmf_wait(arg)) {
22032211
ql_log(ql_log_info, vha, 0x803e,

0 commit comments

Comments
 (0)