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;