lib/part: check the return of spdk_bdev_register
Change-Id: I855a68dfcf6da565a97e33e4389eee5ed6141f74 Signed-off-by: GangCao <gang.cao@intel.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16079 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com> Reviewed-by: Xiaodong Liu <xiaodong.liu@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
c5d0fac1b9
commit
687d5a8766
@ -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 *name, uint64_t offset_blocks, uint64_t num_blocks,
|
||||||
char *product_name)
|
char *product_name)
|
||||||
{
|
{
|
||||||
|
int rc;
|
||||||
|
bool first_claimed = false;
|
||||||
|
|
||||||
part->internal.bdev.blocklen = base->bdev->blocklen;
|
part->internal.bdev.blocklen = base->bdev->blocklen;
|
||||||
part->internal.bdev.blockcnt = num_blocks;
|
part->internal.bdev.blockcnt = num_blocks;
|
||||||
part->internal.offset_blocks = offset_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));
|
SPDK_ERRLOG("could not claim bdev %s\n", spdk_bdev_get_name(base->bdev));
|
||||||
free(part->internal.bdev.name);
|
free(part->internal.bdev.name);
|
||||||
free(part->internal.bdev.product_name);
|
free(part->internal.bdev.product_name);
|
||||||
|
base->ref--;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
base->claimed = true;
|
base->claimed = true;
|
||||||
|
first_claimed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
spdk_io_device_register(part, bdev_part_channel_create_cb,
|
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,
|
base->channel_size,
|
||||||
name);
|
name);
|
||||||
|
|
||||||
spdk_bdev_register(&part->internal.bdev);
|
rc = spdk_bdev_register(&part->internal.bdev);
|
||||||
TAILQ_INSERT_TAIL(base->tailq, part, tailq);
|
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;
|
||||||
}
|
}
|
||||||
|
@ -210,6 +210,7 @@ part_test(void)
|
|||||||
struct spdk_bdev_part_base *base;
|
struct spdk_bdev_part_base *base;
|
||||||
struct spdk_bdev_part part1 = {};
|
struct spdk_bdev_part part1 = {};
|
||||||
struct spdk_bdev_part part2 = {};
|
struct spdk_bdev_part part2 = {};
|
||||||
|
struct spdk_bdev_part part3 = {};
|
||||||
struct spdk_bdev bdev_base = {};
|
struct spdk_bdev bdev_base = {};
|
||||||
SPDK_BDEV_PART_TAILQ tailq = TAILQ_HEAD_INITIALIZER(tailq);
|
SPDK_BDEV_PART_TAILQ tailq = TAILQ_HEAD_INITIALIZER(tailq);
|
||||||
int rc;
|
int rc;
|
||||||
@ -228,8 +229,16 @@ part_test(void)
|
|||||||
|
|
||||||
rc = spdk_bdev_part_construct(&part1, base, "test1", 0, 100, "test");
|
rc = spdk_bdev_part_construct(&part1, base, "test1", 0, 100, "test");
|
||||||
SPDK_CU_ASSERT_FATAL(rc == 0);
|
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");
|
rc = spdk_bdev_part_construct(&part2, base, "test2", 100, 100, "test");
|
||||||
SPDK_CU_ASSERT_FATAL(rc == 0);
|
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);
|
spdk_bdev_part_base_hotremove(base, &tailq);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user