lightnvm: disable interleaved metadata
authorIgor Konopko <igor.j.konopko@intel.com>
Tue, 11 Dec 2018 19:16:25 +0000 (20:16 +0100)
committerJens Axboe <axboe@kernel.dk>
Tue, 11 Dec 2018 19:22:35 +0000 (12:22 -0700)
Currently pblk only check the size of I/O metadata and does not take
into account if this metadata is in a separate buffer or interleaved
in a single metadata buffer.

In reality only the first scenario is supported, where second mode will
break pblk functionality during any IO operation.

This patch prevents pblk to be instantiated in case device only
supports interleaved metadata.

Reviewed-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Igor Konopko <igor.j.konopko@intel.com>
Signed-off-by: Matias Bjørling <mb@lightnvm.io>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/lightnvm/pblk-init.c
drivers/nvme/host/lightnvm.c
include/linux/lightnvm.h

index ff6a6df369c394716c105e26d1ef2f290b3b2193..e8055b7963812a00df96b1e514cb49267f8d2ffd 100644 (file)
@@ -1175,6 +1175,12 @@ static void *pblk_init(struct nvm_tgt_dev *dev, struct gendisk *tdisk,
                return ERR_PTR(-EINVAL);
        }
 
+       if (geo->ext) {
+               pblk_err(pblk, "extended metadata not supported\n");
+               kfree(pblk);
+               return ERR_PTR(-EINVAL);
+       }
+
        spin_lock_init(&pblk->resubmit_lock);
        spin_lock_init(&pblk->trans_lock);
        spin_lock_init(&pblk->lock);
index ba268d7cf141796daadedcb41c032e7e9dfdce20..f145fc0220d6108182d60a9f0b1cfd224c4dbe43 100644 (file)
@@ -990,6 +990,7 @@ int nvme_nvm_register(struct nvme_ns *ns, char *disk_name, int node)
        geo = &dev->geo;
        geo->csecs = 1 << ns->lba_shift;
        geo->sos = ns->ms;
+       geo->ext = ns->ext;
 
        dev->q = q;
        memcpy(dev->name, disk_name, DISK_NAME_LEN);
index 7afedaddbd15bae21736084ea0616ab3eb681397..5d865a5d5cdca503bfbcddcfa55c9cef082f1b36 100644 (file)
@@ -357,6 +357,7 @@ struct nvm_geo {
        u32     clba;           /* sectors per chunk */
        u16     csecs;          /* sector size */
        u16     sos;            /* out-of-band area size */
+       bool    ext;            /* metadata in extended data buffer */
 
        /* device write constrains */
        u32     ws_min;         /* minimum write size */