diff --git a/include/spdk/bdev_zone.h b/include/spdk/bdev_zone.h index a67945ebf..8b5f3a56d 100644 --- a/include/spdk/bdev_zone.h +++ b/include/spdk/bdev_zone.h @@ -92,6 +92,16 @@ uint64_t spdk_bdev_get_zone_size(const struct spdk_bdev *bdev); */ uint64_t spdk_bdev_get_num_zones(const struct spdk_bdev *bdev); +/** + * Get the first logical block of a zone (known as zone_id or zslba) + * for a given offset. + * + * \param bdev Block device to query. + * \param offset_blocks The offset, in blocks, from the start of the block device. + * \return The zone_id (also known as zslba) for the given offset. + */ +uint64_t spdk_bdev_get_zone_id(const struct spdk_bdev *bdev, uint64_t offset_blocks); + /** * Get device maximum zone append data transfer size in logical blocks. * diff --git a/lib/bdev/Makefile b/lib/bdev/Makefile index b2f2660bf..c4f6a315b 100644 --- a/lib/bdev/Makefile +++ b/lib/bdev/Makefile @@ -35,7 +35,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..) include $(SPDK_ROOT_DIR)/mk/spdk.common.mk SO_VER := 8 -SO_MINOR := 0 +SO_MINOR := 1 ifeq ($(CONFIG_VTUNE),y) CFLAGS += -I$(CONFIG_VTUNE_DIR)/include -I$(CONFIG_VTUNE_DIR)/sdk/src/ittnotify diff --git a/lib/bdev/bdev_zone.c b/lib/bdev/bdev_zone.c index 676cb2af5..227ffec5d 100644 --- a/lib/bdev/bdev_zone.c +++ b/lib/bdev/bdev_zone.c @@ -35,6 +35,7 @@ #include "spdk/bdev_zone.h" #include "spdk/bdev_module.h" +#include "spdk/likely.h" #include "bdev_internal.h" @@ -50,6 +51,22 @@ spdk_bdev_get_num_zones(const struct spdk_bdev *bdev) return bdev->zone_size ? bdev->blockcnt / bdev->zone_size : 0; } +uint64_t +spdk_bdev_get_zone_id(const struct spdk_bdev *bdev, uint64_t offset_blocks) +{ + uint64_t zslba; + + if (spdk_likely(spdk_u64_is_pow2(bdev->zone_size))) { + uint64_t zone_mask = bdev->zone_size - 1; + zslba = offset_blocks & ~zone_mask; + } else { + /* integer division */ + zslba = (offset_blocks / bdev->zone_size) * bdev->zone_size; + } + + return zslba; +} + uint32_t spdk_bdev_get_max_zone_append_size(const struct spdk_bdev *bdev) { diff --git a/lib/bdev/spdk_bdev.map b/lib/bdev/spdk_bdev.map index 828274229..d6930d352 100644 --- a/lib/bdev/spdk_bdev.map +++ b/lib/bdev/spdk_bdev.map @@ -149,6 +149,7 @@ # Public functions in bdev_zone.h spdk_bdev_get_zone_size; spdk_bdev_get_num_zones; + spdk_bdev_get_zone_id; spdk_bdev_get_max_zone_append_size; spdk_bdev_get_max_open_zones; spdk_bdev_get_max_active_zones; 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 01ed50545..56b90358a 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 @@ -267,6 +267,19 @@ test_get_num_zones(void) CU_ASSERT(get_num_zones == 256); } +static void +test_get_zone_id(void) +{ + struct spdk_bdev bdev = {}; + uint64_t get_zone_id; + + bdev.blockcnt = 1024 * 1024 * 1024; + bdev.zone_size = 1024 * 4096; + + get_zone_id = spdk_bdev_get_zone_id(&bdev, 0x800032); + CU_ASSERT(get_zone_id == 0x800000); +} + static void test_get_max_zone_append_size(void) { @@ -332,6 +345,7 @@ test_zone_get_operation(void) { test_get_zone_size(); test_get_num_zones(); + test_get_zone_id(); test_get_max_zone_append_size(); test_get_max_open_zones(); test_get_max_active_zones();