@@ -483,9 +483,7 @@ EXPORT_SYMBOL(iscsit_queue_rsp);
483483void  iscsit_aborted_task (struct  iscsi_conn  * conn , struct  iscsi_cmd  * cmd )
484484{
485485	spin_lock_bh (& conn -> cmd_lock );
486- 	if  (!list_empty (& cmd -> i_conn_node ) && 
487- 	    !(cmd -> se_cmd .transport_state  &  CMD_T_FABRIC_STOP ))
488- 		list_del_init (& cmd -> i_conn_node );
486+ 	list_del_init (& cmd -> i_conn_node );
489487	spin_unlock_bh (& conn -> cmd_lock );
490488
491489	__iscsit_free_cmd (cmd , true);
@@ -4071,7 +4069,8 @@ int iscsi_target_rx_thread(void *arg)
40714069
40724070static  void  iscsit_release_commands_from_conn (struct  iscsi_conn  * conn )
40734071{
4074- 	LIST_HEAD (tmp_list );
4072+ 	LIST_HEAD (tmp_cmd_list );
4073+ 	LIST_HEAD (tmp_tmr_list );
40754074	struct  iscsi_cmd  * cmd  =  NULL , * cmd_tmp  =  NULL ;
40764075	struct  iscsi_session  * sess  =  conn -> sess ;
40774076	/* 
@@ -4080,21 +4079,57 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn)
40804079	 * has been reset -> returned sleeping pre-handler state. 
40814080	 */ 
40824081	spin_lock_bh (& conn -> cmd_lock );
4083- 	list_splice_init (& conn -> conn_cmd_list , & tmp_list );
4082+ 	list_splice_init (& conn -> conn_cmd_list , & tmp_cmd_list );
40844083
4085- 	list_for_each_entry (cmd , & tmp_list , i_conn_node ) {
4084+ 	list_for_each_entry_safe (cmd , cmd_tmp ,  & tmp_cmd_list , i_conn_node ) {
40864085		struct  se_cmd  * se_cmd  =  & cmd -> se_cmd ;
40874086
40884087		if  (se_cmd -> se_tfo  !=  NULL ) {
40894088			spin_lock_irq (& se_cmd -> t_state_lock );
40904089			se_cmd -> transport_state  |= CMD_T_FABRIC_STOP ;
40914090			spin_unlock_irq (& se_cmd -> t_state_lock );
40924091		}
4092+ 
4093+ 		if  (se_cmd -> se_cmd_flags  &  SCF_SCSI_TMR_CDB )
4094+ 			list_move_tail (& cmd -> i_conn_node , & tmp_tmr_list );
40934095	}
40944096	spin_unlock_bh (& conn -> cmd_lock );
40954097
4096- 	list_for_each_entry_safe (cmd , cmd_tmp , & tmp_list , i_conn_node ) {
4098+ 	/* 
4099+ 	 * We must wait for TMRs to be processed first. Any commands that were 
4100+ 	 * aborted by those TMRs will have been freed and removed from the 
4101+ 	 * tmp_cmd_list once we have finished traversing tmp_tmr_list. 
4102+ 	 */ 
4103+ 	list_for_each_entry_safe (cmd , cmd_tmp , & tmp_tmr_list , i_conn_node ) {
4104+ 		struct  se_cmd  * se_cmd  =  & cmd -> se_cmd ;
4105+ 
4106+ 		spin_lock_bh (& conn -> cmd_lock );
40974107		list_del_init (& cmd -> i_conn_node );
4108+ 		spin_unlock_bh (& conn -> cmd_lock );
4109+ 
4110+ 		iscsit_increment_maxcmdsn (cmd , sess );
4111+ 		pr_debug ("%s: freeing TMR icmd 0x%px cmd 0x%px\n" ,
4112+ 			__func__ , cmd , se_cmd );
4113+ 		iscsit_free_cmd (cmd , true);
4114+ 		pr_debug ("%s: TMR freed\n" , __func__ );
4115+ 	}
4116+ 
4117+ 	list_for_each_entry_safe (cmd , cmd_tmp , & tmp_cmd_list , i_conn_node ) {
4118+ 		struct  se_cmd  * se_cmd  =  & cmd -> se_cmd ;
4119+ 
4120+ 		/* 
4121+ 		 * We shouldn't be freeing any aborted commands here. Those 
4122+ 		 * commands should be freed by iscsit_aborted_task, and the 
4123+ 		 * last reference will be released by target_put_cmd_and_wait, 
4124+ 		 * called from core_tmr_drain_tmr_list or core_tmr_abort_task. 
4125+ 		 */ 
4126+ 		spin_lock_irq (& se_cmd -> t_state_lock );
4127+ 		WARN_ON (se_cmd -> transport_state  &  CMD_T_ABORTED );
4128+ 		spin_unlock_irq (& se_cmd -> t_state_lock );
4129+ 
4130+ 		spin_lock_bh (& conn -> cmd_lock );
4131+ 		list_del_init (& cmd -> i_conn_node );
4132+ 		spin_unlock_bh (& conn -> cmd_lock );
40984133
40994134		iscsit_increment_maxcmdsn (cmd , sess );
41004135		iscsit_free_cmd (cmd , true);
0 commit comments