u32 cmbsz;
        u32 cmbloc;
        struct nvme_ctrl ctrl;
-       struct completion ioq_wait;
 
        mempool_t *iod_mempool;
 
        unsigned long flags;
 #define NVMEQ_ENABLED          0
 #define NVMEQ_SQ_CMB           1
+#define NVMEQ_DELETE_ERROR     2
        u32 *dbbuf_sq_db;
        u32 *dbbuf_cq_db;
        u32 *dbbuf_sq_ei;
        u32 *dbbuf_cq_ei;
+       struct completion delete_done;
 };
 
 /*
        int result;
        s16 vector;
 
+       clear_bit(NVMEQ_DELETE_ERROR, &nvmeq->flags);
+
        /*
         * A queue's vector matches the queue identifier unless the controller
         * has only one vector available.
        struct nvme_queue *nvmeq = req->end_io_data;
 
        blk_mq_free_request(req);
-       complete(&nvmeq->dev->ioq_wait);
+       complete(&nvmeq->delete_done);
 }
 
 static void nvme_del_cq_end(struct request *req, blk_status_t error)
 {
        struct nvme_queue *nvmeq = req->end_io_data;
 
-       if (!error)
-               nvme_poll_irqdisable(nvmeq, -1);
+       if (error)
+               set_bit(NVMEQ_DELETE_ERROR, &nvmeq->flags);
 
        nvme_del_queue_end(req, error);
 }
        req->timeout = ADMIN_TIMEOUT;
        req->end_io_data = nvmeq;
 
+       init_completion(&nvmeq->delete_done);
        blk_execute_rq_nowait(q, NULL, req, false,
                        opcode == nvme_admin_delete_cq ?
                                nvme_del_cq_end : nvme_del_queue_end);
        int nr_queues = dev->online_queues - 1, sent = 0;
        unsigned long timeout;
 
-       reinit_completion(&dev->ioq_wait);
  retry:
        timeout = ADMIN_TIMEOUT;
        while (nr_queues > 0) {
                nr_queues--;
                sent++;
        }
-       while (sent--) {
-               timeout = wait_for_completion_io_timeout(&dev->ioq_wait,
+       while (sent) {
+               struct nvme_queue *nvmeq = &dev->queues[nr_queues + sent];
+
+               timeout = wait_for_completion_io_timeout(&nvmeq->delete_done,
                                timeout);
                if (timeout == 0)
                        return false;
+
+               /* handle any remaining CQEs */
+               if (opcode == nvme_admin_delete_cq &&
+                   !test_bit(NVMEQ_DELETE_ERROR, &nvmeq->flags))
+                       nvme_poll_irqdisable(nvmeq, -1);
+
+               sent--;
                if (nr_queues)
                        goto retry;
        }
        INIT_WORK(&dev->ctrl.reset_work, nvme_reset_work);
        INIT_WORK(&dev->remove_work, nvme_remove_dead_ctrl_work);
        mutex_init(&dev->shutdown_lock);
-       init_completion(&dev->ioq_wait);
 
        result = nvme_setup_prp_pools(dev);
        if (result)