diff options
-rw-r--r-- | drivers/block/nvme-core.c | 77 |
1 files changed, 47 insertions, 30 deletions
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index 95e28b6bcd09..1595ffba8a66 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c | |||
@@ -1827,10 +1827,6 @@ static int nvme_dev_add(struct nvme_dev *dev) | |||
1827 | dma_addr_t dma_addr; | 1827 | dma_addr_t dma_addr; |
1828 | int shift = NVME_CAP_MPSMIN(readq(&dev->bar->cap)) + 12; | 1828 | int shift = NVME_CAP_MPSMIN(readq(&dev->bar->cap)) + 12; |
1829 | 1829 | ||
1830 | res = nvme_setup_io_queues(dev); | ||
1831 | if (res) | ||
1832 | return res; | ||
1833 | |||
1834 | mem = dma_alloc_coherent(&dev->pci_dev->dev, 8192, &dma_addr, | 1830 | mem = dma_alloc_coherent(&dev->pci_dev->dev, 8192, &dma_addr, |
1835 | GFP_KERNEL); | 1831 | GFP_KERNEL); |
1836 | if (!mem) | 1832 | if (!mem) |
@@ -1936,27 +1932,29 @@ static void nvme_dev_unmap(struct nvme_dev *dev) | |||
1936 | pci_disable_device(dev->pci_dev); | 1932 | pci_disable_device(dev->pci_dev); |
1937 | } | 1933 | } |
1938 | 1934 | ||
1939 | static int nvme_dev_remove(struct nvme_dev *dev) | 1935 | static void nvme_dev_shutdown(struct nvme_dev *dev) |
1940 | { | 1936 | { |
1941 | struct nvme_ns *ns, *next; | ||
1942 | int i; | 1937 | int i; |
1943 | 1938 | ||
1944 | for (i = dev->queue_count - 1; i >= 0; i--) | 1939 | for (i = dev->queue_count - 1; i >= 0; i--) |
1945 | nvme_disable_queue(dev, i); | 1940 | nvme_disable_queue(dev, i); |
1946 | 1941 | ||
1947 | spin_lock(&dev_list_lock); | 1942 | spin_lock(&dev_list_lock); |
1948 | list_del(&dev->node); | 1943 | list_del_init(&dev->node); |
1949 | spin_unlock(&dev_list_lock); | 1944 | spin_unlock(&dev_list_lock); |
1950 | 1945 | ||
1946 | nvme_dev_unmap(dev); | ||
1947 | } | ||
1948 | |||
1949 | static void nvme_dev_remove(struct nvme_dev *dev) | ||
1950 | { | ||
1951 | struct nvme_ns *ns, *next; | ||
1952 | |||
1951 | list_for_each_entry_safe(ns, next, &dev->namespaces, list) { | 1953 | list_for_each_entry_safe(ns, next, &dev->namespaces, list) { |
1952 | list_del(&ns->list); | 1954 | list_del(&ns->list); |
1953 | del_gendisk(ns->disk); | 1955 | del_gendisk(ns->disk); |
1954 | nvme_ns_free(ns); | 1956 | nvme_ns_free(ns); |
1955 | } | 1957 | } |
1956 | |||
1957 | nvme_free_queues(dev); | ||
1958 | |||
1959 | return 0; | ||
1960 | } | 1958 | } |
1961 | 1959 | ||
1962 | static int nvme_setup_prp_pools(struct nvme_dev *dev) | 1960 | static int nvme_setup_prp_pools(struct nvme_dev *dev) |
@@ -2016,7 +2014,8 @@ static void nvme_free_dev(struct kref *kref) | |||
2016 | { | 2014 | { |
2017 | struct nvme_dev *dev = container_of(kref, struct nvme_dev, kref); | 2015 | struct nvme_dev *dev = container_of(kref, struct nvme_dev, kref); |
2018 | nvme_dev_remove(dev); | 2016 | nvme_dev_remove(dev); |
2019 | nvme_dev_unmap(dev); | 2017 | nvme_dev_shutdown(dev); |
2018 | nvme_free_queues(dev); | ||
2020 | nvme_release_instance(dev); | 2019 | nvme_release_instance(dev); |
2021 | nvme_release_prp_pools(dev); | 2020 | nvme_release_prp_pools(dev); |
2022 | kfree(dev->queues); | 2021 | kfree(dev->queues); |
@@ -2059,6 +2058,37 @@ static const struct file_operations nvme_dev_fops = { | |||
2059 | .compat_ioctl = nvme_dev_ioctl, | 2058 | .compat_ioctl = nvme_dev_ioctl, |
2060 | }; | 2059 | }; |
2061 | 2060 | ||
2061 | static int nvme_dev_start(struct nvme_dev *dev) | ||
2062 | { | ||
2063 | int result; | ||
2064 | |||
2065 | result = nvme_dev_map(dev); | ||
2066 | if (result) | ||
2067 | return result; | ||
2068 | |||
2069 | result = nvme_configure_admin_queue(dev); | ||
2070 | if (result) | ||
2071 | goto unmap; | ||
2072 | |||
2073 | spin_lock(&dev_list_lock); | ||
2074 | list_add(&dev->node, &dev_list); | ||
2075 | spin_unlock(&dev_list_lock); | ||
2076 | |||
2077 | result = nvme_setup_io_queues(dev); | ||
2078 | if (result) | ||
2079 | goto disable; | ||
2080 | |||
2081 | return 0; | ||
2082 | |||
2083 | disable: | ||
2084 | spin_lock(&dev_list_lock); | ||
2085 | list_del_init(&dev->node); | ||
2086 | spin_unlock(&dev_list_lock); | ||
2087 | unmap: | ||
2088 | nvme_dev_unmap(dev); | ||
2089 | return result; | ||
2090 | } | ||
2091 | |||
2062 | static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) | 2092 | static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
2063 | { | 2093 | { |
2064 | int result = -ENOMEM; | 2094 | int result = -ENOMEM; |
@@ -2086,21 +2116,13 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2086 | if (result) | 2116 | if (result) |
2087 | goto release; | 2117 | goto release; |
2088 | 2118 | ||
2089 | result = nvme_dev_map(dev); | 2119 | result = nvme_dev_start(dev); |
2090 | if (result) | 2120 | if (result) |
2091 | goto release_pools; | 2121 | goto release_pools; |
2092 | 2122 | ||
2093 | result = nvme_configure_admin_queue(dev); | ||
2094 | if (result) | ||
2095 | goto unmap; | ||
2096 | |||
2097 | spin_lock(&dev_list_lock); | ||
2098 | list_add(&dev->node, &dev_list); | ||
2099 | spin_unlock(&dev_list_lock); | ||
2100 | |||
2101 | result = nvme_dev_add(dev); | 2123 | result = nvme_dev_add(dev); |
2102 | if (result && result != -EBUSY) | 2124 | if (result && result != -EBUSY) |
2103 | goto delete; | 2125 | goto shutdown; |
2104 | 2126 | ||
2105 | scnprintf(dev->name, sizeof(dev->name), "nvme%d", dev->instance); | 2127 | scnprintf(dev->name, sizeof(dev->name), "nvme%d", dev->instance); |
2106 | dev->miscdev.minor = MISC_DYNAMIC_MINOR; | 2128 | dev->miscdev.minor = MISC_DYNAMIC_MINOR; |
@@ -2116,15 +2138,10 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2116 | 2138 | ||
2117 | remove: | 2139 | remove: |
2118 | nvme_dev_remove(dev); | 2140 | nvme_dev_remove(dev); |
2119 | delete: | 2141 | shutdown: |
2120 | spin_lock(&dev_list_lock); | 2142 | nvme_dev_shutdown(dev); |
2121 | list_del(&dev->node); | ||
2122 | spin_unlock(&dev_list_lock); | ||
2123 | |||
2124 | nvme_free_queues(dev); | ||
2125 | unmap: | ||
2126 | nvme_dev_unmap(dev); | ||
2127 | release_pools: | 2143 | release_pools: |
2144 | nvme_free_queues(dev); | ||
2128 | nvme_release_prp_pools(dev); | 2145 | nvme_release_prp_pools(dev); |
2129 | release: | 2146 | release: |
2130 | nvme_release_instance(dev); | 2147 | nvme_release_instance(dev); |