NVMe: Skip orderly shutdown on failed devices
authorKeith Busch <keith.busch@intel.com>
Wed, 25 Jun 2014 17:18:12 +0000 (11:18 -0600)
committerJens Axboe <axboe@fb.com>
Tue, 4 Nov 2014 20:17:08 +0000 (13:17 -0700)
Rather than skipping shutdown only for devices that have been removed,
skip the orderly shutdown on failed devices to avoid the long timeout
handling that inevitably happens when deleting queues on such a device.

Signed-off-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/block/nvme-core.c

index c5f379f08f50ed122143dec03bb3cfc73ac5f09c..ac3694083e89e5c9bc1ca3ddb31b9750e594c097 100644 (file)
@@ -2567,11 +2567,14 @@ static void nvme_dev_list_remove(struct nvme_dev *dev)
 static void nvme_dev_shutdown(struct nvme_dev *dev)
 {
        int i;
+       u32 csts = -1;
 
        dev->initialized = 0;
        nvme_dev_list_remove(dev);
 
-       if (!dev->bar || (dev->bar && readl(&dev->bar->csts) == -1)) {
+       if (dev->bar)
+               csts = readl(&dev->bar->csts);
+       if (csts & NVME_CSTS_CFS || !(csts & NVME_CSTS_RDY)) {
                for (i = dev->queue_count - 1; i >= 0; i--) {
                        struct nvme_queue *nvmeq = raw_nvmeq(dev, i);
                        nvme_suspend_queue(nvmeq);