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 <james.r.harris@intel.com>
Change-Id: I120d42ba7b6cfa4a2cb11e6cc08885d95316fe81

Reviewed-on: https://review.gerrithub.io/380703
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
Jim Harris 2017-09-28 12:55:20 -07:00
parent 5fb8722899
commit 3adb4053af
2 changed files with 54 additions and 2 deletions

View File

@ -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);
}
}
}

View File

@ -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();