diff --git a/include/spdk/bdev_module.h b/include/spdk/bdev_module.h index 133f27a09..925e106e8 100644 --- a/include/spdk/bdev_module.h +++ b/include/spdk/bdev_module.h @@ -366,6 +366,11 @@ struct spdk_bdev { */ uint32_t max_open_zones; + /** + * Maximum number of active zones. + */ + uint32_t max_active_zones; + /** * Optimal number of open zones. */ diff --git a/include/spdk/bdev_zone.h b/include/spdk/bdev_zone.h index 192bfc42f..156344703 100644 --- a/include/spdk/bdev_zone.h +++ b/include/spdk/bdev_zone.h @@ -96,6 +96,20 @@ uint64_t spdk_bdev_get_zone_size(const struct spdk_bdev *bdev); */ uint32_t spdk_bdev_get_max_open_zones(const struct spdk_bdev *bdev); +/** + * Get device maximum number of active zones. + * + * An active zone is defined as a zone being in zone state + * SPDK_BDEV_ZONE_STATE_IMP_OPEN, SPDK_BDEV_ZONE_STATE_EXP_OPEN or + * SPDK_BDEV_ZONE_STATE_CLOSED. + * + * If this value is 0, there is no limit. + * + * \param bdev Block device to query. + * \return Maximum number of active zones for this zoned device. + */ +uint32_t spdk_bdev_get_max_active_zones(const struct spdk_bdev *bdev); + /** * Get device optimal number of open zones. * diff --git a/lib/bdev/bdev_zone.c b/lib/bdev/bdev_zone.c index 3cf2ecb67..6cec0014e 100644 --- a/lib/bdev/bdev_zone.c +++ b/lib/bdev/bdev_zone.c @@ -50,6 +50,12 @@ spdk_bdev_get_max_open_zones(const struct spdk_bdev *bdev) return bdev->max_open_zones; } +uint32_t +spdk_bdev_get_max_active_zones(const struct spdk_bdev *bdev) +{ + return bdev->max_active_zones; +} + uint32_t spdk_bdev_get_optimal_open_zones(const struct spdk_bdev *bdev) { diff --git a/lib/bdev/spdk_bdev.map b/lib/bdev/spdk_bdev.map index c3b7b54f8..9b4907e9b 100644 --- a/lib/bdev/spdk_bdev.map +++ b/lib/bdev/spdk_bdev.map @@ -144,6 +144,7 @@ # Public functions in bdev_zone.h spdk_bdev_get_zone_size; spdk_bdev_get_max_open_zones; + spdk_bdev_get_max_active_zones; spdk_bdev_get_optimal_open_zones; spdk_bdev_get_zone_info; spdk_bdev_zone_management; diff --git a/test/unit/lib/bdev/bdev_zone.c/bdev_zone_ut.c b/test/unit/lib/bdev/bdev_zone.c/bdev_zone_ut.c index 2ee1af301..3c293cbaf 100644 --- a/test/unit/lib/bdev/bdev_zone.c/bdev_zone_ut.c +++ b/test/unit/lib/bdev/bdev_zone.c/bdev_zone_ut.c @@ -266,6 +266,18 @@ test_get_max_open_zones(void) CU_ASSERT(get_max_open_zones == 8192); } +static void +test_get_max_active_zones(void) +{ + struct spdk_bdev bdev = {}; + uint32_t get_max_active_zones; + + bdev.max_active_zones = 9216; + + get_max_active_zones = spdk_bdev_get_max_active_zones(&bdev); + CU_ASSERT(get_max_active_zones == 9216); +} + static void test_get_optimal_open_zones(void) { @@ -295,6 +307,7 @@ test_zone_get_operation(void) { test_get_zone_size(); test_get_max_open_zones(); + test_get_max_active_zones(); test_get_optimal_open_zones(); }