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:
parent
5fb8722899
commit
3adb4053af
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user