[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <7d31722a7e07bc24ea37b5841a17545003eeddb4.1658195608.git.Thinh.Nguyen@synopsys.com>
Date: Mon, 18 Jul 2022 19:07:06 -0700
From: Thinh Nguyen <Thinh.Nguyen@...opsys.com>
To: linux-kernel@...r.kernel.org, linux-scsi@...r.kernel.org,
target-devel@...r.kernel.org,
"Martin K. Petersen" <martin.petersen@...cle.com>
Cc: John Youn <John.Youn@...opsys.com>,
Thinh Nguyen <Thinh.Nguyen@...opsys.com>,
linux-usb@...r.kernel.org
Subject: [PATCH v2 2/4] target: Implement TMR_ABORT_TASK_SET
Task ABORT TASK SET function is required by SCSI transport protocol
standards (SAM-4 r14 section 7.3). It is similar to ABORT TASK
function, but it applies to all commands received on a specified I_T
nexus rather than a specific referenced command. Modify
core_tmr_abort_task() to support TMR_ABORT_TASK_SET.
Signed-off-by: Thinh Nguyen <Thinh.Nguyen@...opsys.com>
---
Changes in v2:
- None
drivers/target/target_core_tmr.c | 16 +++++++++++-----
drivers/target/target_core_transport.c | 2 +-
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c
index bac111456fa1..1ea72e15f872 100644
--- a/drivers/target/target_core_tmr.c
+++ b/drivers/target/target_core_tmr.c
@@ -131,11 +131,13 @@ void core_tmr_abort_task(
continue;
ref_tag = se_cmd->tag;
- if (tmr->ref_task_tag != ref_tag)
- continue;
+ if (tmr->function == TMR_ABORT_TASK) {
+ if (tmr->ref_task_tag != ref_tag)
+ continue;
- pr_err("ABORT_TASK: Found referenced %s task_tag: %llu\n",
- se_cmd->se_tfo->fabric_name, ref_tag);
+ pr_err("ABORT_TASK: Found referenced %s task_tag: %llu\n",
+ se_cmd->se_tfo->fabric_name, ref_tag);
+ }
spin_lock(&se_sess->sess_cmd_lock);
rc = __target_check_io_state(se_cmd, se_sess, 0);
@@ -158,7 +160,11 @@ void core_tmr_abort_task(
ref_tag);
tmr->response = TMR_FUNCTION_COMPLETE;
atomic_long_inc(&dev->aborts_complete);
- return;
+
+ if (tmr->function == TMR_ABORT_TASK)
+ return;
+
+ spin_lock_irqsave(&dev->queues[i].lock, flags);
}
spin_unlock_irqrestore(&dev->queues[i].lock, flags);
}
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 7838dc20f713..8c386142ef90 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -3519,9 +3519,9 @@ static void target_tmr_work(struct work_struct *work)
switch (tmr->function) {
case TMR_ABORT_TASK:
+ case TMR_ABORT_TASK_SET:
core_tmr_abort_task(dev, tmr, cmd->se_sess);
break;
- case TMR_ABORT_TASK_SET:
case TMR_CLEAR_ACA:
case TMR_CLEAR_TASK_SET:
tmr->response = TMR_TASK_MGMT_FUNCTION_NOT_SUPPORTED;
--
2.28.0
Powered by blists - more mailing lists