spin_unlock(&qedi_conn->list_lock);
 
        cmd->state = RESPONSE_RECEIVED;
-       qedi_clear_task_idx(qedi, cmd->task_id);
        __iscsi_complete_pdu(conn, (struct iscsi_hdr *)resp_hdr, NULL, 0);
 
        spin_unlock(&session->back_lock);
        spin_unlock(&qedi_conn->list_lock);
 
        cmd->state = RESPONSE_RECEIVED;
-       qedi_clear_task_idx(qedi, cmd->task_id);
 
        __iscsi_complete_pdu(conn, (struct iscsi_hdr *)resp_hdr_ptr,
                             qedi_conn->gen_pdu.resp_buf,
        iscsi_block_session(session->cls_session);
        rval = qedi_cleanup_all_io(qedi, qedi_conn, qedi_cmd->task, true);
        if (rval) {
-               qedi_clear_task_idx(qedi, qedi_cmd->task_id);
                iscsi_unblock_session(session->cls_session);
                goto exit_tmf_resp;
        }
 
        iscsi_unblock_session(session->cls_session);
-       qedi_clear_task_idx(qedi, qedi_cmd->task_id);
 
        spin_lock(&session->back_lock);
        __iscsi_complete_pdu(conn, (struct iscsi_hdr *)resp_hdr_ptr, NULL, 0);
                goto unblock_sess;
        }
 
-       qedi_clear_task_idx(qedi, qedi_cmd->task_id);
-
        __iscsi_complete_pdu(conn, (struct iscsi_hdr *)resp_hdr_ptr, NULL, 0);
        kfree(resp_hdr_ptr);
 
                  "Freeing tid=0x%x for cid=0x%x\n",
                  cmd->task_id, qedi_conn->iscsi_conn_id);
        cmd->state = RESPONSE_RECEIVED;
-       qedi_clear_task_idx(qedi, cmd->task_id);
 }
 
 static void qedi_get_rq_bdq_buf(struct qedi_ctx *qedi,
                }
 
                spin_unlock(&qedi_conn->list_lock);
-               qedi_clear_task_idx(qedi, cmd->task_id);
        }
 
 done:
        if (qedi_io_tracing)
                qedi_trace_io(qedi, task, cmd->task_id, QEDI_IO_TRACE_RSP);
 
-       qedi_clear_task_idx(qedi, cmd->task_id);
        __iscsi_complete_pdu(conn, (struct iscsi_hdr *)hdr,
                             conn->data, datalen);
 error:
                  cqe->itid, cmd->task_id);
 
        cmd->state = RESPONSE_RECEIVED;
-       qedi_clear_task_idx(qedi, cmd->task_id);
 
        spin_lock_bh(&session->back_lock);
        __iscsi_put_task(task);
        itt_t protoitt = 0;
        int found = 0;
        struct qedi_cmd *qedi_cmd = NULL;
-       u32 rtid = 0;
        u32 iscsi_cid;
        struct qedi_conn *qedi_conn;
        struct qedi_cmd *dbg_cmd;
                        found = 1;
                        mtask = qedi_cmd->task;
                        tmf_hdr = (struct iscsi_tm *)mtask->hdr;
-                       rtid = work->rtid;
 
                        list_del_init(&work->list);
                        kfree(work);
                        if (qedi_cmd->state == CLEANUP_WAIT_FAILED)
                                qedi_cmd->state = CLEANUP_RECV;
 
-                       qedi_clear_task_idx(qedi_conn->qedi, rtid);
-
                        spin_lock(&qedi_conn->list_lock);
                        if (likely(dbg_cmd->io_cmd_in_list)) {
                                dbg_cmd->io_cmd_in_list = false;
                QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_TID,
                          "Freeing tid=0x%x for cid=0x%x\n",
                          cqe->itid, qedi_conn->iscsi_conn_id);
-               qedi_clear_task_idx(qedi_conn->qedi, cqe->itid);
 
        } else {
                qedi_get_proto_itt(qedi, cqe->itid, &ptmp_itt);
 
        }
 
        cmd->conn = conn->dd_data;
-       cmd->scsi_cmd = NULL;
        return qedi_iscsi_send_generic_request(task);
 }
 
        struct qedi_cmd *cmd = task->dd_data;
        struct scsi_cmnd *sc = task->sc;
 
+       /* Clear now so in cleanup_task we know it didn't make it */
+       cmd->scsi_cmd = NULL;
+       cmd->task_id = U16_MAX;
+
        if (test_bit(QEDI_IN_SHUTDOWN, &qedi_conn->qedi->flags))
                return -ENODEV;
 
 
 static void qedi_cleanup_task(struct iscsi_task *task)
 {
-       if (!task->sc || task->state == ISCSI_TASK_PENDING) {
+       struct qedi_cmd *cmd;
+
+       if (task->state == ISCSI_TASK_PENDING) {
                QEDI_INFO(NULL, QEDI_LOG_IO, "Returning ref_cnt=%d\n",
                          refcount_read(&task->refcount));
                return;
        }
 
-       qedi_iscsi_unmap_sg_list(task->dd_data);
+       if (task->sc)
+               qedi_iscsi_unmap_sg_list(task->dd_data);
+
+       cmd = task->dd_data;
+       if (cmd->task_id != U16_MAX)
+               qedi_clear_task_idx(iscsi_host_priv(task->conn->session->host),
+                                   cmd->task_id);
+
+       cmd->task_id = U16_MAX;
+       cmd->scsi_cmd = NULL;
 }
 
 struct iscsi_transport qedi_iscsi_transport = {