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@xxxxxx> Index: lio-core/drivers/infiniband/ulp/srpt/ib_srpt.c =================================================================== --- lio-core.orig/drivers/infiniband/ulp/srpt/ib_srpt.c 2011-09-13 15:16:40.104088124 -0400 +++ lio-core/drivers/infiniband/ulp/srpt/ib_srpt.c 2011-09-13 15:18:33.088089266 -0400 @@ -1340,7 +1340,7 @@ static void srpt_put_send_ioctx(struct s WARN_ON(srpt_get_cmd_state(ioctx) != SRPT_STATE_DONE); srpt_unmap_sg_to_ib_sge(ioctx->ch, ioctx); - transport_generic_free_cmd(&ioctx->cmd, 0, 0); + transport_generic_free_cmd(&ioctx->cmd, 0); if (ioctx->n_rbuf > 1) { kfree(ioctx->rbufs); Index: lio-core/drivers/scsi/ibmvscsi/ibmvscsis.c =================================================================== --- lio-core.orig/drivers/scsi/ibmvscsi/ibmvscsis.c 2011-09-13 15:16:40.120088558 -0400 +++ lio-core/drivers/scsi/ibmvscsi/ibmvscsis.c 2011-09-13 15:16:50.492089526 -0400 @@ -922,7 +922,7 @@ static void ibmvscsis_check_stop_free(st { if (se_cmd->se_tmr_req) return; - transport_generic_free_cmd(se_cmd, 0, 0); + transport_generic_free_cmd(se_cmd, 0); } static u64 scsi_lun_to_int(u64 lun) Index: lio-core/drivers/target/iscsi/iscsi_target.c =================================================================== --- lio-core.orig/drivers/target/iscsi/iscsi_target.c 2011-09-13 15:16:40.144088409 -0400 +++ lio-core/drivers/target/iscsi/iscsi_target.c 2011-09-13 15:16:58.599588486 -0400 @@ -3547,7 +3547,7 @@ get_immediate: iscsit_release_cmd(cmd); else transport_generic_free_cmd(&cmd->se_cmd, - 1, 0); + 1); goto get_immediate; case ISTATE_SEND_NOPIN_WANT_RESPONSE: spin_unlock_bh(&cmd->istate_lock); Index: lio-core/drivers/target/loopback/tcm_loop.c =================================================================== --- lio-core.orig/drivers/target/loopback/tcm_loop.c 2011-09-13 15:16:40.160088142 -0400 +++ lio-core/drivers/target/loopback/tcm_loop.c 2011-09-13 15:17:07.356088700 -0400 @@ -200,7 +200,7 @@ static void tcm_loop_check_stop_free(str * Release the struct se_cmd, which will make a callback to release * struct tcm_loop_cmd * in tcm_loop_deallocate_core_cmd() */ - transport_generic_free_cmd(se_cmd, 0, 0); + transport_generic_free_cmd(se_cmd, 0); } static void tcm_loop_release_cmd(struct se_cmd *se_cmd) @@ -388,7 +388,7 @@ static int tcm_loop_device_reset(struct SUCCESS : FAILED; release: if (se_cmd) - transport_generic_free_cmd(se_cmd, 1, 0); + transport_generic_free_cmd(se_cmd, 1); else kmem_cache_free(tcm_loop_cmd_cache, tl_cmd); kfree(tl_tmr); Index: lio-core/drivers/target/target_core_transport.c =================================================================== --- lio-core.orig/drivers/target/target_core_transport.c 2011-09-13 15:16:40.180088655 -0400 +++ lio-core/drivers/target/target_core_transport.c 2011-09-13 15:22:34.088088885 -0400 @@ -4352,42 +4352,25 @@ void transport_release_cmd(struct se_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); @@ -4652,7 +4635,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( @@ -5192,7 +5181,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); Index: lio-core/drivers/target/tcm_fc/tfc_cmd.c =================================================================== --- lio-core.orig/drivers/target/tcm_fc/tfc_cmd.c 2011-09-13 15:16:40.200090057 -0400 +++ lio-core/drivers/target/tcm_fc/tfc_cmd.c 2011-09-13 15:17:39.044089483 -0400 @@ -147,7 +147,7 @@ void ft_release_cmd(struct se_cmd *se_cm void ft_check_stop_free(struct se_cmd *se_cmd) { - transport_generic_free_cmd(se_cmd, 0, 0); + transport_generic_free_cmd(se_cmd, 0); } /* @@ -303,7 +303,7 @@ static void ft_recv_seq(struct fc_seq *s /* XXX need to find cmd if queued */ cmd->se_cmd.t_state = TRANSPORT_REMOVE; cmd->seq = NULL; - transport_generic_free_cmd(&cmd->se_cmd, 0, 0); + transport_generic_free_cmd(&cmd->se_cmd, 0); return; } @@ -321,7 +321,7 @@ static void ft_recv_seq(struct fc_seq *s __func__, fh->fh_r_ctl); ft_invl_hw_context(cmd); fc_frame_free(fp); - transport_generic_free_cmd(&cmd->se_cmd, 0, 0); + transport_generic_free_cmd(&cmd->se_cmd, 0); break; } } @@ -409,7 +409,7 @@ static void ft_send_tm(struct ft_cmd *cm sess = cmd->sess; transport_send_check_condition_and_sense(&cmd->se_cmd, cmd->se_cmd.scsi_sense_reason, 0); - transport_generic_free_cmd(&cmd->se_cmd, 0, 0); + transport_generic_free_cmd(&cmd->se_cmd, 0); ft_sess_put(sess); return; } @@ -461,7 +461,7 @@ static void ft_send_tm(struct ft_cmd *cm sess = cmd->sess; transport_send_check_condition_and_sense(&cmd->se_cmd, cmd->se_cmd.scsi_sense_reason, 0); - transport_generic_free_cmd(&cmd->se_cmd, 0, 0); + transport_generic_free_cmd(&cmd->se_cmd, 0); ft_sess_put(sess); return; } @@ -659,7 +659,7 @@ static void ft_send_cmd(struct ft_cmd *c if (ret == -ENOMEM) { transport_send_check_condition_and_sense(se_cmd, TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE, 0); - transport_generic_free_cmd(se_cmd, 0, 0); + transport_generic_free_cmd(se_cmd, 0); return; } if (ret == -EINVAL) { @@ -668,7 +668,7 @@ static void ft_send_cmd(struct ft_cmd *c else transport_send_check_condition_and_sense(se_cmd, se_cmd->scsi_sense_reason, 0); - transport_generic_free_cmd(se_cmd, 0, 0); + transport_generic_free_cmd(se_cmd, 0); return; } transport_generic_handle_cdb(se_cmd); Index: lio-core/drivers/target/tcm_qla2xxx/tcm_qla2xxx_fabric.c =================================================================== --- lio-core.orig/drivers/target/tcm_qla2xxx/tcm_qla2xxx_fabric.c 2011-09-13 15:16:40.220091679 -0400 +++ lio-core/drivers/target/tcm_qla2xxx/tcm_qla2xxx_fabric.c 2011-09-13 15:18:04.739806249 -0400 @@ -397,7 +397,7 @@ void tcm_qla2xxx_free_cmd(struct qla_tgt */ if (!cmd->se_cmd.se_dev) { atomic_set(&cmd->cmd_stop_free, 1); - transport_generic_free_cmd(&cmd->se_cmd, 0, 0); + transport_generic_free_cmd(&cmd->se_cmd, 0); return; } @@ -418,7 +418,7 @@ void tcm_qla2xxx_check_stop_free(struct * Release the associated se_cmd->se_tmr_req and se_cmd * TMR related state now. */ - transport_generic_free_cmd(se_cmd, 1, 0); + transport_generic_free_cmd(se_cmd, 1); qla_tgt_free_mcmd(mcmd); return; } @@ -731,7 +731,7 @@ int tcm_qla2xxx_handle_tmr(struct qla_tg * Locate the underlying TCM struct se_lun from sc->device->lun */ if (transport_lookup_tmr_lun(se_cmd, lun) < 0) { - transport_generic_free_cmd(se_cmd, 1, 0); + transport_generic_free_cmd(se_cmd, 1); return -EINVAL; } /* Index: lio-core/drivers/target/tcm_vhost/tcm_vhost_scsi.c =================================================================== --- lio-core.orig/drivers/target/tcm_vhost/tcm_vhost_scsi.c 2011-09-13 15:16:40.244088465 -0400 +++ lio-core/drivers/target/tcm_vhost/tcm_vhost_scsi.c 2011-09-13 15:18:25.400088636 -0400 @@ -49,8 +49,8 @@ static void vhost_scsi_free_cmd(struct t put_page(sg_page(&tv_cmd->tvc_sgl[i])); } - /* TODO what do wait_for_tasks and session_reinstatement do? */ - transport_generic_free_cmd(se_cmd, 1, 0); + /* TODO what does wait_for_tasks do? */ + transport_generic_free_cmd(se_cmd, 1); kfree(tv_cmd); } Index: lio-core/include/target/target_core_transport.h =================================================================== --- lio-core.orig/include/target/target_core_transport.h 2011-09-13 15:16:40.264091716 -0400 +++ lio-core/include/target/target_core_transport.h 2011-09-13 15:19:17.264089186 -0400 @@ -185,7 +185,7 @@ extern int transport_check_aborted_statu extern int transport_send_check_condition_and_sense(struct se_cmd *, u8, int); extern void transport_send_task_abort(struct se_cmd *); extern void transport_release_cmd(struct se_cmd *); -extern void transport_generic_free_cmd(struct se_cmd *, int, int); +extern bool transport_generic_free_cmd(struct se_cmd *, int); extern void transport_generic_wait_for_cmds(struct se_cmd *, int); extern int transport_init_task_sg(struct se_task *, struct se_mem *, u32); extern int transport_map_mem_to_sg(struct se_task *, struct list_head *, -- To unsubscribe from this list: send the line "unsubscribe target-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html