From f49a3a6f7dd4af1215c0a495fd0792a19f1c1571 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Mon, 17 Oct 2011 13:56:46 -0400 Subject: [PATCH] --- yaml --- r: 264703 b: refs/heads/master c: cdbb70bb4c17dad0ee23a357030021892a0f60f0 h: refs/heads/master i: 264701: 00c1bfd6592d46d47dde7e6768483990915a7dcd 264699: 7a9436d260180fe0199722162c4ff90a0c7ec846 264695: bb0a76d948248854df26c8f58bed5366e020bc32 264687: 39cb7469df504ff50c17e42866c62e277d11abea 264671: 8f76ba57a8ddd07c887607689f0eb0007b5a2928 264639: 6e1a25360946cbe627a52daf8aa3428afa319b35 264575: 8f4e6a9ba9bd95e02c0f0d1ca79134627d46eae8 264447: fdfc63b7ab56caad357bc64309ca42ac9e3e56e7 264191: b06abeac2fa90f9f53360782482ff97009c3ba8d v: v3 --- [refs] | 2 +- trunk/drivers/target/target_core_tmr.c | 19 +------- trunk/drivers/target/target_core_transport.c | 47 ++++++++++++-------- trunk/include/target/target_core_transport.h | 1 + 4 files changed, 32 insertions(+), 37 deletions(-) diff --git a/[refs] b/[refs] index 100bada47660..7826a1bdc606 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0c2cfe5fe78e682d6235a1d32a363460b1c77528 +refs/heads/master: cdbb70bb4c17dad0ee23a357030021892a0f60f0 diff --git a/trunk/drivers/target/target_core_tmr.c b/trunk/drivers/target/target_core_tmr.c index b8a780fff367..4e963da74a0d 100644 --- a/trunk/drivers/target/target_core_tmr.c +++ b/trunk/drivers/target/target_core_tmr.c @@ -236,7 +236,6 @@ static void core_tmr_drain_task_list( list_del(&task->t_state_list); cmd = task->task_se_cmd; - spin_lock_irqsave(&cmd->t_state_lock, flags); pr_debug("LUN_RESET: %s cmd: %p task: %p" " ITT/CmdSN: 0x%08x/0x%08x, i_state: %d, t_state/" "def_t_state: %d/%d cdb: 0x%02x\n", @@ -256,22 +255,8 @@ static void core_tmr_drain_task_list( atomic_read(&cmd->t_transport_stop), atomic_read(&cmd->t_transport_sent)); - if (task->task_flags & TF_ACTIVE) { - task->task_flags |= TF_REQUEST_STOP; - spin_unlock_irqrestore( - &cmd->t_state_lock, flags); - - pr_debug("LUN_RESET: Waiting for task: %p to shutdown" - " for dev: %p\n", task, dev); - wait_for_completion(&task->task_stop_comp); - pr_debug("LUN_RESET Completed task: %p shutdown for" - " dev: %p\n", task, dev); - - spin_lock_irqsave(&cmd->t_state_lock, flags); - atomic_dec(&cmd->t_task_cdbs_left); - task->task_flags &= ~(TF_ACTIVE | TF_REQUEST_STOP); - } - __transport_stop_task_timer(task, &flags); + spin_lock_irqsave(&cmd->t_state_lock, flags); + target_stop_task(task, &flags); if (!atomic_dec_and_test(&cmd->t_task_cdbs_ex_left)) { spin_unlock_irqrestore(&cmd->t_state_lock, flags); diff --git a/trunk/drivers/target/target_core_transport.c b/trunk/drivers/target/target_core_transport.c index 4dc492d6ae1b..6dab8198ace8 100644 --- a/trunk/drivers/target/target_core_transport.c +++ b/trunk/drivers/target/target_core_transport.c @@ -1762,6 +1762,33 @@ void transport_generic_free_cmd_intr( } EXPORT_SYMBOL(transport_generic_free_cmd_intr); +/* + * If the task is active, request it to be stopped and sleep until it + * has completed. + */ +bool target_stop_task(struct se_task *task, unsigned long *flags) +{ + struct se_cmd *cmd = task->task_se_cmd; + bool was_active = false; + + if (task->task_flags & TF_ACTIVE) { + task->task_flags |= TF_REQUEST_STOP; + spin_unlock_irqrestore(&cmd->t_state_lock, *flags); + + pr_debug("Task %p waiting to complete\n", task); + wait_for_completion(&task->task_stop_comp); + pr_debug("Task %p stopped successfully\n", task); + + spin_lock_irqsave(&cmd->t_state_lock, *flags); + atomic_dec(&cmd->t_task_cdbs_left); + task->task_flags &= ~(TF_ACTIVE | TF_REQUEST_STOP); + was_active = true; + } + + __transport_stop_task_timer(task, flags); + return was_active; +} + static int transport_stop_tasks_for_cmd(struct se_cmd *cmd) { struct se_task *task, *task_tmp; @@ -1793,28 +1820,10 @@ static int transport_stop_tasks_for_cmd(struct se_cmd *cmd) continue; } - /* - * If the struct se_task is active, sleep until it is returned - * from the plugin. - */ - if (task->task_flags & TF_ACTIVE) { - task->task_flags |= TF_REQUEST_STOP; - spin_unlock_irqrestore(&cmd->t_state_lock, - flags); - - pr_debug("Task %p waiting to complete\n", task); - wait_for_completion(&task->task_stop_comp); - pr_debug("Task %p stopped successfully\n", task); - - spin_lock_irqsave(&cmd->t_state_lock, flags); - atomic_dec(&cmd->t_task_cdbs_left); - task->task_flags &= ~(TF_ACTIVE | TF_REQUEST_STOP); - } else { + if (!target_stop_task(task, &flags)) { pr_debug("Task %p - did nothing\n", task); ret++; } - - __transport_stop_task_timer(task, &flags); } spin_unlock_irqrestore(&cmd->t_state_lock, flags); diff --git a/trunk/include/target/target_core_transport.h b/trunk/include/target/target_core_transport.h index 9c7e32870f87..1ba5835426fc 100644 --- a/trunk/include/target/target_core_transport.h +++ b/trunk/include/target/target_core_transport.h @@ -171,6 +171,7 @@ extern int transport_generic_handle_data(struct se_cmd *); extern void transport_new_cmd_failure(struct se_cmd *); extern int transport_generic_handle_tmr(struct se_cmd *); extern void transport_generic_free_cmd_intr(struct se_cmd *); +extern bool target_stop_task(struct se_task *task, unsigned long *flags); extern void __transport_stop_task_timer(struct se_task *, unsigned long *); extern int transport_generic_map_mem_to_cmd(struct se_cmd *cmd, struct scatterlist *, u32, struct scatterlist *, u32);