INIT_LIST_HEAD(&cmd->se_cmd_list);
        INIT_LIST_HEAD(&cmd->state_list);
        init_completion(&cmd->t_transport_stop_comp);
-       init_completion(&cmd->cmd_wait_comp);
+       cmd->compl = NULL;
        spin_lock_init(&cmd->t_state_lock);
        INIT_WORK(&cmd->work, NULL);
        kref_init(&cmd->cmd_kref);
  */
 int transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks)
 {
+       DECLARE_COMPLETION_ONSTACK(compl);
        int ret = 0;
        bool aborted = false, tas = false;
 
                if (cmd->se_lun)
                        transport_lun_remove_cmd(cmd);
        }
+       if (aborted)
+               cmd->compl = &compl;
        if (!aborted || tas)
                ret = target_put_sess_cmd(cmd);
        if (aborted) {
                pr_debug("Detected CMD_T_ABORTED for ITT: %llu\n", cmd->tag);
-               wait_for_completion(&cmd->cmd_wait_comp);
-               cmd->se_tfo->release_cmd(cmd);
+               wait_for_completion(&compl);
                ret = 1;
        }
        return ret;
 {
        struct se_cmd *se_cmd = container_of(kref, struct se_cmd, cmd_kref);
        struct se_session *se_sess = se_cmd->se_sess;
+       struct completion *compl = se_cmd->compl;
        unsigned long flags;
-       bool fabric_stop;
 
        if (se_sess) {
                spin_lock_irqsave(&se_sess->sess_cmd_lock, flags);
                list_del_init(&se_cmd->se_cmd_list);
                if (list_empty(&se_sess->sess_cmd_list))
                        wake_up(&se_sess->cmd_list_wq);
-
-               spin_lock(&se_cmd->t_state_lock);
-               fabric_stop = (se_cmd->transport_state & CMD_T_FABRIC_STOP) &&
-                             (se_cmd->transport_state & CMD_T_ABORTED);
-               spin_unlock(&se_cmd->t_state_lock);
-
-               if (fabric_stop) {
-                       spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
-                       target_free_cmd_mem(se_cmd);
-                       complete(&se_cmd->cmd_wait_comp);
-                       return;
-               }
                spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
        }
 
        target_free_cmd_mem(se_cmd);
        se_cmd->se_tfo->release_cmd(se_cmd);
+       if (compl)
+               complete(compl);
 }
 
 /**
 
        struct se_session       *se_sess;
        struct se_tmr_req       *se_tmr_req;
        struct list_head        se_cmd_list;
-       struct completion       cmd_wait_comp;
+       struct completion       *compl;
        const struct target_core_fabric_ops *se_tfo;
        sense_reason_t          (*execute_cmd)(struct se_cmd *);
        sense_reason_t (*transport_complete_callback)(struct se_cmd *, bool, int *);