|
Hannes Reinecke |
3b5f14 |
From: Quinn Tran <quinn.tran@cavium.com>
|
|
Hannes Reinecke |
3b5f14 |
Date: Tue, 1 May 2018 09:01:53 -0700
|
|
Hannes Reinecke |
3b5f14 |
Subject: [PATCH] scsi: qla2xxx: Fix TMF and Multi-Queue config
|
|
Hannes Reinecke |
3b5f14 |
References: bsc#1086327,FATE#324903
|
|
Hannes Reinecke |
3b5f14 |
Git-commit: 84905dfe78d28b597a1c991bfc05722a8fba1184
|
|
Hannes Reinecke |
3b5f14 |
Patch-mainline: v4.18-rc1
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
For target mode, task management command is queued to specific cpu base
|
|
Hannes Reinecke |
3b5f14 |
on where the SCSI command is residing. This prevent race condition of
|
|
Hannes Reinecke |
3b5f14 |
task management command getting ahead of regular scsi command.
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
|
|
Hannes Reinecke |
3b5f14 |
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
|
|
Hannes Reinecke |
3b5f14 |
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
|
|
Hannes Reinecke |
3b5f14 |
Signed-off-by: Hannes Reinecke <hare@suse.de>
|
|
Hannes Reinecke |
3b5f14 |
---
|
|
Hannes Reinecke |
3b5f14 |
drivers/scsi/qla2xxx/qla_target.c | 135 ++++++++++++++++++++++++++++++-------
|
|
Hannes Reinecke |
3b5f14 |
drivers/scsi/qla2xxx/qla_target.h | 4 +-
|
|
Hannes Reinecke |
3b5f14 |
drivers/scsi/qla2xxx/tcm_qla2xxx.c | 27 ++++++++
|
|
Hannes Reinecke |
3b5f14 |
3 files changed, 141 insertions(+), 25 deletions(-)
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
|
|
Hannes Reinecke |
3b5f14 |
index 9186f8d0b271..7d9aba6a88a1 100644
|
|
Hannes Reinecke |
3b5f14 |
--- a/drivers/scsi/qla2xxx/qla_target.c
|
|
Hannes Reinecke |
3b5f14 |
+++ b/drivers/scsi/qla2xxx/qla_target.c
|
|
Hannes Reinecke |
3b5f14 |
@@ -1924,13 +1924,84 @@ static void abort_cmds_for_lun(struct scsi_qla_host *vha,
|
|
Hannes Reinecke |
3b5f14 |
spin_unlock_irqrestore(&vha->cmd_list_lock, flags);
|
|
Hannes Reinecke |
3b5f14 |
}
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
+static struct qla_qpair_hint *qlt_find_qphint(struct scsi_qla_host *vha,
|
|
Hannes Reinecke |
3b5f14 |
+ uint64_t unpacked_lun)
|
|
Hannes Reinecke |
3b5f14 |
+{
|
|
Hannes Reinecke |
3b5f14 |
+ struct qla_tgt *tgt = vha->vha_tgt.qla_tgt;
|
|
Hannes Reinecke |
3b5f14 |
+ struct qla_qpair_hint *h = NULL;
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+ if (vha->flags.qpairs_available) {
|
|
Hannes Reinecke |
3b5f14 |
+ h = btree_lookup64(&tgt->lun_qpair_map, unpacked_lun);
|
|
Hannes Reinecke |
3b5f14 |
+ if (!h)
|
|
Hannes Reinecke |
3b5f14 |
+ h = &tgt->qphints[0];
|
|
Hannes Reinecke |
3b5f14 |
+ } else {
|
|
Hannes Reinecke |
3b5f14 |
+ h = &tgt->qphints[0];
|
|
Hannes Reinecke |
3b5f14 |
+ }
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+ return h;
|
|
Hannes Reinecke |
3b5f14 |
+}
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+static void qlt_do_tmr_work(struct work_struct *work)
|
|
Hannes Reinecke |
3b5f14 |
+{
|
|
Hannes Reinecke |
3b5f14 |
+ struct qla_tgt_mgmt_cmd *mcmd =
|
|
Hannes Reinecke |
3b5f14 |
+ container_of(work, struct qla_tgt_mgmt_cmd, work);
|
|
Hannes Reinecke |
3b5f14 |
+ struct qla_hw_data *ha = mcmd->vha->hw;
|
|
Hannes Reinecke |
3b5f14 |
+ int rc = EIO;
|
|
Hannes Reinecke |
3b5f14 |
+ uint32_t tag;
|
|
Hannes Reinecke |
3b5f14 |
+ unsigned long flags;
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+ switch (mcmd->tmr_func) {
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_ABTS:
|
|
Hannes Reinecke |
3b5f14 |
+ tag = mcmd->orig_iocb.abts.exchange_addr_to_abort;
|
|
Hannes Reinecke |
3b5f14 |
+ break;
|
|
Hannes Reinecke |
3b5f14 |
+ default:
|
|
Hannes Reinecke |
3b5f14 |
+ tag = 0;
|
|
Hannes Reinecke |
3b5f14 |
+ break;
|
|
Hannes Reinecke |
3b5f14 |
+ }
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+ rc = ha->tgt.tgt_ops->handle_tmr(mcmd, mcmd->unpacked_lun,
|
|
Hannes Reinecke |
3b5f14 |
+ mcmd->tmr_func, tag);
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+ if (rc != 0) {
|
|
Hannes Reinecke |
3b5f14 |
+ spin_lock_irqsave(mcmd->qpair->qp_lock_ptr, flags);
|
|
Hannes Reinecke |
3b5f14 |
+ switch (mcmd->tmr_func) {
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_ABTS:
|
|
Hannes Reinecke |
3b5f14 |
+ qlt_24xx_send_abts_resp(mcmd->qpair,
|
|
Hannes Reinecke |
3b5f14 |
+ &mcmd->orig_iocb.abts,
|
|
Hannes Reinecke |
3b5f14 |
+ FCP_TMF_REJECTED, false);
|
|
Hannes Reinecke |
3b5f14 |
+ break;
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_LUN_RESET:
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_CLEAR_TS:
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_ABORT_TS:
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_CLEAR_ACA:
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_TARGET_RESET:
|
|
Hannes Reinecke |
3b5f14 |
+ qlt_send_busy(mcmd->qpair, &mcmd->orig_iocb.atio,
|
|
Hannes Reinecke |
3b5f14 |
+ qla_sam_status);
|
|
Hannes Reinecke |
3b5f14 |
+ break;
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_ABORT_ALL:
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_NEXUS_LOSS_SESS:
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_NEXUS_LOSS:
|
|
Hannes Reinecke |
3b5f14 |
+ qlt_send_notify_ack(mcmd->qpair,
|
|
Hannes Reinecke |
3b5f14 |
+ &mcmd->orig_iocb.imm_ntfy, 0, 0, 0, 0, 0, 0);
|
|
Hannes Reinecke |
3b5f14 |
+ break;
|
|
Hannes Reinecke |
3b5f14 |
+ }
|
|
Hannes Reinecke |
3b5f14 |
+ spin_unlock_irqrestore(mcmd->qpair->qp_lock_ptr, flags);
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+ ql_dbg(ql_dbg_tgt_mgt, mcmd->vha, 0xf052,
|
|
Hannes Reinecke |
3b5f14 |
+ "qla_target(%d): tgt_ops->handle_tmr() failed: %d\n",
|
|
Hannes Reinecke |
3b5f14 |
+ mcmd->vha->vp_idx, rc);
|
|
Hannes Reinecke |
3b5f14 |
+ mempool_free(mcmd, qla_tgt_mgmt_cmd_mempool);
|
|
Hannes Reinecke |
3b5f14 |
+ }
|
|
Hannes Reinecke |
3b5f14 |
+}
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
/* ha->hardware_lock supposed to be held on entry */
|
|
Hannes Reinecke |
3b5f14 |
static int __qlt_24xx_handle_abts(struct scsi_qla_host *vha,
|
|
Hannes Reinecke |
3b5f14 |
struct abts_recv_from_24xx *abts, struct fc_port *sess)
|
|
Hannes Reinecke |
3b5f14 |
{
|
|
Hannes Reinecke |
3b5f14 |
struct qla_hw_data *ha = vha->hw;
|
|
Hannes Reinecke |
3b5f14 |
struct qla_tgt_mgmt_cmd *mcmd;
|
|
Hannes Reinecke |
3b5f14 |
- int rc;
|
|
Hannes Reinecke |
3b5f14 |
+ struct qla_qpair_hint *h = &vha->vha_tgt.qla_tgt->qphints[0];
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
if (abort_cmd_for_tag(vha, abts->exchange_addr_to_abort)) {
|
|
Hannes Reinecke |
3b5f14 |
/* send TASK_ABORT response immediately */
|
|
Hannes Reinecke |
3b5f14 |
@@ -1955,23 +2026,29 @@ static int __qlt_24xx_handle_abts(struct scsi_qla_host *vha,
|
|
Hannes Reinecke |
3b5f14 |
memcpy(&mcmd->orig_iocb.abts, abts, sizeof(mcmd->orig_iocb.abts));
|
|
Hannes Reinecke |
3b5f14 |
mcmd->reset_count = ha->base_qpair->chip_reset;
|
|
Hannes Reinecke |
3b5f14 |
mcmd->tmr_func = QLA_TGT_ABTS;
|
|
Hannes Reinecke |
3b5f14 |
- mcmd->qpair = ha->base_qpair;
|
|
Hannes Reinecke |
3b5f14 |
+ mcmd->qpair = h->qpair;
|
|
Hannes Reinecke |
3b5f14 |
mcmd->vha = vha;
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
/*
|
|
Hannes Reinecke |
3b5f14 |
* LUN is looked up by target-core internally based on the passed
|
|
Hannes Reinecke |
3b5f14 |
* abts->exchange_addr_to_abort tag.
|
|
Hannes Reinecke |
3b5f14 |
*/
|
|
Hannes Reinecke |
3b5f14 |
- rc = ha->tgt.tgt_ops->handle_tmr(mcmd, 0, mcmd->tmr_func,
|
|
Hannes Reinecke |
3b5f14 |
- abts->exchange_addr_to_abort);
|
|
Hannes Reinecke |
3b5f14 |
- if (rc != 0) {
|
|
Hannes Reinecke |
3b5f14 |
- ql_dbg(ql_dbg_tgt_mgt, vha, 0xf052,
|
|
Hannes Reinecke |
3b5f14 |
- "qla_target(%d): tgt_ops->handle_tmr()"
|
|
Hannes Reinecke |
3b5f14 |
- " failed: %d", vha->vp_idx, rc);
|
|
Hannes Reinecke |
3b5f14 |
- mempool_free(mcmd, qla_tgt_mgmt_cmd_mempool);
|
|
Hannes Reinecke |
3b5f14 |
- return -EFAULT;
|
|
Hannes Reinecke |
3b5f14 |
+ mcmd->se_cmd.cpuid = h->cpuid;
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+ if (ha->tgt.tgt_ops->find_cmd_by_tag) {
|
|
Hannes Reinecke |
3b5f14 |
+ struct qla_tgt_cmd *abort_cmd;
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+ abort_cmd = ha->tgt.tgt_ops->find_cmd_by_tag(sess,
|
|
Hannes Reinecke |
3b5f14 |
+ abts->exchange_addr_to_abort);
|
|
Hannes Reinecke |
3b5f14 |
+ if (abort_cmd && abort_cmd->qpair) {
|
|
Hannes Reinecke |
3b5f14 |
+ mcmd->qpair = abort_cmd->qpair;
|
|
Hannes Reinecke |
3b5f14 |
+ mcmd->se_cmd.cpuid = abort_cmd->se_cmd.cpuid;
|
|
Hannes Reinecke |
3b5f14 |
+ }
|
|
Hannes Reinecke |
3b5f14 |
}
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
+ INIT_WORK(&mcmd->work, qlt_do_tmr_work);
|
|
Hannes Reinecke |
3b5f14 |
+ queue_work_on(mcmd->se_cmd.cpuid, qla_tgt_wq, &mcmd->work);
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
return 0;
|
|
Hannes Reinecke |
3b5f14 |
}
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
@@ -4325,7 +4402,7 @@ static int qlt_issue_task_mgmt(struct fc_port *sess, u64 lun,
|
|
Hannes Reinecke |
3b5f14 |
struct qla_hw_data *ha = vha->hw;
|
|
Hannes Reinecke |
3b5f14 |
struct qla_tgt_mgmt_cmd *mcmd;
|
|
Hannes Reinecke |
3b5f14 |
struct atio_from_isp *a = (struct atio_from_isp *)iocb;
|
|
Hannes Reinecke |
3b5f14 |
- int res;
|
|
Hannes Reinecke |
3b5f14 |
+ struct qla_qpair_hint *h = &vha->vha_tgt.qla_tgt->qphints[0];
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
mcmd = mempool_alloc(qla_tgt_mgmt_cmd_mempool, GFP_ATOMIC);
|
|
Hannes Reinecke |
3b5f14 |
if (!mcmd) {
|
|
Hannes Reinecke |
3b5f14 |
@@ -4345,24 +4422,36 @@ static int qlt_issue_task_mgmt(struct fc_port *sess, u64 lun,
|
|
Hannes Reinecke |
3b5f14 |
mcmd->tmr_func = fn;
|
|
Hannes Reinecke |
3b5f14 |
mcmd->flags = flags;
|
|
Hannes Reinecke |
3b5f14 |
mcmd->reset_count = ha->base_qpair->chip_reset;
|
|
Hannes Reinecke |
3b5f14 |
- mcmd->qpair = ha->base_qpair;
|
|
Hannes Reinecke |
3b5f14 |
+ mcmd->qpair = h->qpair;
|
|
Hannes Reinecke |
3b5f14 |
mcmd->vha = vha;
|
|
Hannes Reinecke |
3b5f14 |
+ mcmd->se_cmd.cpuid = h->cpuid;
|
|
Hannes Reinecke |
3b5f14 |
+ mcmd->unpacked_lun = lun;
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
switch (fn) {
|
|
Hannes Reinecke |
3b5f14 |
case QLA_TGT_LUN_RESET:
|
|
Hannes Reinecke |
3b5f14 |
- abort_cmds_for_lun(vha, lun, a->u.isp24.fcp_hdr.s_id);
|
|
Hannes Reinecke |
3b5f14 |
- break;
|
|
Hannes Reinecke |
3b5f14 |
- }
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_CLEAR_TS:
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_ABORT_TS:
|
|
Hannes Reinecke |
3b5f14 |
+ abort_cmds_for_lun(vha, lun, a->u.isp24.fcp_hdr.s_id);
|
|
Hannes Reinecke |
3b5f14 |
+ /* drop through */
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_CLEAR_ACA:
|
|
Hannes Reinecke |
3b5f14 |
+ h = qlt_find_qphint(vha, mcmd->unpacked_lun);
|
|
Hannes Reinecke |
3b5f14 |
+ mcmd->qpair = h->qpair;
|
|
Hannes Reinecke |
3b5f14 |
+ mcmd->se_cmd.cpuid = h->cpuid;
|
|
Hannes Reinecke |
3b5f14 |
+ break;
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
- res = ha->tgt.tgt_ops->handle_tmr(mcmd, lun, mcmd->tmr_func, 0);
|
|
Hannes Reinecke |
3b5f14 |
- if (res != 0) {
|
|
Hannes Reinecke |
3b5f14 |
- ql_dbg(ql_dbg_tgt_tmr, vha, 0x1000b,
|
|
Hannes Reinecke |
3b5f14 |
- "qla_target(%d): tgt.tgt_ops->handle_tmr() failed: %d\n",
|
|
Hannes Reinecke |
3b5f14 |
- sess->vha->vp_idx, res);
|
|
Hannes Reinecke |
3b5f14 |
- mempool_free(mcmd, qla_tgt_mgmt_cmd_mempool);
|
|
Hannes Reinecke |
3b5f14 |
- return -EFAULT;
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_TARGET_RESET:
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_NEXUS_LOSS_SESS:
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_NEXUS_LOSS:
|
|
Hannes Reinecke |
3b5f14 |
+ case QLA_TGT_ABORT_ALL:
|
|
Hannes Reinecke |
3b5f14 |
+ default:
|
|
Hannes Reinecke |
3b5f14 |
+ /* no-op */
|
|
Hannes Reinecke |
3b5f14 |
+ break;
|
|
Hannes Reinecke |
3b5f14 |
}
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
+ INIT_WORK(&mcmd->work, qlt_do_tmr_work);
|
|
Hannes Reinecke |
3b5f14 |
+ queue_work_on(mcmd->se_cmd.cpuid, qla_tgt_wq,
|
|
Hannes Reinecke |
3b5f14 |
+ &mcmd->work);
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
return 0;
|
|
Hannes Reinecke |
3b5f14 |
}
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
@@ -5102,8 +5191,6 @@ static void qlt_handle_imm_notify(struct scsi_qla_host *vha,
|
|
Hannes Reinecke |
3b5f14 |
ql_dbg(ql_dbg_tgt_mgt, vha, 0xf038,
|
|
Hannes Reinecke |
3b5f14 |
"qla_target(%d): Immediate notify task %x\n",
|
|
Hannes Reinecke |
3b5f14 |
vha->vp_idx, iocb->u.isp2x.task_flags);
|
|
Hannes Reinecke |
3b5f14 |
- if (qlt_handle_task_mgmt(vha, iocb) == 0)
|
|
Hannes Reinecke |
3b5f14 |
- send_notify_ack = 0;
|
|
Hannes Reinecke |
3b5f14 |
break;
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
case IMM_NTFY_ELS:
|
|
Hannes Reinecke |
3b5f14 |
diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h
|
|
Hannes Reinecke |
3b5f14 |
index 728ce74358e7..fecf96f0225c 100644
|
|
Hannes Reinecke |
3b5f14 |
--- a/drivers/scsi/qla2xxx/qla_target.h
|
|
Hannes Reinecke |
3b5f14 |
+++ b/drivers/scsi/qla2xxx/qla_target.h
|
|
Hannes Reinecke |
3b5f14 |
@@ -682,7 +682,7 @@ struct qla_tgt_cmd;
|
|
Hannes Reinecke |
3b5f14 |
* target module (tcm_qla2xxx).
|
|
Hannes Reinecke |
3b5f14 |
*/
|
|
Hannes Reinecke |
3b5f14 |
struct qla_tgt_func_tmpl {
|
|
Hannes Reinecke |
3b5f14 |
-
|
|
Hannes Reinecke |
3b5f14 |
+ struct qla_tgt_cmd *(*find_cmd_by_tag)(struct fc_port *, uint64_t);
|
|
Hannes Reinecke |
3b5f14 |
int (*handle_cmd)(struct scsi_qla_host *, struct qla_tgt_cmd *,
|
|
Hannes Reinecke |
3b5f14 |
unsigned char *, uint32_t, int, int, int);
|
|
Hannes Reinecke |
3b5f14 |
void (*handle_data)(struct qla_tgt_cmd *);
|
|
Hannes Reinecke |
3b5f14 |
@@ -966,6 +966,8 @@ struct qla_tgt_mgmt_cmd {
|
|
Hannes Reinecke |
3b5f14 |
unsigned int flags;
|
|
Hannes Reinecke |
3b5f14 |
uint32_t reset_count;
|
|
Hannes Reinecke |
3b5f14 |
#define QLA24XX_MGMT_SEND_NACK 1
|
|
Hannes Reinecke |
3b5f14 |
+ struct work_struct work;
|
|
Hannes Reinecke |
3b5f14 |
+ uint64_t unpacked_lun;
|
|
Hannes Reinecke |
3b5f14 |
union {
|
|
Hannes Reinecke |
3b5f14 |
struct atio_from_isp atio;
|
|
Hannes Reinecke |
3b5f14 |
struct imm_ntfy_from_isp imm_ntfy;
|
|
Hannes Reinecke |
3b5f14 |
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
|
|
Hannes Reinecke |
3b5f14 |
index aadfeaac3898..34ea4a8f98d2 100644
|
|
Hannes Reinecke |
3b5f14 |
--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
|
|
Hannes Reinecke |
3b5f14 |
+++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
|
|
Hannes Reinecke |
3b5f14 |
@@ -630,6 +630,32 @@ static int tcm_qla2xxx_handle_tmr(struct qla_tgt_mgmt_cmd *mcmd, u64 lun,
|
|
Hannes Reinecke |
3b5f14 |
transl_tmr_func, GFP_ATOMIC, tag, flags);
|
|
Hannes Reinecke |
3b5f14 |
}
|
|
Hannes Reinecke |
3b5f14 |
|
|
Hannes Reinecke |
3b5f14 |
+static struct qla_tgt_cmd *tcm_qla2xxx_find_cmd_by_tag(struct fc_port *sess,
|
|
Hannes Reinecke |
3b5f14 |
+ uint64_t tag)
|
|
Hannes Reinecke |
3b5f14 |
+{
|
|
Hannes Reinecke |
3b5f14 |
+ struct qla_tgt_cmd *cmd = NULL;
|
|
Hannes Reinecke |
3b5f14 |
+ struct se_cmd *secmd;
|
|
Hannes Reinecke |
3b5f14 |
+ unsigned long flags;
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+ if (!sess->se_sess)
|
|
Hannes Reinecke |
3b5f14 |
+ return NULL;
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+ spin_lock_irqsave(&sess->se_sess->sess_cmd_lock, flags);
|
|
Hannes Reinecke |
3b5f14 |
+ list_for_each_entry(secmd, &sess->se_sess->sess_cmd_list, se_cmd_list) {
|
|
Hannes Reinecke |
3b5f14 |
+ /* skip task management functions, including tmr->task_cmd */
|
|
Hannes Reinecke |
3b5f14 |
+ if (secmd->se_cmd_flags & SCF_SCSI_TMR_CDB)
|
|
Hannes Reinecke |
3b5f14 |
+ continue;
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+ if (secmd->tag == tag) {
|
|
Hannes Reinecke |
3b5f14 |
+ cmd = container_of(secmd, struct qla_tgt_cmd, se_cmd);
|
|
Hannes Reinecke |
3b5f14 |
+ break;
|
|
Hannes Reinecke |
3b5f14 |
+ }
|
|
Hannes Reinecke |
3b5f14 |
+ }
|
|
Hannes Reinecke |
3b5f14 |
+ spin_unlock_irqrestore(&sess->se_sess->sess_cmd_lock, flags);
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
+ return cmd;
|
|
Hannes Reinecke |
3b5f14 |
+}
|
|
Hannes Reinecke |
3b5f14 |
+
|
|
Hannes Reinecke |
3b5f14 |
static int tcm_qla2xxx_queue_data_in(struct se_cmd *se_cmd)
|
|
Hannes Reinecke |
3b5f14 |
{
|
|
Hannes Reinecke |
3b5f14 |
struct qla_tgt_cmd *cmd = container_of(se_cmd,
|
|
Hannes Reinecke |
3b5f14 |
@@ -1608,6 +1634,7 @@ static void tcm_qla2xxx_update_sess(struct fc_port *sess, port_id_t s_id,
|
|
Hannes Reinecke |
3b5f14 |
* Calls into tcm_qla2xxx used by qla2xxx LLD I/O path.
|
|
Hannes Reinecke |
3b5f14 |
*/
|
|
Hannes Reinecke |
3b5f14 |
static struct qla_tgt_func_tmpl tcm_qla2xxx_template = {
|
|
Hannes Reinecke |
3b5f14 |
+ .find_cmd_by_tag = tcm_qla2xxx_find_cmd_by_tag,
|
|
Hannes Reinecke |
3b5f14 |
.handle_cmd = tcm_qla2xxx_handle_cmd,
|
|
Hannes Reinecke |
3b5f14 |
.handle_data = tcm_qla2xxx_handle_data,
|
|
Hannes Reinecke |
3b5f14 |
.handle_tmr = tcm_qla2xxx_handle_tmr,
|
|
Hannes Reinecke |
3b5f14 |
--
|
|
Hannes Reinecke |
3b5f14 |
2.12.3
|
|
Hannes Reinecke |
3b5f14 |
|