]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
nvme: lightnvm: add late setup of block size and metadata
authorMatias Bjørling <mb@lightnvm.io>
Thu, 29 Mar 2018 22:05:05 +0000 (00:05 +0200)
committerJens Axboe <axboe@kernel.dk>
Thu, 29 Mar 2018 23:29:09 +0000 (17:29 -0600)
The nvme driver sets up the size of the nvme namespace in two steps.
First it initializes the device with standard logical block and
metadata sizes, and then sets the correct logical block and metadata
size. Due to the OCSSD 2.0 specification relies on the namespace to
expose these sizes for correct initialization, let it be updated
appropriately on the LightNVM side as well.

Signed-off-by: Matias Bjørling <mb@lightnvm.io>
Acked-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/lightnvm/core.c
drivers/nvme/host/core.c
drivers/nvme/host/lightnvm.c
drivers/nvme/host/nvme.h

index 9704db219866ae4b86573bec8ef82991f1f5f941..3eec948d1b7ef59995e263fedf1803d4827783c8 100644 (file)
@@ -864,8 +864,6 @@ static int nvm_core_init(struct nvm_dev *dev)
        geo->ws_seq = id->ws_seq;
        geo->ws_per_chk = id->ws_per_chk;
        geo->nr_chks = id->num_chk;
-       geo->sec_size = id->csecs;
-       geo->oob_size = id->sos;
        geo->mccap = id->mccap;
 
        geo->sec_per_chk = id->clba;
@@ -893,7 +891,6 @@ static int nvm_core_init(struct nvm_dev *dev)
        if (ret)
                goto err_fmtype;
 
-       blk_queue_logical_block_size(dev->q, geo->sec_size);
        return 0;
 err_fmtype:
        kfree(dev->lun_map);
index 9ee919422669cea6c06aa328ff0c05ed946d4665..e7ec2fb5c59afac08edb79aa56b287dbda5795a8 100644 (file)
@@ -1448,6 +1448,8 @@ static void __nvme_revalidate_disk(struct gendisk *disk, struct nvme_id_ns *id)
        if (ns->noiob)
                nvme_set_chunk_size(ns);
        nvme_update_disk_info(disk, ns, id);
+       if (ns->ndev)
+               nvme_nvm_update_nvm_info(ns);
 #ifdef CONFIG_NVME_MULTIPATH
        if (ns->head->disk)
                nvme_update_disk_info(ns->head->disk, ns, id);
index e38d835b15b5dd9dfd1e5fe83cff31f3577d6813..839c0b96466a0d4c99cbabc31dec151fe05f47a1 100644 (file)
@@ -812,6 +812,14 @@ int nvme_nvm_ioctl(struct nvme_ns *ns, unsigned int cmd, unsigned long arg)
        }
 }
 
+void nvme_nvm_update_nvm_info(struct nvme_ns *ns)
+{
+       struct nvm_dev *ndev = ns->ndev;
+
+       ndev->identity.csecs = ndev->geo.sec_size = 1 << ns->lba_shift;
+       ndev->identity.sos = ndev->geo.oob_size = ns->ms;
+}
+
 int nvme_nvm_register(struct nvme_ns *ns, char *disk_name, int node)
 {
        struct request_queue *q = ns->queue;
index c393e4b56f39678e5b268e3862058644172b7120..aa10842a670904d1494d693556f74723c3784faf 100644 (file)
@@ -500,12 +500,14 @@ static inline void nvme_mpath_check_last_path(struct nvme_ns *ns)
 #endif /* CONFIG_NVME_MULTIPATH */
 
 #ifdef CONFIG_NVM
+void nvme_nvm_update_nvm_info(struct nvme_ns *ns);
 int nvme_nvm_register(struct nvme_ns *ns, char *disk_name, int node);
 void nvme_nvm_unregister(struct nvme_ns *ns);
 int nvme_nvm_register_sysfs(struct nvme_ns *ns);
 void nvme_nvm_unregister_sysfs(struct nvme_ns *ns);
 int nvme_nvm_ioctl(struct nvme_ns *ns, unsigned int cmd, unsigned long arg);
 #else
+static inline void nvme_nvm_update_nvm_info(struct nvme_ns *ns) {};
 static inline int nvme_nvm_register(struct nvme_ns *ns, char *disk_name,
                                    int node)
 {