> -----Original Message----- > From: Mike Christie <michael.christie@xxxxxxxxxx> > Sent: Sunday, April 11, 2021 12:10 AM > To: lduncan@xxxxxxxx; martin.petersen@xxxxxxxxxx; Manish Rangankar > <mrangankar@xxxxxxxxxxx>; Santosh Vernekar <svernekar@xxxxxxxxxxx>; > linux-scsi@xxxxxxxxxxxxxxx; jejb@xxxxxxxxxxxxx > Cc: Mike Christie <michael.christie@xxxxxxxxxx> > Subject: [EXT] [PATCH 06/13] scsi: qedi: fix tmf tid allocation > > External Email > > ---------------------------------------------------------------------- > qedi_iscsi_abort_work and qedi_tmf_work allocates a tid then calls > qedi_send_iscsi_tmf which also allcoates a tid. This removes the tid allocation > from the callers. > > Signed-off-by: Mike Christie <michael.christie@xxxxxxxxxx> > --- > drivers/scsi/qedi/qedi_fw.c | 76 ++++++++++------------------------ > drivers/scsi/qedi/qedi_gbl.h | 3 +- > drivers/scsi/qedi/qedi_iscsi.c | 2 +- > 3 files changed, 25 insertions(+), 56 deletions(-) > > diff --git a/drivers/scsi/qedi/qedi_fw.c b/drivers/scsi/qedi/qedi_fw.c index > c5699421ec37..542255c94d96 100644 > --- a/drivers/scsi/qedi/qedi_fw.c > +++ b/drivers/scsi/qedi/qedi_fw.c > @@ -14,8 +14,8 @@ > #include "qedi_fw_iscsi.h" > #include "qedi_fw_scsi.h" > > -static int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, > - struct iscsi_task *mtask); > +static int send_iscsi_tmf(struct qedi_conn *qedi_conn, > + struct iscsi_task *mtask); > > void qedi_iscsi_unmap_sg_list(struct qedi_cmd *cmd) { @@ -1350,7 +1350,7 > @@ static int qedi_wait_for_cleanup_request(struct qedi_ctx *qedi, > return 0; > } > > -static void qedi_tmf_work(struct work_struct *work) > +static void qedi_abort_work(struct work_struct *work) > { > struct qedi_cmd *qedi_cmd = > container_of(work, struct qedi_cmd, tmf_work); @@ -1363,7 > +1363,6 @@ static void qedi_tmf_work(struct work_struct *work) > struct iscsi_task *ctask; > struct iscsi_tm *tmf_hdr; > s16 rval = 0; > - s16 tid = 0; > > mtask = qedi_cmd->task; > tmf_hdr = (struct iscsi_tm *)mtask->hdr; @@ -1404,6 +1403,7 @@ > static void qedi_tmf_work(struct work_struct *work) > } > > qedi_cmd->type = TYPEIO; > + qedi_cmd->state = CLEANUP_WAIT; > list_work->qedi_cmd = qedi_cmd; > list_work->rtid = cmd->task_id; > list_work->state = QEDI_WORK_SCHEDULED; @@ -1430,15 +1430,7 > @@ static void qedi_tmf_work(struct work_struct *work) > goto ldel_exit; > } > > - tid = qedi_get_task_idx(qedi); > - if (tid == -1) { > - QEDI_ERR(&qedi->dbg_ctx, "Invalid tid, cid=0x%x\n", > - qedi_conn->iscsi_conn_id); > - goto ldel_exit; > - } > - > - qedi_cmd->task_id = tid; > - qedi_send_iscsi_tmf(qedi_conn, qedi_cmd->task); > + send_iscsi_tmf(qedi_conn, qedi_cmd->task); > > put_task: > iscsi_put_task(ctask); > @@ -1468,8 +1460,7 @@ static void qedi_tmf_work(struct work_struct *work) > clear_bit(QEDI_CONN_FW_CLEANUP, &qedi_conn->flags); } > > -static int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, > - struct iscsi_task *mtask) > +static int send_iscsi_tmf(struct qedi_conn *qedi_conn, struct > +iscsi_task *mtask) > { > struct iscsi_tmf_request_hdr tmf_pdu_header; > struct iscsi_task_params task_params; > @@ -1484,7 +1475,6 @@ static int qedi_send_iscsi_tmf(struct qedi_conn > *qedi_conn, > u32 scsi_lun[2]; > s16 tid = 0; > u16 sq_idx = 0; > - int rval = 0; > > tmf_hdr = (struct iscsi_tm *)mtask->hdr; > qedi_cmd = (struct qedi_cmd *)mtask->dd_data; @@ -1548,10 +1538,7 > @@ static int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, > task_params.sqe = &ep->sq[sq_idx]; > > memset(task_params.sqe, 0, sizeof(struct iscsi_wqe)); > - rval = init_initiator_tmf_request_task(&task_params, > - &tmf_pdu_header); > - if (rval) > - return -1; > + init_initiator_tmf_request_task(&task_params, &tmf_pdu_header); > > spin_lock(&qedi_conn->list_lock); > list_add_tail(&qedi_cmd->io_cmd, &qedi_conn->active_cmd_list); @@ - > 1563,47 +1550,30 @@ static int qedi_send_iscsi_tmf(struct qedi_conn > *qedi_conn, > return 0; > } > > -int qedi_iscsi_abort_work(struct qedi_conn *qedi_conn, > - struct iscsi_task *mtask) > +int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, struct iscsi_task > +*mtask) > { > + struct iscsi_tm *tmf_hdr = (struct iscsi_tm *)mtask->hdr; > + struct qedi_cmd *qedi_cmd = mtask->dd_data; > struct qedi_ctx *qedi = qedi_conn->qedi; > - struct iscsi_tm *tmf_hdr; > - struct qedi_cmd *qedi_cmd = (struct qedi_cmd *)mtask->dd_data; > - s16 tid = 0; > + int rc = 0; > > - tmf_hdr = (struct iscsi_tm *)mtask->hdr; > - qedi_cmd->task = mtask; > - > - /* If abort task then schedule the work and return */ > - if ((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) == > - ISCSI_TM_FUNC_ABORT_TASK) { > - qedi_cmd->state = CLEANUP_WAIT; > - INIT_WORK(&qedi_cmd->tmf_work, qedi_tmf_work); > + switch (tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) { > + case ISCSI_TM_FUNC_ABORT_TASK: > + INIT_WORK(&qedi_cmd->tmf_work, qedi_abort_work); > queue_work(qedi->tmf_thread, &qedi_cmd->tmf_work); > - > - } else if (((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) == > - ISCSI_TM_FUNC_LOGICAL_UNIT_RESET) || > - ((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) == > - ISCSI_TM_FUNC_TARGET_WARM_RESET) || > - ((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) == > - ISCSI_TM_FUNC_TARGET_COLD_RESET)) { > - tid = qedi_get_task_idx(qedi); > - if (tid == -1) { > - QEDI_ERR(&qedi->dbg_ctx, "Invalid tid, cid=0x%x\n", > - qedi_conn->iscsi_conn_id); > - return -1; > - } > - qedi_cmd->task_id = tid; > - > - qedi_send_iscsi_tmf(qedi_conn, qedi_cmd->task); > - > - } else { > + break; > + case ISCSI_TM_FUNC_LOGICAL_UNIT_RESET: > + case ISCSI_TM_FUNC_TARGET_WARM_RESET: > + case ISCSI_TM_FUNC_TARGET_COLD_RESET: > + rc = send_iscsi_tmf(qedi_conn, mtask); > + break; > + default: > QEDI_ERR(&qedi->dbg_ctx, "Invalid tmf, cid=0x%x\n", > qedi_conn->iscsi_conn_id); > - return -1; > + return -EINVAL; > } > > - return 0; > + return rc; > } > > int qedi_send_iscsi_text(struct qedi_conn *qedi_conn, diff --git > a/drivers/scsi/qedi/qedi_gbl.h b/drivers/scsi/qedi/qedi_gbl.h index > 116645c08c71..fb44a282613e 100644 > --- a/drivers/scsi/qedi/qedi_gbl.h > +++ b/drivers/scsi/qedi/qedi_gbl.h > @@ -31,8 +31,7 @@ int qedi_send_iscsi_login(struct qedi_conn *qedi_conn, > struct iscsi_task *task); > int qedi_send_iscsi_logout(struct qedi_conn *qedi_conn, > struct iscsi_task *task); > -int qedi_iscsi_abort_work(struct qedi_conn *qedi_conn, > - struct iscsi_task *mtask); > +int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn, struct iscsi_task > +*mtask); > int qedi_send_iscsi_text(struct qedi_conn *qedi_conn, > struct iscsi_task *task); > int qedi_send_iscsi_nopout(struct qedi_conn *qedi_conn, diff --git > a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c index > d1da34a938da..821225f9beb0 100644 > --- a/drivers/scsi/qedi/qedi_iscsi.c > +++ b/drivers/scsi/qedi/qedi_iscsi.c > @@ -742,7 +742,7 @@ static int qedi_iscsi_send_generic_request(struct > iscsi_task *task) > rc = qedi_send_iscsi_logout(qedi_conn, task); > break; > case ISCSI_OP_SCSI_TMFUNC: > - rc = qedi_iscsi_abort_work(qedi_conn, task); > + rc = qedi_send_iscsi_tmf(qedi_conn, task); > break; > case ISCSI_OP_TEXT: > rc = qedi_send_iscsi_text(qedi_conn, task); > -- > 2.25.1 Thanks, Reviewed-by: Manish Rangankar <mrangankar@xxxxxxxxxxx>