diff options
Diffstat (limited to 'drivers/block/nvme-core.c')
-rw-r--r-- | drivers/block/nvme-core.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index 16a886c2b73d..93ee55ee3775 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c | |||
@@ -1853,6 +1853,35 @@ static int nvme_getgeo(struct block_device *bd, struct hd_geometry *geo) | |||
1853 | return 0; | 1853 | return 0; |
1854 | } | 1854 | } |
1855 | 1855 | ||
1856 | static int nvme_revalidate_disk(struct gendisk *disk) | ||
1857 | { | ||
1858 | struct nvme_ns *ns = disk->private_data; | ||
1859 | struct nvme_dev *dev = ns->dev; | ||
1860 | struct nvme_id_ns *id; | ||
1861 | dma_addr_t dma_addr; | ||
1862 | int lbaf; | ||
1863 | |||
1864 | id = dma_alloc_coherent(&dev->pci_dev->dev, 4096, &dma_addr, | ||
1865 | GFP_KERNEL); | ||
1866 | if (!id) { | ||
1867 | dev_warn(&dev->pci_dev->dev, "%s: Memory alocation failure\n", | ||
1868 | __func__); | ||
1869 | return 0; | ||
1870 | } | ||
1871 | |||
1872 | if (nvme_identify(dev, ns->ns_id, 0, dma_addr)) | ||
1873 | goto free; | ||
1874 | |||
1875 | lbaf = id->flbas & 0xf; | ||
1876 | ns->lba_shift = id->lbaf[lbaf].ds; | ||
1877 | |||
1878 | blk_queue_logical_block_size(ns->queue, 1 << ns->lba_shift); | ||
1879 | set_capacity(disk, le64_to_cpup(&id->nsze) << (ns->lba_shift - 9)); | ||
1880 | free: | ||
1881 | dma_free_coherent(&dev->pci_dev->dev, 4096, id, dma_addr); | ||
1882 | return 0; | ||
1883 | } | ||
1884 | |||
1856 | static const struct block_device_operations nvme_fops = { | 1885 | static const struct block_device_operations nvme_fops = { |
1857 | .owner = THIS_MODULE, | 1886 | .owner = THIS_MODULE, |
1858 | .ioctl = nvme_ioctl, | 1887 | .ioctl = nvme_ioctl, |
@@ -1860,6 +1889,7 @@ static const struct block_device_operations nvme_fops = { | |||
1860 | .open = nvme_open, | 1889 | .open = nvme_open, |
1861 | .release = nvme_release, | 1890 | .release = nvme_release, |
1862 | .getgeo = nvme_getgeo, | 1891 | .getgeo = nvme_getgeo, |
1892 | .revalidate_disk= nvme_revalidate_disk, | ||
1863 | }; | 1893 | }; |
1864 | 1894 | ||
1865 | static void nvme_resubmit_iods(struct nvme_queue *nvmeq) | 1895 | static void nvme_resubmit_iods(struct nvme_queue *nvmeq) |