NVMe: Fix irq freeing when queue_request_irq fails
authorJon Derrick <jonathan.derrick@intel.com>
Tue, 30 Jun 2015 17:22:52 +0000 (11:22 -0600)
committerJens Axboe <axboe@fb.com>
Thu, 2 Jul 2015 15:01:25 +0000 (09:01 -0600)
Fixes an issue when queue_reuest_irq fails in nvme_setup_io_queues. This
patch initializes all vectors to -1 and resets the vector to -1 in the
case of a failure in queue_request_irq. This avoids the free_irq in
nvme_suspend_queue if the queue did not get an irq.

Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/block/nvme-core.c

index 34338d7438f56895f76ac8b110d8e92a120b3202..d1d6141920d3ced742d850b051d273d65aa3728e 100644 (file)
@@ -1474,6 +1474,7 @@ static struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, int qid,
        nvmeq->q_db = &dev->dbs[qid * 2 * dev->db_stride];
        nvmeq->q_depth = depth;
        nvmeq->qid = qid;
+       nvmeq->cq_vector = -1;
        dev->queues[qid] = nvmeq;
 
        /* make sure queue descriptor is set before queue count, for kthread */
@@ -1726,8 +1727,10 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev)
 
        nvmeq->cq_vector = 0;
        result = queue_request_irq(dev, nvmeq, nvmeq->irqname);
-       if (result)
+       if (result) {
+               nvmeq->cq_vector = -1;
                goto free_nvmeq;
+       }
 
        return result;
 
@@ -2213,8 +2216,10 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
        dev->max_qid = nr_io_queues;
 
        result = queue_request_irq(dev, adminq, adminq->irqname);
-       if (result)
+       if (result) {
+               adminq->cq_vector = -1;
                goto free_queues;
+       }
 
        /* Free previously allocated queues that are no longer usable */
        nvme_free_queues(dev, nr_io_queues + 1);