summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBart Van Assche <bart.vanassche@sandisk.com>2017-01-09 13:54:23 -0800
committerBart Van Assche <bart.vanassche@sandisk.com>2017-02-08 16:41:17 -0800
commitade1501210ac823705b920dfa8580fde3cd543da (patch)
tree899eaa2530ee808dec15dec8cbe24fb1a7814d5a
parent20445b55f533f6320a77b4f12301522f37e73c14 (diff)
target: Move target_remove_from_state_list() into target_release_cmd_kref()
The only code that iterates over the state list is the LUN reset code. Deferring removal from the state list is fine since that code grabs a reference to the command before it does any other processing. Leaving out the se_cmd.state_active test is fine because this test is already performed by target_remove_from_state_list(). Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com> Reviewed-by: Hannes Reinecke <hare@suse.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Andy Grover <agrover@redhat.com> Cc: David Disseldorp <ddiss@suse.de>
-rw-r--r--drivers/target/target_core_transport.c11
1 files changed, 2 insertions, 9 deletions
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 757ce96bf634..324710d98783 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -596,8 +596,6 @@ static int transport_cmd_check_stop_to_fabric(struct se_cmd *cmd)
{
unsigned long flags;
- target_remove_from_state_list(cmd);
-
spin_lock_irqsave(&cmd->t_state_lock, flags);
/*
* Determine if frontend context caller is requesting the stopping of
@@ -2467,13 +2465,6 @@ int transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks)
} else {
if (wait_for_tasks)
target_wait_free_cmd(cmd);
- /*
- * Handle WRITE failure case where transport_generic_new_cmd()
- * has already added se_cmd to state_list, but fabric has
- * failed command before I/O submission.
- */
- if (cmd->state_active)
- target_remove_from_state_list(cmd);
}
/*
* Since the iSCSI and iSER targets driver assume that a SCSI command
@@ -2546,6 +2537,8 @@ static void target_release_cmd_kref(struct kref *kref)
WARN_ON_ONCE(atomic_read(&se_cmd->tgt_ref) != 0);
+ target_remove_from_state_list(se_cmd);
+
if (se_cmd->lun_ref_active)
percpu_ref_put(&se_cmd->se_lun->lun_ref);