From be3ff9c0b5a9ff979df9055f68a164ada056a3ca Mon Sep 17 00:00:00 2001 From: Niklas Cassel Date: Tue, 20 Oct 2020 09:30:12 +0000 Subject: [PATCH] nvme: add function to get ZNS num zones Add a function to get the number of zones for a zoned namespace. Since the ZNS specification does not allow zone size == 0, divide by zero should not be possible on a spec compliant drive. Signed-off-by: Niklas Cassel Change-Id: I15e0ac8a72e244e248b7fb44f7156b182ecd98b4 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4792 Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI --- include/spdk/nvme_zns.h | 12 ++++++++++++ lib/nvme/nvme_zns.c | 6 ++++++ lib/nvme/spdk_nvme.map | 1 + 3 files changed, 19 insertions(+) diff --git a/include/spdk/nvme_zns.h b/include/spdk/nvme_zns.h index e399caece..9395288aa 100644 --- a/include/spdk/nvme_zns.h +++ b/include/spdk/nvme_zns.h @@ -72,6 +72,18 @@ const struct spdk_nvme_zns_ns_data *spdk_nvme_zns_ns_get_data(struct spdk_nvme_n */ uint64_t spdk_nvme_zns_ns_get_zone_size(struct spdk_nvme_ns *ns); +/** + * Get the number of zones for the given namespace. + * + * This function is thread safe and can be called at any point while the controller + * is attached to the SPDK NVMe driver. + * + * \param ns Namespace to query. + * + * \return the number of zones. + */ +uint64_t spdk_nvme_zns_ns_get_num_zones(struct spdk_nvme_ns *ns); + /** * Get the Zoned Namespace Command Set Specific Identify Controller data * as defined by the NVMe Zoned Namespace Command Set Specification. diff --git a/lib/nvme/nvme_zns.c b/lib/nvme/nvme_zns.c index 0e5d6f1fc..3b3fe2649 100644 --- a/lib/nvme/nvme_zns.c +++ b/lib/nvme/nvme_zns.c @@ -48,6 +48,12 @@ spdk_nvme_zns_ns_get_zone_size(struct spdk_nvme_ns *ns) return nsdata_zns->lbafe[nsdata->flbas.format].zsze * spdk_nvme_ns_get_sector_size(ns); } +uint64_t +spdk_nvme_zns_ns_get_num_zones(struct spdk_nvme_ns *ns) +{ + return spdk_nvme_ns_get_size(ns) / spdk_nvme_zns_ns_get_zone_size(ns); +} + const struct spdk_nvme_zns_ctrlr_data * spdk_nvme_zns_ctrlr_get_data(struct spdk_nvme_ctrlr *ctrlr) { diff --git a/lib/nvme/spdk_nvme.map b/lib/nvme/spdk_nvme.map index 137ace029..ebf7bb270 100644 --- a/lib/nvme/spdk_nvme.map +++ b/lib/nvme/spdk_nvme.map @@ -161,6 +161,7 @@ # public functions from nvme_zns.h spdk_nvme_zns_ns_get_data; spdk_nvme_zns_ns_get_zone_size; + spdk_nvme_zns_ns_get_num_zones; spdk_nvme_zns_ctrlr_get_data; spdk_nvme_zns_close_zone; spdk_nvme_zns_finish_zone;