From 7d8fe2ca2c72e15750b992969d836cd74d755335 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Wed, 18 Oct 2017 11:05:41 -0700 Subject: [PATCH] lvol: keep list of open lvolstores This will be used in a future patch to ensure we do not allow creating or loading an lvolstore with a names that matches an already opened lvolstore. Signed-off-by: Jim Harris Change-Id: I37e8786f91cd578dd36fbec99ca23609419fc8f8 Reviewed-on: https://review.gerrithub.io/383012 Tested-by: SPDK Automated Test System Reviewed-by: Tomasz Zawadzki Reviewed-by: Daniel Verkamp --- include/spdk_internal/lvolstore.h | 2 ++ lib/lvol/lvol.c | 26 ++++++++++++++++++++++++++ test/unit/lib/lvol/lvol.c/lvol_ut.c | 12 ++++++++++++ 3 files changed, 40 insertions(+) diff --git a/include/spdk_internal/lvolstore.h b/include/spdk_internal/lvolstore.h index b46cb9ac6..f69f994e1 100644 --- a/include/spdk_internal/lvolstore.h +++ b/include/spdk_internal/lvolstore.h @@ -79,6 +79,8 @@ struct spdk_lvol_store { int lvol_count; int lvols_opened; TAILQ_HEAD(, spdk_lvol) lvols; + bool on_list; + TAILQ_ENTRY(spdk_lvol_store) link; }; struct spdk_lvol { diff --git a/lib/lvol/lvol.c b/lib/lvol/lvol.c index 7938de53b..54440ea57 100644 --- a/lib/lvol/lvol.c +++ b/lib/lvol/lvol.c @@ -42,15 +42,32 @@ SPDK_LOG_REGISTER_TRACE_FLAG("lvol", SPDK_TRACE_LVOL) +static TAILQ_HEAD(, spdk_lvol_store) g_lvol_stores = TAILQ_HEAD_INITIALIZER(g_lvol_stores); +static pthread_mutex_t g_lvol_stores_mutex = PTHREAD_MUTEX_INITIALIZER; + static inline size_t divide_round_up(size_t num, size_t divisor) { return (num + divisor - 1) / divisor; } +static int +_spdk_add_lvs_to_list(struct spdk_lvol_store *lvs) +{ + pthread_mutex_lock(&g_lvol_stores_mutex); + lvs->on_list = true; + TAILQ_INSERT_TAIL(&g_lvol_stores, lvs, link); + pthread_mutex_unlock(&g_lvol_stores_mutex); + + return 0; +} + static void _spdk_lvs_free(struct spdk_lvol_store *lvs) { + if (lvs->on_list) { + TAILQ_REMOVE(&g_lvol_stores, lvs, link); + } free(lvs); } @@ -235,6 +252,13 @@ _spdk_lvs_read_uuid(void *cb_arg, struct spdk_blob *blob, int lvolerrno) return; } + /* + * Wait to put lvs on the global list until this point, because a future patch + * will add lvolstore name uniqueness checking - and we don't know a loaded + * lvolstore's name until this point. + */ + _spdk_add_lvs_to_list(lvs); + lvs->super_blob_id = spdk_blob_get_id(blob); spdk_bs_md_close_blob(&blob, _spdk_close_super_cb, req); @@ -483,6 +507,8 @@ spdk_lvs_init(struct spdk_bs_dev *bs_dev, struct spdk_lvs_opts *o, uuid_generate_time(lvs->uuid); + _spdk_add_lvs_to_list(lvs); + lvs_req = calloc(1, sizeof(*lvs_req)); if (!lvs_req) { _spdk_lvs_free(lvs); diff --git a/test/unit/lib/lvol/lvol.c/lvol_ut.c b/test/unit/lib/lvol/lvol.c/lvol_ut.c index 514ec0615..8e5e017ad 100644 --- a/test/unit/lib/lvol/lvol.c/lvol_ut.c +++ b/test/unit/lib/lvol/lvol.c/lvol_ut.c @@ -338,10 +338,12 @@ lvs_init_unload_success(void) g_lvserrno = -1; + CU_ASSERT(TAILQ_EMPTY(&g_lvol_stores)); rc = spdk_lvs_init(&bs_dev, &opts, lvol_store_op_with_handle_complete, NULL); CU_ASSERT(rc == 0); CU_ASSERT(g_lvserrno == 0); SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL); + CU_ASSERT(!TAILQ_EMPTY(&g_lvol_stores)); spdk_lvol_create(g_lvol_store, 10, lvol_op_with_handle_complete, NULL); CU_ASSERT(g_lvserrno == 0); @@ -353,6 +355,7 @@ lvs_init_unload_success(void) CU_ASSERT(rc == -EBUSY); CU_ASSERT(g_lvserrno == -1); SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL); + CU_ASSERT(!TAILQ_EMPTY(&g_lvol_stores)); /* Lvol has to be closed (or destroyed) before unloading lvol store. */ spdk_lvol_close(g_lvol, close_cb, NULL); @@ -363,6 +366,7 @@ lvs_init_unload_success(void) CU_ASSERT(rc == 0); CU_ASSERT(g_lvserrno == 0); g_lvol_store = NULL; + CU_ASSERT(TAILQ_EMPTY(&g_lvol_stores)); spdk_free_thread(); } @@ -721,9 +725,11 @@ lvs_load(void) /* Fail on bs load */ g_bs_load_status = -1; + CU_ASSERT(TAILQ_EMPTY(&g_lvol_stores)); spdk_lvs_load(&bs_dev, lvol_store_op_with_handle_complete, req); CU_ASSERT(g_lvserrno != 0); CU_ASSERT(g_lvol_store == NULL); + CU_ASSERT(TAILQ_EMPTY(&g_lvol_stores)); /* Fail on getting super blob */ g_bs_load_status = 0; @@ -731,6 +737,7 @@ lvs_load(void) spdk_lvs_load(&bs_dev, lvol_store_op_with_handle_complete, req); CU_ASSERT(g_lvserrno == -ENODEV); CU_ASSERT(g_lvol_store == NULL); + CU_ASSERT(TAILQ_EMPTY(&g_lvol_stores)); /* Fail on opening super blob */ g_lvserrno = 0; @@ -739,6 +746,7 @@ lvs_load(void) spdk_lvs_load(&bs_dev, lvol_store_op_with_handle_complete, req); CU_ASSERT(g_lvserrno == -ENODEV); CU_ASSERT(g_lvol_store == NULL); + CU_ASSERT(TAILQ_EMPTY(&g_lvol_stores)); /* Fail on getting uuid */ g_lvserrno = 0; @@ -748,6 +756,7 @@ lvs_load(void) spdk_lvs_load(&bs_dev, lvol_store_op_with_handle_complete, req); CU_ASSERT(g_lvserrno == -ENODEV); CU_ASSERT(g_lvol_store == NULL); + CU_ASSERT(TAILQ_EMPTY(&g_lvol_stores)); /* Fail on closing super blob */ g_lvserrno = 0; @@ -758,6 +767,7 @@ lvs_load(void) spdk_lvs_load(&bs_dev, lvol_store_op_with_handle_complete, req); CU_ASSERT(g_lvserrno == -ENODEV); CU_ASSERT(g_lvol_store == NULL); + CU_ASSERT(TAILQ_EMPTY(&g_lvol_stores)); /* Load successfully */ g_lvserrno = 0; @@ -768,11 +778,13 @@ lvs_load(void) spdk_lvs_load(&bs_dev, lvol_store_op_with_handle_complete, req); CU_ASSERT(g_lvserrno == 0); CU_ASSERT(g_lvol_store != NULL); + CU_ASSERT(!TAILQ_EMPTY(&g_lvol_stores)); g_lvserrno = -1; rc = spdk_lvs_unload(g_lvol_store, lvol_store_op_complete, NULL); CU_ASSERT(rc == 0); CU_ASSERT(g_lvserrno == 0); + CU_ASSERT(TAILQ_EMPTY(&g_lvol_stores)); free(req);