[PATCH] NVMe: Add revalidate_disk callback
Sam Bradshaw (sbradshaw)
sbradshaw at micron.com
Thu Sep 11 10:15:34 PDT 2014
> -----Original Message-----
> From: Linux-nvme [mailto:linux-nvme-bounces at lists.infradead.org] On
> Behalf Of Keith Busch
> Sent: Wednesday, September 10, 2014 4:21 PM
> To: linux-nvme at lists.infradead.org
> Cc: Keith Busch
> Subject: [PATCH] NVMe: Add revalidate_disk callback
>
> This adds a callback to revalidate the disk and change its block size
> and capacity if needed. Before, a user would have to remove + rescan
> an entire device if they changed the logical block size using an NVMe
> Format or other vendor specific command; now they can just run
> something
> that issues the BLKRRPART IOCTL, like
>
> # hdparm -z /dev/nvmeXnY
>
> This can also be used in response to the 1.2 Spec's Namespace Attribute
> Change asynchronous event.
>
> Signed-off-by: Keith Busch <keith.busch at intel.com>
> ---
> drivers/block/nvme-core.c | 30 ++++++++++++++++++++++++++++++
> 1 file changed, 30 insertions(+)
>
> diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c
> index 1b9cd27..2e0f95f 100644
> --- a/drivers/block/nvme-core.c
> +++ b/drivers/block/nvme-core.c
> @@ -1833,6 +1833,35 @@ static int nvme_getgeo(struct block_device *bd,
> struct hd_geometry *geo)
> return 0;
> }
>
> +static int nvme_revalidate_disk(struct gendisk *disk)
> +{
> + struct nvme_ns *ns = disk->private_data;
> + struct nvme_dev *dev = ns->dev;
> + struct nvme_id_ns *id;
> + dma_addr_t dma_addr;
> + int lbaf;
> +
> + id = dma_alloc_coherent(&dev->pci_dev->dev, 4096, &dma_addr,
> + GFP_KERNEL);
> + if (!id) {
> + dev_warn(&dev->pci_dev->dev, "%s: Memory alocation
> failure\n",
> + __func__);
> + return 0;
> + }
> +
> + if (nvme_identify(dev, ns->ns_id, 0, dma_addr))
> + goto free;
> +
> + lbaf = id->flbas & 0xf;
> + ns->lba_shift = id->lbaf[lbaf].ds;
> +
> + blk_queue_logical_block_size(ns->queue, 1 << ns->lba_shift);
> + set_capacity(disk, le64_to_cpup(&id->nsze) << (ns->lba_shift -
> 9));
> + free:
> + dma_free_coherent(&dev->pci_dev->dev, 4091, id, dma_addr);
4096, right?
More information about the Linux-nvme
mailing list