target: Fix bug with task_sg chained transport_free_dev_tasks release
[linux-flexiantxendom0-natty.git] / drivers / target / target_core_transport.c
index a0ad2f4..0ddcc26 100644 (file)
@@ -765,7 +765,6 @@ static void transport_lun_remove_cmd(struct se_cmd *cmd)
        transport_all_task_dev_remove_state(cmd);
        spin_unlock_irqrestore(&T_TASK(cmd)->t_state_lock, flags);
 
-       transport_free_dev_tasks(cmd);
 
 check_lun:
        spin_lock_irqsave(&lun->lun_cmd_lock, flags);
@@ -2062,6 +2061,13 @@ int transport_generic_handle_tmr(
 }
 EXPORT_SYMBOL(transport_generic_handle_tmr);
 
+void transport_generic_free_cmd_intr(
+       struct se_cmd *cmd)
+{
+       transport_add_cmd_to_queue(cmd, TRANSPORT_FREE_CMD_INTR);
+}
+EXPORT_SYMBOL(transport_generic_free_cmd_intr);
+
 static int transport_stop_tasks_for_cmd(struct se_cmd *cmd)
 {
        struct se_task *task, *task_tmp;
@@ -5302,6 +5308,8 @@ void transport_generic_free_cmd(
                if (wait_for_tasks && cmd->transport_wait_for_tasks)
                        cmd->transport_wait_for_tasks(cmd, 0, 0);
 
+               transport_free_dev_tasks(cmd);
+
                transport_generic_remove(cmd, release_to_pool,
                                session_reinstatement);
        }
@@ -6142,6 +6150,9 @@ get_cmd:
                case TRANSPORT_REMOVE:
                        transport_generic_remove(cmd, 1, 0);
                        break;
+               case TRANSPORT_FREE_CMD_INTR:
+                       transport_generic_free_cmd(cmd, 0, 1, 0);
+                       break;
                case TRANSPORT_PROCESS_TMR:
                        transport_generic_do_tmr(cmd);
                        break;