From 0b9cfae48f9816b641661c15684b7e01722b13f3 Mon Sep 17 00:00:00 2001 From: Maciej Szwed Date: Thu, 23 Nov 2017 12:57:52 +0100 Subject: [PATCH] lvol: do not try to unload lvs until previous one is unloaded With configuration where there are nested lvol stores we encounter situation when hotremove and fini functions try to unload the same lvol store second time (previous unloading have not finished yet). Signed-off-by: Maciej Szwed Change-Id: Icb5d430d17024fbda0e6113b380d8f346a3e9a84 Reviewed-on: https://review.gerrithub.io/388790 Tested-by: SPDK Automated Test System Reviewed-by: Tomasz Zawadzki Reviewed-by: Jim Harris Reviewed-by: Daniel Verkamp Reviewed-by: Ben Walker --- lib/bdev/lvol/vbdev_lvol.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/lib/bdev/lvol/vbdev_lvol.c b/lib/bdev/lvol/vbdev_lvol.c index 394f16a08..de5f1b52b 100644 --- a/lib/bdev/lvol/vbdev_lvol.c +++ b/lib/bdev/lvol/vbdev_lvol.c @@ -777,26 +777,23 @@ vbdev_lvs_init(void) } static void -vbdev_lvs_finished(void *cb_arg, int lvserrno) +vbdev_lvs_fini_next(void *cb_arg, int lvserrno) { - if (TAILQ_EMPTY(&g_spdk_lvol_pairs)) { + struct lvol_store_bdev *lvs_bdev; + + lvs_bdev = TAILQ_FIRST(&g_spdk_lvol_pairs); + if (lvs_bdev == NULL) { spdk_bdev_module_finish_done(); + return; } + + vbdev_lvs_unload(lvs_bdev->lvs, vbdev_lvs_fini_next, cb_arg); } static void vbdev_lvs_fini(void) { - struct lvol_store_bdev *lvs_bdev, *tmp; - - if (TAILQ_EMPTY(&g_spdk_lvol_pairs)) { - spdk_bdev_module_finish_done(); - return; - } - - TAILQ_FOREACH_SAFE(lvs_bdev, &g_spdk_lvol_pairs, lvol_stores, tmp) { - vbdev_lvs_unload(lvs_bdev->lvs, vbdev_lvs_finished, NULL); - } + vbdev_lvs_fini_next(NULL, 0); } static int