]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
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)
committerChuck Anderson <chuck.anderson@oracle.com>
Wed, 6 Jul 2016 23:31:48 +0000 (16:31 -0700)
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>
(cherry picked from commit 758dd7fdffd60507624edce34fff122a63163b3f)

Orabug: 22620486
Signed-off-by: Jason Luo <zhangqing.luo@oracle.com>
drivers/block/nvme-core.c

index b0ca89d2e48818da38febd1e59ee9eb576ef73ec..a96948780d1fdc428c03bc028de39f9afe363dcf 100644 (file)
@@ -1481,6 +1481,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 */
@@ -1734,8 +1735,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;
 
@@ -2216,8 +2219,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);