NVMe: Return real error from nvme_create_queue
authorMatthew Wilcox <matthew.r.wilcox@intel.com>
Wed, 11 May 2011 20:30:59 +0000 (13:30 -0700)
committerMatthew Wilcox <matthew.r.wilcox@intel.com>
Fri, 4 Nov 2011 19:53:03 +0000 (15:53 -0400)
nvme_setup_io_queues() was assuming that a NULL return from
nvme_create_queue() was an out-of-memory error.  That's not necessarily
true; the adapter might return -EIO, for example.  Change the calling
convention to return an ERR_PTR on failure instead of NULL.

Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
drivers/block/nvme.c

index d1cd91becdb0d2e4c46c2ffc42dd15e38e5cca2e..843edbd79c56c9b103c3a5c345387351a5b4f1f3 100644 (file)
@@ -892,7 +892,7 @@ static __devinit struct nvme_queue *nvme_create_queue(struct nvme_dev *dev,
        struct nvme_queue *nvmeq = nvme_alloc_queue(dev, qid, cq_size, vector);
 
        if (!nvmeq)
-               return NULL;
+               return ERR_PTR(-ENOMEM);
 
        result = adapter_alloc_cq(dev, qid, nvmeq);
        if (result < 0)
@@ -918,7 +918,7 @@ static __devinit struct nvme_queue *nvme_create_queue(struct nvme_dev *dev,
        dma_free_coherent(nvmeq->q_dmadev, SQ_SIZE(nvmeq->q_depth),
                                        nvmeq->sq_cmds, nvmeq->sq_dma_addr);
        kfree(nvmeq);
-       return NULL;
+       return ERR_PTR(result);
 }
 
 static int __devinit nvme_configure_admin_queue(struct nvme_dev *dev)
@@ -1421,8 +1421,8 @@ static int __devinit nvme_setup_io_queues(struct nvme_dev *dev)
        for (i = 0; i < nr_io_queues; i++) {
                dev->queues[i + 1] = nvme_create_queue(dev, i + 1,
                                                        NVME_Q_DEPTH, i);
-               if (!dev->queues[i + 1])
-                       return -ENOMEM;
+               if (IS_ERR(dev->queues[i + 1]))
+                       return PTR_ERR(dev->queues[i + 1]);
                dev->queue_count++;
        }