From 96b759297fd2b61fb681d41edf60cd725989afce Mon Sep 17 00:00:00 2001 From: Tianyu Yang Date: Mon, 15 Jul 2019 16:17:14 +0800 Subject: [PATCH] lib/bdev: fix coredump when bdev initialize failed. If subsystem bdev module initialize failed, it will call spdk_bdev_init_complete(-1) -> (subsystem bdev)->fini _spdk_bdev_finish_unregister_bdevs_iter -> spdk_bdev_module_finish_iter In abovt path, spdk_bdev_module_finish_iter will repeate to call bdev_module->module_fini function. Some bdevs will call spdk_io_device_unregister which never call spdk_io_device_register. It will coredump when assert false in spdk_io_device_unregister dev is null. To fix this, let's check whether g_bdev_mgr.module_init_complete is equals true and then call the bdev_module->module_fini. Change-Id: Ia9a13318720d954e40eb2d666574bcb86e5f49e3 Signed-off-by: Tianyu Yang Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/462382 Reviewed-by: Darek Stojaczyk Reviewed-by: Shuhei Matsumoto Reviewed-by: Changpeng Liu Tested-by: SPDK CI Jenkins --- lib/bdev/bdev.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 270458f8f..4cf4bf1fd 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -1134,6 +1134,16 @@ spdk_bdev_module_finish_iter(void *arg) { struct spdk_bdev_module *bdev_module; + /* FIXME: Handling initialization failures is broken now, + * so we won't even try cleaning up after successfully + * initialized modules. if module_init_complete is false, + * just call spdk_bdev_mgr_unregister_cb + */ + if (!g_bdev_mgr.module_init_complete) { + spdk_bdev_mgr_unregister_cb(NULL); + return; + } + /* Start iterating from the last touched module */ if (!g_resume_bdev_module) { bdev_module = TAILQ_LAST(&g_bdev_mgr.bdev_modules, bdev_module_list);