From 3adb4053af9e30edf7bd598670349c837bd9d58c Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Thu, 28 Sep 2017 12:55:20 -0700 Subject: [PATCH] bdev: use spdk_vbdev_unregister when unregistering partitions Also add a unit test that reproduces the original issue and passes with the one line fix. Signed-off-by: Jim Harris Change-Id: I120d42ba7b6cfa4a2cb11e6cc08885d95316fe81 Reviewed-on: https://review.gerrithub.io/380703 Reviewed-by: Daniel Verkamp Reviewed-by: Dariusz Stojaczyk Tested-by: SPDK Automated Test System Reviewed-by: Changpeng Liu --- lib/bdev/bdev.c | 2 +- test/unit/lib/bdev/bdev.c/bdev_ut.c | 54 ++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 47332e14d9..4e4696a16e 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -1924,7 +1924,7 @@ spdk_bdev_part_base_hotremove(struct spdk_bdev *base_bdev, struct bdev_part_tail TAILQ_FOREACH_SAFE(part, tailq, tailq, tmp) { if (part->base->bdev == base_bdev) { - spdk_bdev_unregister(&part->bdev); + spdk_vbdev_unregister(&part->bdev); } } } diff --git a/test/unit/lib/bdev/bdev.c/bdev_ut.c b/test/unit/lib/bdev/bdev.c/bdev_ut.c index 8e25cc6605..c40c7e676e 100644 --- a/test/unit/lib/bdev/bdev.c/bdev_ut.c +++ b/test/unit/lib/bdev/bdev.c/bdev_ut.c @@ -352,6 +352,57 @@ io_valid_test(void) CU_ASSERT(spdk_bdev_io_valid_blocks(&bdev, 18446744073709551615ULL, 1) == false); } +static int +__destruct(void *ctx) +{ + return 0; +} + +static struct spdk_bdev_fn_table base_fn_table = { + .destruct = __destruct, +}; +static struct spdk_bdev_fn_table part_fn_table = { + .destruct = __destruct, +}; + +static void +__base_free(struct spdk_bdev_part_base *base) +{ + free(base); +} + +static void +part_test(void) +{ + struct spdk_bdev_part_base *base; + struct spdk_bdev_part part1, part2; + struct spdk_bdev bdev_base = {}; + SPDK_BDEV_PART_TAILQ tailq = TAILQ_HEAD_INITIALIZER(tailq); + + base = calloc(1, sizeof(*base)); + SPDK_CU_ASSERT_FATAL(base != NULL); + + bdev_base.fn_table = &base_fn_table; + bdev_base.module = SPDK_GET_BDEV_MODULE(bdev_ut); + spdk_bdev_register(&bdev_base); + spdk_bdev_part_base_construct(base, &bdev_base, NULL, SPDK_GET_BDEV_MODULE(vbdev_ut), + &part_fn_table, &tailq, __base_free, 0, NULL, NULL); + + spdk_bdev_part_construct(&part1, base, "test1", 0, 100, "test"); + spdk_bdev_part_construct(&part2, base, "test2", 100, 100, "test"); + + spdk_bdev_part_base_hotremove(&bdev_base, &tailq); + + /* + * The base device was removed - ensure that the partition vbdevs were + * removed from the base's vbdev list. + */ + CU_ASSERT(TAILQ_EMPTY(&bdev_base.vbdevs)); + + spdk_bdev_part_base_free(base); + spdk_bdev_unregister(&bdev_base); +} + int main(int argc, char **argv) { @@ -371,7 +422,8 @@ main(int argc, char **argv) if ( CU_add_test(suite, "bytes_to_blocks_test", bytes_to_blocks_test) == NULL || CU_add_test(suite, "io_valid", io_valid_test) == NULL || - CU_add_test(suite, "open_write", open_write_test) == NULL + CU_add_test(suite, "open_write", open_write_test) == NULL || + CU_add_test(suite, "part", part_test) == NULL ) { CU_cleanup_registry(); return CU_get_error();