From 6abb4764ad978be36ba6529fc561f39e8c8cff23 Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Wed, 22 Jun 2022 09:38:48 +0800 Subject: [PATCH] nvmf: check interleaved metadata size when adding NS When doing DIF insert and strip, we will reserve extra buffer in block device layer to save DIF information, so when attaching one device to Namespace, we will check the value first so that the reserved buffer size isn't smaller than metadata size. Change-Id: Id9272886ce8a7c01271279686730af4e5b24f35a Signed-off-by: Changpeng Liu Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12188 Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: Konrad Sztyber Reviewed-by: Aleksey Marchuk Reviewed-by: Ben Walker Reviewed-by: Dong Yi --- lib/nvmf/subsystem.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index 7cd398660..9c0ed54d7 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -1638,11 +1638,21 @@ spdk_nvmf_subsystem_add_ns_ext(struct spdk_nvmf_subsystem *subsystem, const char ns->bdev = spdk_bdev_desc_get_bdev(ns->desc); - if (spdk_bdev_get_md_size(ns->bdev) != 0 && !spdk_bdev_is_md_interleaved(ns->bdev)) { - SPDK_ERRLOG("Can't attach bdev with separate metadata.\n"); - spdk_bdev_close(ns->desc); - free(ns); - return 0; + if (spdk_bdev_get_md_size(ns->bdev) != 0) { + if (!spdk_bdev_is_md_interleaved(ns->bdev)) { + SPDK_ERRLOG("Can't attach bdev with separate metadata.\n"); + spdk_bdev_close(ns->desc); + free(ns); + return 0; + } + + if (spdk_bdev_get_md_size(ns->bdev) > SPDK_BDEV_MAX_INTERLEAVED_MD_SIZE) { + SPDK_ERRLOG("Maximum supported interleaved md size %u, current md size %u\n", + SPDK_BDEV_MAX_INTERLEAVED_MD_SIZE, spdk_bdev_get_md_size(ns->bdev)); + spdk_bdev_close(ns->desc); + free(ns); + return 0; + } } rc = spdk_bdev_module_claim_bdev(ns->bdev, ns->desc, &ns_bdev_module);