From bb5330c06d4fd70742a4255d7afbe90fb01e2d63 Mon Sep 17 00:00:00 2001 From: Niklas Cassel Date: Tue, 16 Feb 2021 12:40:55 +0000 Subject: [PATCH] nvme: add function to get ZNS max open zones Add a function to get the number of max open zones for a zoned namespace. The value inside the identify namespace struct is a 0's based value, where 0xffffffff means unlimited. If unlimited, the addition will overflow and return 0, which is the intended value to represent unlimited for this API. Signed-off-by: Niklas Cassel Change-Id: I4223146bc1ddf90486892a0af5fe5ce006dc5fd3 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6442 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: sunshihao Reviewed-by: Shuhei Matsumoto --- include/spdk/nvme_zns.h | 17 +++++++++++++++++ lib/nvme/nvme_zns.c | 8 ++++++++ lib/nvme/spdk_nvme.map | 1 + 3 files changed, 26 insertions(+) diff --git a/include/spdk/nvme_zns.h b/include/spdk/nvme_zns.h index 098674db7..dd0de784f 100644 --- a/include/spdk/nvme_zns.h +++ b/include/spdk/nvme_zns.h @@ -96,6 +96,23 @@ uint64_t spdk_nvme_zns_ns_get_zone_size(struct spdk_nvme_ns *ns); */ uint64_t spdk_nvme_zns_ns_get_num_zones(struct spdk_nvme_ns *ns); +/** + * Get the maximum number of open zones for the given namespace. + * + * An open zone is a zone in any of the zone states: + * EXPLICIT OPEN or IMPLICIT OPEN. + * + * If this value is 0, there is no limit. + * + * 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 maximum number of open zones. + */ +uint32_t spdk_nvme_zns_ns_get_max_open_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 ad680cc36..825102bc7 100644 --- a/lib/nvme/nvme_zns.c +++ b/lib/nvme/nvme_zns.c @@ -60,6 +60,14 @@ spdk_nvme_zns_ns_get_num_zones(struct spdk_nvme_ns *ns) return spdk_nvme_ns_get_num_sectors(ns) / spdk_nvme_zns_ns_get_zone_size_sectors(ns); } +uint32_t +spdk_nvme_zns_ns_get_max_open_zones(struct spdk_nvme_ns *ns) +{ + const struct spdk_nvme_zns_ns_data *nsdata_zns = spdk_nvme_zns_ns_get_data(ns); + + return nsdata_zns->mor + 1; +} + 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 1f45904de..f2b75b54c 100644 --- a/lib/nvme/spdk_nvme.map +++ b/lib/nvme/spdk_nvme.map @@ -173,6 +173,7 @@ spdk_nvme_zns_ns_get_zone_size_sectors; spdk_nvme_zns_ns_get_zone_size; spdk_nvme_zns_ns_get_num_zones; + spdk_nvme_zns_ns_get_max_open_zones; spdk_nvme_zns_ctrlr_get_data; spdk_nvme_zns_ctrlr_get_max_zone_append_size; spdk_nvme_zns_zone_append;