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:
parent
17218f8f34
commit
7d8fe2ca2c
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user