From e87e8263dfc0c2f5be2435c58f703e8eff329667 Mon Sep 17 00:00:00 2001 From: Maciej Szwed Date: Fri, 1 Mar 2019 14:48:13 +0100 Subject: [PATCH] lvol: Fix for lvol failed deletion flow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lvol should not only be freed but also removed from lvols list when deletion fails. Signed-off-by: Maciej Szwed Change-Id: I3a047e1cc611e71b1544ca77c256a879dd2efdae Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/446619 Tested-by: SPDK CI Jenkins Reviewed-by: Piotr Pelpliński Reviewed-by: Darek Stojaczyk Reviewed-by: Ben Walker Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris --- lib/lvol/lvol.c | 8 +++----- test/unit/lib/lvol/lvol.c/lvol_ut.c | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/lvol/lvol.c b/lib/lvol/lvol.c index a44de99e9..4165d531d 100644 --- a/lib/lvol/lvol.c +++ b/lib/lvol/lvol.c @@ -902,14 +902,12 @@ _spdk_lvol_delete_blob_cb(void *cb_arg, int lvolerrno) struct spdk_lvol *lvol = req->lvol; if (lvolerrno < 0) { - SPDK_ERRLOG("Could not delete blob on lvol\n"); - goto end; + SPDK_ERRLOG("Could not remove blob on lvol gracefully - forced removal\n"); + } else { + SPDK_INFOLOG(SPDK_LOG_LVOL, "Lvol %s deleted\n", lvol->unique_id); } TAILQ_REMOVE(&lvol->lvol_store->lvols, lvol, link); - SPDK_INFOLOG(SPDK_LOG_LVOL, "Lvol %s deleted\n", lvol->unique_id); - -end: _spdk_lvol_free(lvol); req->cb_fn(req->cb_arg, lvolerrno); free(req); diff --git a/test/unit/lib/lvol/lvol.c/lvol_ut.c b/test/unit/lib/lvol/lvol.c/lvol_ut.c index 0daa435c3..7c93e461b 100644 --- a/test/unit/lib/lvol/lvol.c/lvol_ut.c +++ b/test/unit/lib/lvol/lvol.c/lvol_ut.c @@ -74,6 +74,7 @@ int g_lvserrno; int g_close_super_status; int g_resize_rc; int g_inflate_rc; +int g_remove_rc; bool g_lvs_rename_blob_open_error = false; struct spdk_lvol_store *g_lvol_store; struct spdk_lvol *g_lvol; @@ -326,7 +327,7 @@ spdk_bs_delete_blob(struct spdk_blob_store *bs, spdk_blob_id blobid, } } - cb_fn(cb_arg, 0); + cb_fn(cb_arg, g_remove_rc); } spdk_blob_id @@ -859,6 +860,20 @@ lvol_destroy_fail(void) spdk_lvol_destroy(g_lvol, destroy_cb, NULL); CU_ASSERT(g_lvserrno == 0); + spdk_lvol_create(g_lvol_store, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT, + lvol_op_with_handle_complete, NULL); + CU_ASSERT(g_lvserrno == 0); + SPDK_CU_ASSERT_FATAL(g_lvol != NULL); + + spdk_lvol_close(g_lvol, close_cb, NULL); + CU_ASSERT(g_lvserrno == 0); + + g_remove_rc = -1; + spdk_lvol_destroy(g_lvol, destroy_cb, NULL); + CU_ASSERT(g_lvserrno != 0); + CU_ASSERT(TAILQ_EMPTY(&g_lvol_store->lvols)); + g_remove_rc = 0; + g_lvserrno = -1; rc = spdk_lvs_unload(g_lvol_store, lvol_store_op_complete, NULL); CU_ASSERT(rc == 0);