@@ -121,57 +121,61 @@ void core_tmr_abort_task(
121121 unsigned long flags ;
122122 bool rc ;
123123 u64 ref_tag ;
124-
125- spin_lock_irqsave (& dev -> execute_task_lock , flags );
126- list_for_each_entry_safe (se_cmd , next , & dev -> state_list , state_list ) {
127-
128- if (se_sess != se_cmd -> se_sess )
129- continue ;
130-
131- /* skip task management functions, including tmr->task_cmd */
132- if (se_cmd -> se_cmd_flags & SCF_SCSI_TMR_CDB )
133- continue ;
134-
135- ref_tag = se_cmd -> tag ;
136- if (tmr -> ref_task_tag != ref_tag )
137- continue ;
138-
139- printk ("ABORT_TASK: Found referenced %s task_tag: %llu\n" ,
140- se_cmd -> se_tfo -> fabric_name , ref_tag );
141-
142- spin_lock (& se_sess -> sess_cmd_lock );
143- rc = __target_check_io_state (se_cmd , se_sess , 0 );
144- spin_unlock (& se_sess -> sess_cmd_lock );
145- if (!rc )
146- continue ;
147-
148- list_move_tail (& se_cmd -> state_list , & aborted_list );
149- se_cmd -> state_active = false;
150-
151- spin_unlock_irqrestore (& dev -> execute_task_lock , flags );
152-
153- /*
154- * Ensure that this ABORT request is visible to the LU RESET
155- * code.
156- */
157- if (!tmr -> tmr_dev )
158- WARN_ON_ONCE (transport_lookup_tmr_lun (tmr -> task_cmd ) <
159- 0 );
160-
161- if (dev -> transport -> tmr_notify )
162- dev -> transport -> tmr_notify (dev , TMR_ABORT_TASK ,
163- & aborted_list );
164-
165- list_del_init (& se_cmd -> state_list );
166- target_put_cmd_and_wait (se_cmd );
167-
168- printk ("ABORT_TASK: Sending TMR_FUNCTION_COMPLETE for"
169- " ref_tag: %llu\n" , ref_tag );
170- tmr -> response = TMR_FUNCTION_COMPLETE ;
171- atomic_long_inc (& dev -> aborts_complete );
172- return ;
124+ int i ;
125+
126+ for (i = 0 ; i < dev -> queue_cnt ; i ++ ) {
127+ spin_lock_irqsave (& dev -> queues [i ].lock , flags );
128+ list_for_each_entry_safe (se_cmd , next , & dev -> queues [i ].state_list ,
129+ state_list ) {
130+ if (se_sess != se_cmd -> se_sess )
131+ continue ;
132+
133+ /*
134+ * skip task management functions, including
135+ * tmr->task_cmd
136+ */
137+ if (se_cmd -> se_cmd_flags & SCF_SCSI_TMR_CDB )
138+ continue ;
139+
140+ ref_tag = se_cmd -> tag ;
141+ if (tmr -> ref_task_tag != ref_tag )
142+ continue ;
143+
144+ pr_err ("ABORT_TASK: Found referenced %s task_tag: %llu\n" ,
145+ se_cmd -> se_tfo -> fabric_name , ref_tag );
146+
147+ spin_lock (& se_sess -> sess_cmd_lock );
148+ rc = __target_check_io_state (se_cmd , se_sess , 0 );
149+ spin_unlock (& se_sess -> sess_cmd_lock );
150+ if (!rc )
151+ continue ;
152+
153+ list_move_tail (& se_cmd -> state_list , & aborted_list );
154+ se_cmd -> state_active = false;
155+ spin_unlock_irqrestore (& dev -> queues [i ].lock , flags );
156+
157+ /*
158+ * Ensure that this ABORT request is visible to the LU
159+ * RESET code.
160+ */
161+ if (!tmr -> tmr_dev )
162+ WARN_ON_ONCE (transport_lookup_tmr_lun (tmr -> task_cmd ) < 0 );
163+
164+ if (dev -> transport -> tmr_notify )
165+ dev -> transport -> tmr_notify (dev , TMR_ABORT_TASK ,
166+ & aborted_list );
167+
168+ list_del_init (& se_cmd -> state_list );
169+ target_put_cmd_and_wait (se_cmd );
170+
171+ pr_err ("ABORT_TASK: Sending TMR_FUNCTION_COMPLETE for ref_tag: %llu\n" ,
172+ ref_tag );
173+ tmr -> response = TMR_FUNCTION_COMPLETE ;
174+ atomic_long_inc (& dev -> aborts_complete );
175+ return ;
176+ }
177+ spin_unlock_irqrestore (& dev -> queues [i ].lock , flags );
173178 }
174- spin_unlock_irqrestore (& dev -> execute_task_lock , flags );
175179
176180 if (dev -> transport -> tmr_notify )
177181 dev -> transport -> tmr_notify (dev , TMR_ABORT_TASK , & aborted_list );
@@ -273,7 +277,7 @@ static void core_tmr_drain_state_list(
273277 struct se_session * sess ;
274278 struct se_cmd * cmd , * next ;
275279 unsigned long flags ;
276- int rc ;
280+ int rc , i ;
277281
278282 /*
279283 * Complete outstanding commands with TASK_ABORTED SAM status.
@@ -297,35 +301,39 @@ static void core_tmr_drain_state_list(
297301 * Note that this seems to be independent of TAS (Task Aborted Status)
298302 * in the Control Mode Page.
299303 */
300- spin_lock_irqsave (& dev -> execute_task_lock , flags );
301- list_for_each_entry_safe (cmd , next , & dev -> state_list , state_list ) {
302- /*
303- * For PREEMPT_AND_ABORT usage, only process commands
304- * with a matching reservation key.
305- */
306- if (target_check_cdb_and_preempt (preempt_and_abort_list , cmd ))
307- continue ;
308-
309- /*
310- * Not aborting PROUT PREEMPT_AND_ABORT CDB..
311- */
312- if (prout_cmd == cmd )
313- continue ;
314-
315- sess = cmd -> se_sess ;
316- if (WARN_ON_ONCE (!sess ))
317- continue ;
318-
319- spin_lock (& sess -> sess_cmd_lock );
320- rc = __target_check_io_state (cmd , tmr_sess , tas );
321- spin_unlock (& sess -> sess_cmd_lock );
322- if (!rc )
323- continue ;
324-
325- list_move_tail (& cmd -> state_list , & drain_task_list );
326- cmd -> state_active = false;
304+ for (i = 0 ; i < dev -> queue_cnt ; i ++ ) {
305+ spin_lock_irqsave (& dev -> queues [i ].lock , flags );
306+ list_for_each_entry_safe (cmd , next , & dev -> queues [i ].state_list ,
307+ state_list ) {
308+ /*
309+ * For PREEMPT_AND_ABORT usage, only process commands
310+ * with a matching reservation key.
311+ */
312+ if (target_check_cdb_and_preempt (preempt_and_abort_list ,
313+ cmd ))
314+ continue ;
315+
316+ /*
317+ * Not aborting PROUT PREEMPT_AND_ABORT CDB..
318+ */
319+ if (prout_cmd == cmd )
320+ continue ;
321+
322+ sess = cmd -> se_sess ;
323+ if (WARN_ON_ONCE (!sess ))
324+ continue ;
325+
326+ spin_lock (& sess -> sess_cmd_lock );
327+ rc = __target_check_io_state (cmd , tmr_sess , tas );
328+ spin_unlock (& sess -> sess_cmd_lock );
329+ if (!rc )
330+ continue ;
331+
332+ list_move_tail (& cmd -> state_list , & drain_task_list );
333+ cmd -> state_active = false;
334+ }
335+ spin_unlock_irqrestore (& dev -> queues [i ].lock , flags );
327336 }
328- spin_unlock_irqrestore (& dev -> execute_task_lock , flags );
329337
330338 if (dev -> transport -> tmr_notify )
331339 dev -> transport -> tmr_notify (dev , preempt_and_abort_list ?
0 commit comments