[PATCH v2 2/4] target: Implement TMR_ABORT_TASK_SET

From: Thinh Nguyen
Date: Mon Jul 18 2022 - 22:07:23 EST


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@xxxxxxxxxxxx>
---
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