@@ -483,8 +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- list_del_init (& cmd -> i_conn_node );
486+ list_del_init (& cmd -> i_conn_node );
488487 spin_unlock_bh (& conn -> cmd_lock );
489488
490489 __iscsit_free_cmd (cmd , true);
@@ -4070,7 +4069,8 @@ int iscsi_target_rx_thread(void *arg)
40704069
40714070static void iscsit_release_commands_from_conn (struct iscsi_conn * conn )
40724071{
4073- LIST_HEAD (tmp_list );
4072+ LIST_HEAD (tmp_cmd_list );
4073+ LIST_HEAD (tmp_tmr_list );
40744074 struct iscsi_cmd * cmd = NULL , * cmd_tmp = NULL ;
40754075 struct iscsi_session * sess = conn -> sess ;
40764076 /*
@@ -4079,9 +4079,9 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn)
40794079 * has been reset -> returned sleeping pre-handler state.
40804080 */
40814081 spin_lock_bh (& conn -> cmd_lock );
4082- list_splice_init (& conn -> conn_cmd_list , & tmp_list );
4082+ list_splice_init (& conn -> conn_cmd_list , & tmp_cmd_list );
40834083
4084- list_for_each_entry_safe (cmd , cmd_tmp , & tmp_list , i_conn_node ) {
4084+ list_for_each_entry_safe (cmd , cmd_tmp , & tmp_cmd_list , i_conn_node ) {
40854085 struct se_cmd * se_cmd = & cmd -> se_cmd ;
40864086
40874087 if (se_cmd -> se_tfo != NULL ) {
@@ -4099,11 +4099,47 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn)
40994099 }
41004100 spin_unlock_irq (& se_cmd -> t_state_lock );
41014101 }
4102+
4103+ if (se_cmd -> se_cmd_flags & SCF_SCSI_TMR_CDB )
4104+ list_move_tail (& cmd -> i_conn_node , & tmp_tmr_list );
41024105 }
41034106 spin_unlock_bh (& conn -> cmd_lock );
41044107
4105- list_for_each_entry_safe (cmd , cmd_tmp , & tmp_list , i_conn_node ) {
4108+ /*
4109+ * We must wait for TMRs to be processed first. Any commands that were
4110+ * aborted by those TMRs will have been freed and removed from the
4111+ * tmp_cmd_list once we have finished traversing tmp_tmr_list.
4112+ */
4113+ list_for_each_entry_safe (cmd , cmd_tmp , & tmp_tmr_list , i_conn_node ) {
4114+ struct se_cmd * se_cmd = & cmd -> se_cmd ;
4115+
4116+ spin_lock_bh (& conn -> cmd_lock );
41064117 list_del_init (& cmd -> i_conn_node );
4118+ spin_unlock_bh (& conn -> cmd_lock );
4119+
4120+ iscsit_increment_maxcmdsn (cmd , sess );
4121+ pr_debug ("%s: freeing TMR icmd 0x%px cmd 0x%px\n" ,
4122+ __func__ , cmd , se_cmd );
4123+ iscsit_free_cmd (cmd , true);
4124+ pr_debug ("%s: TMR freed\n" , __func__ );
4125+ }
4126+
4127+ list_for_each_entry_safe (cmd , cmd_tmp , & tmp_cmd_list , i_conn_node ) {
4128+ struct se_cmd * se_cmd = & cmd -> se_cmd ;
4129+
4130+ /*
4131+ * We shouldn't be freeing any aborted commands here. Those
4132+ * commands should be freed by iscsit_aborted_task, and the
4133+ * last reference will be released by target_put_cmd_and_wait,
4134+ * called from core_tmr_drain_tmr_list or core_tmr_abort_task.
4135+ */
4136+ spin_lock_irq (& se_cmd -> t_state_lock );
4137+ WARN_ON (se_cmd -> transport_state & CMD_T_ABORTED );
4138+ spin_unlock_irq (& se_cmd -> t_state_lock );
4139+
4140+ spin_lock_bh (& conn -> cmd_lock );
4141+ list_del_init (& cmd -> i_conn_node );
4142+ spin_unlock_bh (& conn -> cmd_lock );
41074143
41084144 iscsit_increment_maxcmdsn (cmd , sess );
41094145 iscsit_free_cmd (cmd , true);
0 commit comments