diff --git a/include/spdk_internal/bdev.h b/include/spdk_internal/bdev.h index c5c7cedfe..19eb63614 100644 --- a/include/spdk_internal/bdev.h +++ b/include/spdk_internal/bdev.h @@ -119,6 +119,12 @@ struct spdk_bdev_module_if { */ void (*examine)(struct spdk_bdev *bdev); + /** + * Count of bdev examinations in progress. Used by generic bdev layer and must + * not be modified by bdev modules. + */ + uint32_t examine_in_progress; + TAILQ_ENTRY(spdk_bdev_module_if) tailq; }; @@ -377,6 +383,8 @@ void spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs, int base_bdev_count); void spdk_vbdev_unregister(struct spdk_bdev *vbdev); +void spdk_vbdev_module_examine_done(struct spdk_bdev_module_if *module); + void spdk_bdev_poller_start(struct spdk_bdev_poller **ppoller, spdk_bdev_poller_fn fn, void *arg, diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index d3e41a619..317c80d8b 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -74,7 +74,6 @@ struct spdk_bdev_mgr { #ifdef SPDK_CONFIG_VTUNE __itt_domain *domain; #endif - }; static struct spdk_bdev_mgr g_bdev_mgr = { @@ -1384,9 +1383,8 @@ _spdk_bdev_register(struct spdk_bdev *bdev) TAILQ_INSERT_TAIL(&g_bdev_mgr.bdevs, bdev, link); TAILQ_FOREACH(vbdev_module, &g_bdev_mgr.vbdev_modules, tailq) { - if (vbdev_module->examine) { - vbdev_module->examine(bdev); - } + vbdev_module->examine_in_progress++; + vbdev_module->examine(bdev); } } @@ -1459,6 +1457,13 @@ spdk_vbdev_unregister(struct spdk_bdev *vbdev) spdk_bdev_unregister(vbdev); } +void +spdk_vbdev_module_examine_done(struct spdk_bdev_module_if *module) +{ + assert(module->examine_in_progress > 0); + module->examine_in_progress--; +} + static bool __is_bdev_opened_for_write(struct spdk_bdev *bdev) { @@ -1595,5 +1600,6 @@ spdk_bdev_module_list_add(struct spdk_bdev_module_if *bdev_module) void spdk_vbdev_module_list_add(struct spdk_bdev_module_if *vbdev_module) { + assert(vbdev_module->examine != NULL); TAILQ_INSERT_TAIL(&g_bdev_mgr.vbdev_modules, vbdev_module, tailq); } diff --git a/lib/bdev/error/vbdev_error.c b/lib/bdev/error/vbdev_error.c index 91a82b066..7ca12947d 100644 --- a/lib/bdev/error/vbdev_error.c +++ b/lib/bdev/error/vbdev_error.c @@ -333,4 +333,11 @@ vbdev_error_fini(void) } } -SPDK_VBDEV_MODULE_REGISTER(error, vbdev_error_init, vbdev_error_fini, NULL, NULL, NULL) +static void +vbdev_error_examine(struct spdk_bdev *bdev) +{ + spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(error)); +} + +SPDK_VBDEV_MODULE_REGISTER(error, vbdev_error_init, vbdev_error_fini, NULL, NULL, + vbdev_error_examine) diff --git a/lib/bdev/gpt/vbdev_gpt.c b/lib/bdev/gpt/vbdev_gpt.c index 27470499b..ddc44efb9 100644 --- a/lib/bdev/gpt/vbdev_gpt.c +++ b/lib/bdev/gpt/vbdev_gpt.c @@ -522,6 +522,13 @@ vbdev_gpt_fini(void) static void vbdev_gpt_examine(struct spdk_bdev *bdev) { + /* + * TODO: this will get fixed in a later patch which refactors + * the GPT init/register code. For now, nothing is operating + * on the examination counts so just immediately indicate + * that the examination is done. + */ + spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(gpt)); if (g_gpt_disabled) { return; } diff --git a/lib/bdev/split/vbdev_split.c b/lib/bdev/split/vbdev_split.c index b2e927c5a..07024d841 100644 --- a/lib/bdev/split/vbdev_split.c +++ b/lib/bdev/split/vbdev_split.c @@ -425,6 +425,12 @@ vbdev_split_get_ctx_size(void) return sizeof(struct spdk_io_channel *); } +static void +vbdev_split_examine(struct spdk_bdev *bdev) +{ + spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(split)); +} + SPDK_VBDEV_MODULE_REGISTER(split, vbdev_split_init, vbdev_split_fini, NULL, - vbdev_split_get_ctx_size, NULL) + vbdev_split_get_ctx_size, vbdev_split_examine) SPDK_LOG_REGISTER_TRACE_FLAG("vbdev_split", SPDK_TRACE_VBDEV_SPLIT) diff --git a/test/unit/lib/bdev/bdev.c/bdev_ut.c b/test/unit/lib/bdev/bdev.c/bdev_ut.c index 9b1bc5b40..adf1c7420 100644 --- a/test/unit/lib/bdev/bdev.c/bdev_ut.c +++ b/test/unit/lib/bdev/bdev.c/bdev_ut.c @@ -36,6 +36,8 @@ #include "lib/test_env.c" #include "bdev.c" +SPDK_DECLARE_BDEV_MODULE(vbdev_ut); + void * spdk_io_channel_get_ctx(struct spdk_io_channel *ch) { @@ -109,8 +111,14 @@ static struct spdk_bdev_fn_table fn_table = { .destruct = stub_destruct, }; +static void +vbdev_ut_examine(struct spdk_bdev *bdev) +{ + spdk_vbdev_module_examine_done(SPDK_GET_BDEV_MODULE(vbdev_ut)); +} + SPDK_BDEV_MODULE_REGISTER(bdev_ut, NULL, NULL, NULL, NULL) -SPDK_VBDEV_MODULE_REGISTER(vbdev_ut, NULL, NULL, NULL, NULL, NULL) +SPDK_VBDEV_MODULE_REGISTER(vbdev_ut, NULL, NULL, NULL, NULL, vbdev_ut_examine) static struct spdk_bdev * allocate_bdev(char *name)