From af0d907604672aedbe34161c266967ef249ab145 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Wed, 3 Aug 2022 10:25:15 +0000 Subject: [PATCH] bdev: wait_for_examine during spdk_bdev_finish. Wait for all bdevs to finish examination before proceeding with the spdk_bdev_finish shutdown logic. This ensures the bdev layer and its modules are not trying to examine bdevs after the bdev layer has reported it has shut down. Theoretically, bdev modules could all defer their fini callbacks until any outstanding examinations are complete, but it is WAY simpler to just use the existing spdK_bdev_wait_for_examine API instead. Signed-off-by: Jim Harris Change-Id: If90cc2a786281d348b82de8beb17ac37ba269c64 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13850 Community-CI: Mellanox Build Bot Reviewed-by: Changpeng Liu Reviewed-by: Tomasz Zawadzki Tested-by: SPDK CI Jenkins --- lib/bdev/bdev.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index c0449b680..1848bd161 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -1867,9 +1867,17 @@ spdk_bdev_module_fini_start_done(void) } } +static void +bdev_finish_wait_for_examine_done(void *cb_arg) +{ + bdev_module_fini_start_iter(NULL); +} + void spdk_bdev_finish(spdk_bdev_fini_cb cb_fn, void *cb_arg) { + int rc; + assert(cb_fn != NULL); g_fini_thread = spdk_get_thread(); @@ -1877,7 +1885,11 @@ spdk_bdev_finish(spdk_bdev_fini_cb cb_fn, void *cb_arg) g_fini_cb_fn = cb_fn; g_fini_cb_arg = cb_arg; - bdev_module_fini_start_iter(NULL); + rc = spdk_bdev_wait_for_examine(bdev_finish_wait_for_examine_done, NULL); + if (rc != 0) { + SPDK_ERRLOG("wait_for_examine failed: %s\n", spdk_strerror(-rc)); + bdev_finish_wait_for_examine_done(NULL); + } } struct spdk_bdev_io *