INIT_LIST_HEAD(&se_sess->sess_list);
        INIT_LIST_HEAD(&se_sess->sess_acl_list);
        INIT_LIST_HEAD(&se_sess->sess_cmd_list);
+       INIT_LIST_HEAD(&se_sess->sess_wait_list);
        spin_lock_init(&se_sess->sess_cmd_lock);
        kref_init(&se_sess->sess_kref);
 
        unsigned long flags;
 
        spin_lock_irqsave(&se_sess->sess_cmd_lock, flags);
-
-       WARN_ON(se_sess->sess_tearing_down);
+       if (se_sess->sess_tearing_down) {
+               spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
+               return;
+       }
        se_sess->sess_tearing_down = 1;
+       list_splice_init(&se_sess->sess_cmd_list, &se_sess->sess_wait_list);
 
-       list_for_each_entry(se_cmd, &se_sess->sess_cmd_list, se_cmd_list)
+       list_for_each_entry(se_cmd, &se_sess->sess_wait_list, se_cmd_list)
                se_cmd->cmd_wait_set = 1;
 
        spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
 void target_wait_for_sess_cmds(struct se_session *se_sess)
 {
        struct se_cmd *se_cmd, *tmp_cmd;
+       unsigned long flags;
 
        list_for_each_entry_safe(se_cmd, tmp_cmd,
-                               &se_sess->sess_cmd_list, se_cmd_list) {
+                               &se_sess->sess_wait_list, se_cmd_list) {
                list_del(&se_cmd->se_cmd_list);
 
                pr_debug("Waiting for se_cmd: %p t_state: %d, fabric state:"
 
                se_cmd->se_tfo->release_cmd(se_cmd);
        }
+
+       spin_lock_irqsave(&se_sess->sess_cmd_lock, flags);
+       WARN_ON(!list_empty(&se_sess->sess_cmd_list));
+       spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
+
 }
 EXPORT_SYMBOL(target_wait_for_sess_cmds);