From 8736e00f0de5b90d8a863e1acc1b86f3e9fb4279 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 5 Feb 2019 15:00:52 +0900 Subject: [PATCH] bdev/nvme: Set variables about metadata and DIF at NVMe bdev initialization Metadata location and DIF type are set only if there is metadata, and DIF location is set only if DIF is enabled. Change-Id: Ib684b54332820446ff1a0b609f5b4e0b3d42f2f9 Signed-off-by: Shuhei Matsumoto Reviewed-on: https://review.gerrithub.io/c/443344 Tested-by: SPDK CI Jenkins Reviewed-by: Changpeng Liu Reviewed-by: Darek Stojaczyk Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- lib/bdev/nvme/bdev_nvme.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/bdev/nvme/bdev_nvme.c b/lib/bdev/nvme/bdev_nvme.c index b60fea78a..b11950303 100644 --- a/lib/bdev/nvme/bdev_nvme.c +++ b/lib/bdev/nvme/bdev_nvme.c @@ -750,6 +750,7 @@ nvme_ctrlr_create_bdev(struct nvme_ctrlr *nvme_ctrlr, uint32_t nsid) struct spdk_nvme_ns *ns; const struct spdk_uuid *uuid; const struct spdk_nvme_ctrlr_data *cdata; + const struct spdk_nvme_ns_data *nsdata; int rc; cdata = spdk_nvme_ctrlr_get_data(ctrlr); @@ -789,6 +790,16 @@ nvme_ctrlr_create_bdev(struct nvme_ctrlr *nvme_ctrlr, uint32_t nsid) bdev->disk.uuid = *uuid; } + bdev->disk.md_len = spdk_nvme_ns_get_md_size(ns); + if (bdev->disk.md_len != 0) { + nsdata = spdk_nvme_ns_get_data(ns); + bdev->disk.md_interleave = nsdata->flbas.extended; + bdev->disk.dif_type = (enum spdk_dif_type)spdk_nvme_ns_get_pi_type(ns); + if (bdev->disk.dif_type != SPDK_DIF_DISABLE) { + bdev->disk.dif_is_head_of_md = nsdata->dps.md_start; + } + } + bdev->disk.ctxt = bdev; bdev->disk.fn_table = &nvmelib_fn_table; bdev->disk.module = &nvme_if;