Commit f5e2714a authored by Bodo Stroesser's avatar Bodo Stroesser Committed by Martin K. Petersen

scsi: target: Modify core_tmr_abort_task()

This patch modifies core_tmr_abort_task() to use same looping and locking
scheme as core_tmr_drain_state_list() does.

This frees the state_list element in se_cmd for later use by tmr
notification handling.

Note: __target_check_io_state() now is called with param 0 instead of
dev->dev_attrib.emulate_tas, because tas is not relevant since we always
get ABRT on same session like the aborted command.

Link: https://lore.kernel.org/r/20200726153510.13077-2-bstroesser@ts.fujitsu.comReviewed-by: default avatarMike Christie <michael.christie@oracle.com>
Signed-off-by: default avatarBodo Stroesser <bstroesser@ts.fujitsu.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent df2de6f2
...@@ -116,14 +116,15 @@ void core_tmr_abort_task( ...@@ -116,14 +116,15 @@ void core_tmr_abort_task(
struct se_tmr_req *tmr, struct se_tmr_req *tmr,
struct se_session *se_sess) struct se_session *se_sess)
{ {
struct se_cmd *se_cmd; struct se_cmd *se_cmd, *next;
unsigned long flags; unsigned long flags;
bool rc;
u64 ref_tag; u64 ref_tag;
spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); spin_lock_irqsave(&dev->execute_task_lock, flags);
list_for_each_entry(se_cmd, &se_sess->sess_cmd_list, se_cmd_list) { list_for_each_entry_safe(se_cmd, next, &dev->state_list, state_list) {
if (dev != se_cmd->se_dev) if (se_sess != se_cmd->se_sess)
continue; continue;
/* skip task management functions, including tmr->task_cmd */ /* skip task management functions, including tmr->task_cmd */
...@@ -137,11 +138,16 @@ void core_tmr_abort_task( ...@@ -137,11 +138,16 @@ void core_tmr_abort_task(
printk("ABORT_TASK: Found referenced %s task_tag: %llu\n", printk("ABORT_TASK: Found referenced %s task_tag: %llu\n",
se_cmd->se_tfo->fabric_name, ref_tag); se_cmd->se_tfo->fabric_name, ref_tag);
if (!__target_check_io_state(se_cmd, se_sess, spin_lock(&se_sess->sess_cmd_lock);
dev->dev_attrib.emulate_tas)) rc = __target_check_io_state(se_cmd, se_sess, 0);
spin_unlock(&se_sess->sess_cmd_lock);
if (!rc)
continue; continue;
spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); list_del_init(&se_cmd->state_list);
se_cmd->state_active = false;
spin_unlock_irqrestore(&dev->execute_task_lock, flags);
/* /*
* Ensure that this ABORT request is visible to the LU RESET * Ensure that this ABORT request is visible to the LU RESET
...@@ -159,7 +165,7 @@ void core_tmr_abort_task( ...@@ -159,7 +165,7 @@ void core_tmr_abort_task(
atomic_long_inc(&dev->aborts_complete); atomic_long_inc(&dev->aborts_complete);
return; return;
} }
spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); spin_unlock_irqrestore(&dev->execute_task_lock, flags);
printk("ABORT_TASK: Sending TMR_TASK_DOES_NOT_EXIST for ref_tag: %lld\n", printk("ABORT_TASK: Sending TMR_TASK_DOES_NOT_EXIST for ref_tag: %lld\n",
tmr->ref_task_tag); tmr->ref_task_tag);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment