From 0b9100e8a584a68e908f094e0d7a36cd33f74249 Mon Sep 17 00:00:00 2001 From: Anton Eidelman Date: Tue, 14 Jun 2022 12:55:45 -0600 Subject: [PATCH] bdev/nvme: replace nn with mnan in ana_log size calculation Calculation of the ANA log page size should use the identify ctrl MNAN field (maximum number of allowed namespaces) not the NN (maximum valid nsid value). An ANA-enabled controller must have a non-zero MNAN value, see NVMe Base Specification, Figure 251, therefore nvme_ctrlr_init_ana_log_page() may safely use MNAN. Since NN might be much higher than MNAN, ANA log size based on NN may results in a very large log page and cause a failure to get ANA log, e.g. if it is larger than the controller's MDTS. Fix: replace cdata->nn with cdata->mnan in nvme_ctrlr_init_ana_log_page() Signed-off-by: Anton Eidelman Change-Id: I2a522dca833a27dddad25848d7688efa23d23091 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13039 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Reviewed-by: Jacek Kalwas --- module/bdev/nvme/bdev_nvme.c | 2 +- test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 6f2b0cb3f..a71ac0ed0 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -3898,7 +3898,7 @@ nvme_ctrlr_init_ana_log_page(struct nvme_ctrlr *nvme_ctrlr, cdata = spdk_nvme_ctrlr_get_data(ctrlr); ana_log_page_size = sizeof(struct spdk_nvme_ana_page) + cdata->nanagrpid * - sizeof(struct spdk_nvme_ana_group_descriptor) + cdata->nn * + sizeof(struct spdk_nvme_ana_group_descriptor) + cdata->mnan * sizeof(uint32_t); nvme_ctrlr->ana_log_page = spdk_zmalloc(ana_log_page_size, 64, NULL, diff --git a/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c b/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c index d0c9f37ac..5664b358a 100644 --- a/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c +++ b/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c @@ -407,6 +407,7 @@ ut_attach_ctrlr(const struct spdk_nvme_transport_id *trid, uint32_t num_ns, } ctrlr->cdata.nn = num_ns; + ctrlr->cdata.mnan = num_ns; ctrlr->cdata.nanagrpid = num_ns; }