aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/target_core_tmr.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/target/target_core_tmr.c')
-rw-r--r--drivers/target/target_core_tmr.c54
1 files changed, 23 insertions, 31 deletions
diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c
index 98204d06cdf..e0ffbdc4a48 100644
--- a/drivers/target/target_core_tmr.c
+++ b/drivers/target/target_core_tmr.c
@@ -244,7 +244,7 @@ static void core_tmr_drain_tmr_list(
244 } 244 }
245} 245}
246 246
247static void core_tmr_drain_task_list( 247static void core_tmr_drain_state_list(
248 struct se_device *dev, 248 struct se_device *dev,
249 struct se_cmd *prout_cmd, 249 struct se_cmd *prout_cmd,
250 struct se_node_acl *tmr_nacl, 250 struct se_node_acl *tmr_nacl,
@@ -252,12 +252,13 @@ static void core_tmr_drain_task_list(
252 struct list_head *preempt_and_abort_list) 252 struct list_head *preempt_and_abort_list)
253{ 253{
254 LIST_HEAD(drain_task_list); 254 LIST_HEAD(drain_task_list);
255 struct se_cmd *cmd; 255 struct se_cmd *cmd, *next;
256 struct se_task *task, *task_tmp;
257 unsigned long flags; 256 unsigned long flags;
258 int fe_count; 257 int fe_count;
258
259 /* 259 /*
260 * Complete outstanding struct se_task CDBs with TASK_ABORTED SAM status. 260 * Complete outstanding commands with TASK_ABORTED SAM status.
261 *
261 * This is following sam4r17, section 5.6 Aborting commands, Table 38 262 * This is following sam4r17, section 5.6 Aborting commands, Table 38
262 * for TMR LUN_RESET: 263 * for TMR LUN_RESET:
263 * 264 *
@@ -278,45 +279,36 @@ static void core_tmr_drain_task_list(
278 * in the Control Mode Page. 279 * in the Control Mode Page.
279 */ 280 */
280 spin_lock_irqsave(&dev->execute_task_lock, flags); 281 spin_lock_irqsave(&dev->execute_task_lock, flags);
281 list_for_each_entry_safe(task, task_tmp, &dev->state_task_list, 282 list_for_each_entry_safe(cmd, next, &dev->state_list, state_list) {
282 t_state_list) {
283 if (!task->task_se_cmd) {
284 pr_err("task->task_se_cmd is NULL!\n");
285 continue;
286 }
287 cmd = task->task_se_cmd;
288
289 /* 283 /*
290 * For PREEMPT_AND_ABORT usage, only process commands 284 * For PREEMPT_AND_ABORT usage, only process commands
291 * with a matching reservation key. 285 * with a matching reservation key.
292 */ 286 */
293 if (target_check_cdb_and_preempt(preempt_and_abort_list, cmd)) 287 if (target_check_cdb_and_preempt(preempt_and_abort_list, cmd))
294 continue; 288 continue;
289
295 /* 290 /*
296 * Not aborting PROUT PREEMPT_AND_ABORT CDB.. 291 * Not aborting PROUT PREEMPT_AND_ABORT CDB..
297 */ 292 */
298 if (prout_cmd == cmd) 293 if (prout_cmd == cmd)
299 continue; 294 continue;
300 295
301 list_move_tail(&task->t_state_list, &drain_task_list); 296 list_move_tail(&cmd->state_list, &drain_task_list);
302 task->t_state_active = false; 297 cmd->state_active = false;
303 /* 298
304 * Remove from task execute list before processing drain_task_list 299 if (!list_empty(&cmd->execute_list))
305 */ 300 __target_remove_from_execute_list(cmd);
306 if (!list_empty(&task->t_execute_list))
307 __transport_remove_task_from_execute_queue(task, dev);
308 } 301 }
309 spin_unlock_irqrestore(&dev->execute_task_lock, flags); 302 spin_unlock_irqrestore(&dev->execute_task_lock, flags);
310 303
311 while (!list_empty(&drain_task_list)) { 304 while (!list_empty(&drain_task_list)) {
312 task = list_entry(drain_task_list.next, struct se_task, t_state_list); 305 cmd = list_entry(drain_task_list.next, struct se_cmd, state_list);
313 list_del(&task->t_state_list); 306 list_del(&cmd->state_list);
314 cmd = task->task_se_cmd;
315 307
316 pr_debug("LUN_RESET: %s cmd: %p task: %p" 308 pr_debug("LUN_RESET: %s cmd: %p"
317 " ITT/CmdSN: 0x%08x/0x%08x, i_state: %d, t_state: %d" 309 " ITT/CmdSN: 0x%08x/0x%08x, i_state: %d, t_state: %d"
318 "cdb: 0x%02x\n", 310 "cdb: 0x%02x\n",
319 (preempt_and_abort_list) ? "Preempt" : "", cmd, task, 311 (preempt_and_abort_list) ? "Preempt" : "", cmd,
320 cmd->se_tfo->get_task_tag(cmd), 0, 312 cmd->se_tfo->get_task_tag(cmd), 0,
321 cmd->se_tfo->get_cmd_state(cmd), cmd->t_state, 313 cmd->se_tfo->get_cmd_state(cmd), cmd->t_state,
322 cmd->t_task_cdb[0]); 314 cmd->t_task_cdb[0]);
@@ -341,12 +333,12 @@ static void core_tmr_drain_task_list(
341 cancel_work_sync(&cmd->work); 333 cancel_work_sync(&cmd->work);
342 334
343 spin_lock_irqsave(&cmd->t_state_lock, flags); 335 spin_lock_irqsave(&cmd->t_state_lock, flags);
344 target_stop_task(task, &flags); 336 target_stop_cmd(cmd, &flags);
345 337
346 if (!atomic_dec_and_test(&cmd->t_task_cdbs_ex_left)) { 338 if (!atomic_dec_and_test(&cmd->t_task_cdbs_ex_left)) {
347 spin_unlock_irqrestore(&cmd->t_state_lock, flags); 339 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
348 pr_debug("LUN_RESET: Skipping task: %p, dev: %p for" 340 pr_debug("LUN_RESET: Skipping cmd: %p, dev: %p for"
349 " t_task_cdbs_ex_left: %d\n", task, dev, 341 " t_task_cdbs_ex_left: %d\n", cmd, dev,
350 atomic_read(&cmd->t_task_cdbs_ex_left)); 342 atomic_read(&cmd->t_task_cdbs_ex_left));
351 continue; 343 continue;
352 } 344 }
@@ -354,7 +346,7 @@ static void core_tmr_drain_task_list(
354 346
355 if (!(cmd->transport_state & CMD_T_ACTIVE)) { 347 if (!(cmd->transport_state & CMD_T_ACTIVE)) {
356 pr_debug("LUN_RESET: got CMD_T_ACTIVE for" 348 pr_debug("LUN_RESET: got CMD_T_ACTIVE for"
357 " task: %p, t_fe_count: %d dev: %p\n", task, 349 " cdb: %p, t_fe_count: %d dev: %p\n", cmd,
358 fe_count, dev); 350 fe_count, dev);
359 cmd->transport_state |= CMD_T_ABORTED; 351 cmd->transport_state |= CMD_T_ABORTED;
360 spin_unlock_irqrestore(&cmd->t_state_lock, flags); 352 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
@@ -362,8 +354,8 @@ static void core_tmr_drain_task_list(
362 core_tmr_handle_tas_abort(tmr_nacl, cmd, tas, fe_count); 354 core_tmr_handle_tas_abort(tmr_nacl, cmd, tas, fe_count);
363 continue; 355 continue;
364 } 356 }
365 pr_debug("LUN_RESET: Got !CMD_T_ACTIVE for task: %p," 357 pr_debug("LUN_RESET: Got !CMD_T_ACTIVE for cdb: %p,"
366 " t_fe_count: %d dev: %p\n", task, fe_count, dev); 358 " t_fe_count: %d dev: %p\n", cmd, fe_count, dev);
367 cmd->transport_state |= CMD_T_ABORTED; 359 cmd->transport_state |= CMD_T_ABORTED;
368 spin_unlock_irqrestore(&cmd->t_state_lock, flags); 360 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
369 361
@@ -464,7 +456,7 @@ int core_tmr_lun_reset(
464 dev->transport->name, tas); 456 dev->transport->name, tas);
465 457
466 core_tmr_drain_tmr_list(dev, tmr, preempt_and_abort_list); 458 core_tmr_drain_tmr_list(dev, tmr, preempt_and_abort_list);
467 core_tmr_drain_task_list(dev, prout_cmd, tmr_nacl, tas, 459 core_tmr_drain_state_list(dev, prout_cmd, tmr_nacl, tas,
468 preempt_and_abort_list); 460 preempt_and_abort_list);
469 core_tmr_drain_cmd_list(dev, prout_cmd, tmr_nacl, tas, 461 core_tmr_drain_cmd_list(dev, prout_cmd, tmr_nacl, tas,
470 preempt_and_abort_list); 462 preempt_and_abort_list);