diff options
author | Christoph Hellwig <hch@infradead.org> | 2012-04-24 00:25:05 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2012-05-06 18:11:26 -0400 |
commit | cf572a9627c9ae86082216de109780c1d2e2ee28 (patch) | |
tree | fe6eec75bc3c388534390efe3be2b3b2c4c93903 /drivers/target/target_core_tmr.c | |
parent | 785fdf70b2b46588c973ad8b65ed62871994452f (diff) |
target: move the state and execute lists to the command
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/target_core_tmr.c')
-rw-r--r-- | drivers/target/target_core_tmr.c | 54 |
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 | ||
247 | static void core_tmr_drain_task_list( | 247 | static 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); |