From 687d5a876635484131aac17d37ccf8ae4d78d7f6 Mon Sep 17 00:00:00 2001 From: GangCao Date: Mon, 26 Dec 2022 02:41:32 -0500 Subject: [PATCH] lib/part: check the return of spdk_bdev_register Change-Id: I855a68dfcf6da565a97e33e4389eee5ed6141f74 Signed-off-by: GangCao Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16079 Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Xiaodong Liu Reviewed-by: Jim Harris --- lib/bdev/part.c | 23 ++++++++++++++++++++--- test/unit/lib/bdev/part.c/part_ut.c | 9 +++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/bdev/part.c b/lib/bdev/part.c index 46bfd4678..ea1a6c150 100644 --- a/lib/bdev/part.c +++ b/lib/bdev/part.c @@ -510,6 +510,9 @@ spdk_bdev_part_construct(struct spdk_bdev_part *part, struct spdk_bdev_part_base char *name, uint64_t offset_blocks, uint64_t num_blocks, char *product_name) { + int rc; + bool first_claimed = false; + part->internal.bdev.blocklen = base->bdev->blocklen; part->internal.bdev.blockcnt = num_blocks; part->internal.offset_blocks = offset_blocks; @@ -551,9 +554,11 @@ spdk_bdev_part_construct(struct spdk_bdev_part *part, struct spdk_bdev_part_base SPDK_ERRLOG("could not claim bdev %s\n", spdk_bdev_get_name(base->bdev)); free(part->internal.bdev.name); free(part->internal.bdev.product_name); + base->ref--; return -1; } base->claimed = true; + first_claimed = true; } spdk_io_device_register(part, bdev_part_channel_create_cb, @@ -561,8 +566,20 @@ spdk_bdev_part_construct(struct spdk_bdev_part *part, struct spdk_bdev_part_base base->channel_size, name); - spdk_bdev_register(&part->internal.bdev); - TAILQ_INSERT_TAIL(base->tailq, part, tailq); + rc = spdk_bdev_register(&part->internal.bdev); + if (rc == 0) { + TAILQ_INSERT_TAIL(base->tailq, part, tailq); + } else { + spdk_io_device_unregister(part, NULL); + if (--base->ref == 0) { + spdk_bdev_module_release_bdev(base->bdev); + } + free(part->internal.bdev.name); + free(part->internal.bdev.product_name); + if (first_claimed == true) { + base->claimed = false; + } + } - return 0; + return rc; } diff --git a/test/unit/lib/bdev/part.c/part_ut.c b/test/unit/lib/bdev/part.c/part_ut.c index 2b1fda5c9..eb9ef6614 100644 --- a/test/unit/lib/bdev/part.c/part_ut.c +++ b/test/unit/lib/bdev/part.c/part_ut.c @@ -210,6 +210,7 @@ part_test(void) struct spdk_bdev_part_base *base; struct spdk_bdev_part part1 = {}; struct spdk_bdev_part part2 = {}; + struct spdk_bdev_part part3 = {}; struct spdk_bdev bdev_base = {}; SPDK_BDEV_PART_TAILQ tailq = TAILQ_HEAD_INITIALIZER(tailq); int rc; @@ -228,8 +229,16 @@ part_test(void) rc = spdk_bdev_part_construct(&part1, base, "test1", 0, 100, "test"); SPDK_CU_ASSERT_FATAL(rc == 0); + SPDK_CU_ASSERT_FATAL(base->ref == 1); + SPDK_CU_ASSERT_FATAL(base->claimed == true); rc = spdk_bdev_part_construct(&part2, base, "test2", 100, 100, "test"); SPDK_CU_ASSERT_FATAL(rc == 0); + SPDK_CU_ASSERT_FATAL(base->ref == 2); + SPDK_CU_ASSERT_FATAL(base->claimed == true); + rc = spdk_bdev_part_construct(&part3, base, "test1", 0, 100, "test"); + SPDK_CU_ASSERT_FATAL(rc != 0); + SPDK_CU_ASSERT_FATAL(base->ref == 2); + SPDK_CU_ASSERT_FATAL(base->claimed == true); spdk_bdev_part_base_hotremove(base, &tailq);