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 <anton@lightbitslabs.com> Change-Id: I2a522dca833a27dddad25848d7688efa23d23091 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13039 Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com> Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com> Reviewed-by: Jacek Kalwas <jacek.kalwas@intel.com>
This commit is contained in:
parent
a773ed9a9a
commit
0b9100e8a5
@ -3898,7 +3898,7 @@ nvme_ctrlr_init_ana_log_page(struct nvme_ctrlr *nvme_ctrlr,
|
|||||||
cdata = spdk_nvme_ctrlr_get_data(ctrlr);
|
cdata = spdk_nvme_ctrlr_get_data(ctrlr);
|
||||||
|
|
||||||
ana_log_page_size = sizeof(struct spdk_nvme_ana_page) + cdata->nanagrpid *
|
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);
|
sizeof(uint32_t);
|
||||||
|
|
||||||
nvme_ctrlr->ana_log_page = spdk_zmalloc(ana_log_page_size, 64, NULL,
|
nvme_ctrlr->ana_log_page = spdk_zmalloc(ana_log_page_size, 64, NULL,
|
||||||
|
@ -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.nn = num_ns;
|
||||||
|
ctrlr->cdata.mnan = num_ns;
|
||||||
ctrlr->cdata.nanagrpid = num_ns;
|
ctrlr->cdata.nanagrpid = num_ns;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user