diff options
author | Christoph Hellwig <hch@lst.de> | 2011-09-13 23:09:01 +0200 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-10-24 03:20:38 +0000 |
commit | 82f1c8a4e7739eae9f1c32c2c419efdc19b8af41 (patch) | |
tree | e4b9141c59cbc1402b96fb34003205fe90d362df /drivers/target/target_core_transport.c | |
parent | e6a2573f1f5d66f0456c433afdfc63f33fdf9008 (diff) |
target: push session reinstatement out of transport_generic_free_cmd
Push session reinstatement out of transport_generic_free_cmd into the only
caller that actually needs it. Clean up transport_generic_free_cmd a bit,
and remove the useless comment. I'd love to add a more useful kerneldoc
comment for it, but as this point I'm still a bit confused in where it
stands in the command release stack.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/target_core_transport.c')
-rw-r--r-- | drivers/target/target_core_transport.c | 37 |
1 files changed, 13 insertions, 24 deletions
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 4f21b88b85b..db2f8987a04 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -4331,42 +4331,25 @@ void transport_release_cmd(struct se_cmd *cmd) } EXPORT_SYMBOL(transport_release_cmd); -/* transport_generic_free_cmd(): - * - * Called from processing frontend to release storage engine resources - */ -void transport_generic_free_cmd( - struct se_cmd *cmd, - int wait_for_tasks, - int session_reinstatement) +bool transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks) { if (!(cmd->se_cmd_flags & SCF_SE_LUN_CMD)) transport_release_cmd(cmd); else { core_dec_lacl_count(cmd->se_sess->se_node_acl, cmd); - if (cmd->se_lun) { -#if 0 - pr_debug("cmd: %p ITT: 0x%08x contains" - " cmd->se_lun\n", cmd, - cmd->se_tfo->get_task_tag(cmd)); -#endif + if (cmd->se_lun) transport_lun_remove_cmd(cmd); - } if (wait_for_tasks && cmd->transport_wait_for_tasks) cmd->transport_wait_for_tasks(cmd, 0, 0); transport_free_dev_tasks(cmd); - if (!transport_put_cmd(cmd) && session_reinstatement) { - unsigned long flags; - - spin_lock_irqsave(&cmd->t_state_lock, flags); - transport_all_task_dev_remove_state(cmd); - spin_unlock_irqrestore(&cmd->t_state_lock, flags); - } + return transport_put_cmd(cmd); } + + return true; } EXPORT_SYMBOL(transport_generic_free_cmd); @@ -4631,7 +4614,13 @@ remove: if (!remove_cmd) return; - transport_generic_free_cmd(cmd, 0, session_reinstatement); + if (!transport_generic_free_cmd(cmd, 0) && session_reinstatement) { + unsigned long flags; + + spin_lock_irqsave(&cmd->t_state_lock, flags); + transport_all_task_dev_remove_state(cmd); + spin_unlock_irqrestore(&cmd->t_state_lock, flags); + } } static int transport_get_sense_codes( @@ -5181,7 +5170,7 @@ get_cmd: transport_put_cmd(cmd); break; case TRANSPORT_FREE_CMD_INTR: - transport_generic_free_cmd(cmd, 0, 0); + transport_generic_free_cmd(cmd, 0); break; case TRANSPORT_PROCESS_TMR: transport_generic_do_tmr(cmd); |