@@ -483,8 +483,7 @@ EXPORT_SYMBOL(iscsit_queue_rsp);
483
483
void iscsit_aborted_task (struct iscsi_conn * conn , struct iscsi_cmd * cmd )
484
484
{
485
485
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 );
488
487
spin_unlock_bh (& conn -> cmd_lock );
489
488
490
489
__iscsit_free_cmd (cmd , true);
@@ -4070,7 +4069,8 @@ int iscsi_target_rx_thread(void *arg)
4070
4069
4071
4070
static void iscsit_release_commands_from_conn (struct iscsi_conn * conn )
4072
4071
{
4073
- LIST_HEAD (tmp_list );
4072
+ LIST_HEAD (tmp_cmd_list );
4073
+ LIST_HEAD (tmp_tmr_list );
4074
4074
struct iscsi_cmd * cmd = NULL , * cmd_tmp = NULL ;
4075
4075
struct iscsi_session * sess = conn -> sess ;
4076
4076
/*
@@ -4079,9 +4079,9 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn)
4079
4079
* has been reset -> returned sleeping pre-handler state.
4080
4080
*/
4081
4081
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 );
4083
4083
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 ) {
4085
4085
struct se_cmd * se_cmd = & cmd -> se_cmd ;
4086
4086
4087
4087
if (se_cmd -> se_tfo != NULL ) {
@@ -4099,11 +4099,47 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn)
4099
4099
}
4100
4100
spin_unlock_irq (& se_cmd -> t_state_lock );
4101
4101
}
4102
+
4103
+ if (se_cmd -> se_cmd_flags & SCF_SCSI_TMR_CDB )
4104
+ list_move_tail (& cmd -> i_conn_node , & tmp_tmr_list );
4102
4105
}
4103
4106
spin_unlock_bh (& conn -> cmd_lock );
4104
4107
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 );
4106
4117
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 );
4107
4143
4108
4144
iscsit_increment_maxcmdsn (cmd , sess );
4109
4145
iscsit_free_cmd (cmd , true);
0 commit comments