Commit 3adb4053 authored by Jim Harris's avatar Jim Harris
Browse files

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

Reviewed-on: https://review.gerrithub.io/380703


Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarDariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
parent 5fb87228
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
		}
	}
}
+53 −1
Original line number Diff line number Diff line
@@ -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();