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 <james.r.harris@intel.com>
Change-Id: I37e8786f91cd578dd36fbec99ca23609419fc8f8

Reviewed-on: https://review.gerrithub.io/383012
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Jim Harris 2017-10-18 11:05:41 -07:00 committed by Daniel Verkamp
parent 17218f8f34
commit 7d8fe2ca2c
3 changed files with 40 additions and 0 deletions

View File

@ -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 {

View File

@ -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);

View File

@ -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);