iscsi: Consolidating checking uniqueness of IG into register/unregister
Checking uniqueness of initiator group is done without mutex and before register/unregister. This is not thread-safe. This patch is a preparation to dynamic addition of initiator information to existing initiator groups. Change-Id: I44f48c857210522eee70d14bc3735ec73b0c5c6f Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-on: https://review.gerrithub.io/397032 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
2ea005f0a9
commit
13cffa4a0d
@ -47,11 +47,6 @@ spdk_iscsi_init_grp_create(int tag)
|
||||
{
|
||||
struct spdk_iscsi_init_grp *ig;
|
||||
|
||||
if (spdk_iscsi_init_grp_find_by_tag(tag)) {
|
||||
SPDK_ERRLOG("duplicate initiator group tag (%d)\n", tag);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ig = calloc(1, sizeof(*ig));
|
||||
if (ig == NULL) {
|
||||
SPDK_ERRLOG("calloc() failed for initiator group\n");
|
||||
@ -396,14 +391,23 @@ cleanup:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void
|
||||
int
|
||||
spdk_iscsi_init_grp_register(struct spdk_iscsi_init_grp *ig)
|
||||
{
|
||||
struct spdk_iscsi_init_grp *tmp;
|
||||
int rc = -1;
|
||||
|
||||
assert(ig != NULL);
|
||||
|
||||
pthread_mutex_lock(&g_spdk_iscsi.mutex);
|
||||
TAILQ_INSERT_TAIL(&g_spdk_iscsi.ig_head, ig, tailq);
|
||||
tmp = spdk_iscsi_init_grp_find_by_tag(ig->tag);
|
||||
if (tmp == NULL) {
|
||||
TAILQ_INSERT_TAIL(&g_spdk_iscsi.ig_head, ig, tailq);
|
||||
rc = 0;
|
||||
}
|
||||
pthread_mutex_unlock(&g_spdk_iscsi.mutex);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -442,19 +446,22 @@ spdk_iscsi_init_grp_create_from_initiator_list(int tag,
|
||||
initiator_masks);
|
||||
if (rc < 0) {
|
||||
SPDK_ERRLOG("add initiator netmask error\n");
|
||||
spdk_iscsi_init_grp_delete_all_initiators(ig);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
spdk_iscsi_init_grp_register(ig);
|
||||
rc = spdk_iscsi_init_grp_register(ig);
|
||||
if (rc < 0) {
|
||||
SPDK_ERRLOG("initiator group register error (%d)\n", tag);
|
||||
goto cleanup;
|
||||
}
|
||||
return 0;
|
||||
|
||||
cleanup:
|
||||
free(ig);
|
||||
spdk_iscsi_init_grp_destroy(ig);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
spdk_iscsi_init_grp_destroy(struct spdk_iscsi_init_grp *ig)
|
||||
{
|
||||
if (!ig) {
|
||||
@ -518,28 +525,20 @@ spdk_iscsi_init_grp_array_destroy(void)
|
||||
}
|
||||
pthread_mutex_unlock(&g_spdk_iscsi.mutex);
|
||||
}
|
||||
static inline void
|
||||
spdk_initiator_group_unregister(struct spdk_iscsi_init_grp *ig)
|
||||
{
|
||||
struct spdk_iscsi_init_grp *initiator_group;
|
||||
struct spdk_iscsi_init_grp *initiator_group_tmp;
|
||||
|
||||
assert(ig != NULL);
|
||||
struct spdk_iscsi_init_grp *
|
||||
spdk_iscsi_init_grp_unregister(int tag)
|
||||
{
|
||||
struct spdk_iscsi_init_grp *ig;
|
||||
|
||||
pthread_mutex_lock(&g_spdk_iscsi.mutex);
|
||||
TAILQ_FOREACH_SAFE(initiator_group, &g_spdk_iscsi.ig_head, tailq, initiator_group_tmp) {
|
||||
if (ig->tag == initiator_group->tag) {
|
||||
TAILQ_REMOVE(&g_spdk_iscsi.ig_head, initiator_group, tailq);
|
||||
TAILQ_FOREACH(ig, &g_spdk_iscsi.ig_head, tailq) {
|
||||
if (ig->tag == tag) {
|
||||
TAILQ_REMOVE(&g_spdk_iscsi.ig_head, ig, tailq);
|
||||
pthread_mutex_unlock(&g_spdk_iscsi.mutex);
|
||||
return ig;
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&g_spdk_iscsi.mutex);
|
||||
}
|
||||
|
||||
void
|
||||
spdk_iscsi_init_grp_release(struct spdk_iscsi_init_grp *ig)
|
||||
{
|
||||
spdk_initiator_group_unregister(ig);
|
||||
pthread_mutex_lock(&g_spdk_iscsi.mutex);
|
||||
spdk_iscsi_init_grp_destroy(ig);
|
||||
pthread_mutex_unlock(&g_spdk_iscsi.mutex);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -61,8 +61,10 @@ struct spdk_iscsi_init_grp {
|
||||
int spdk_iscsi_init_grp_create_from_initiator_list(int tag,
|
||||
int num_initiator_names, char **initiator_names,
|
||||
int num_initiator_masks, char **initiator_masks);
|
||||
void spdk_iscsi_init_grp_release(struct spdk_iscsi_init_grp *ig);
|
||||
int spdk_iscsi_init_grp_register(struct spdk_iscsi_init_grp *ig);
|
||||
struct spdk_iscsi_init_grp *spdk_iscsi_init_grp_unregister(int tag);
|
||||
struct spdk_iscsi_init_grp *spdk_iscsi_init_grp_find_by_tag(int tag);
|
||||
void spdk_iscsi_init_grp_destroy(struct spdk_iscsi_init_grp *ig);
|
||||
int spdk_iscsi_init_grp_array_create(void);
|
||||
void spdk_iscsi_init_grp_array_destroy(void);
|
||||
|
||||
|
@ -229,12 +229,12 @@ spdk_rpc_delete_initiator_group(struct spdk_jsonrpc_request *request,
|
||||
goto invalid;
|
||||
}
|
||||
|
||||
ig = spdk_iscsi_init_grp_find_by_tag(req.tag);
|
||||
ig = spdk_iscsi_init_grp_unregister(req.tag);
|
||||
if (!ig) {
|
||||
goto invalid;
|
||||
}
|
||||
spdk_iscsi_tgt_node_delete_map(NULL, ig);
|
||||
spdk_iscsi_init_grp_release(ig);
|
||||
spdk_iscsi_init_grp_destroy(ig);
|
||||
|
||||
w = spdk_jsonrpc_begin_result(request);
|
||||
if (w == NULL) {
|
||||
|
@ -115,17 +115,20 @@ create_initiator_group_success_case(void)
|
||||
static void
|
||||
find_initiator_group_success_case(void)
|
||||
{
|
||||
struct spdk_iscsi_init_grp *ig;
|
||||
struct spdk_iscsi_init_grp *ig, *tmp;
|
||||
int rc;
|
||||
|
||||
ig = spdk_iscsi_init_grp_create(1);
|
||||
CU_ASSERT(ig != NULL);
|
||||
|
||||
spdk_iscsi_init_grp_register(ig);
|
||||
rc = spdk_iscsi_init_grp_register(ig);
|
||||
CU_ASSERT(rc == 0);
|
||||
|
||||
ig = spdk_iscsi_init_grp_find_by_tag(1);
|
||||
CU_ASSERT(ig != NULL);
|
||||
|
||||
spdk_initiator_group_unregister(ig);
|
||||
tmp = spdk_iscsi_init_grp_unregister(1);
|
||||
CU_ASSERT(ig == tmp);
|
||||
spdk_iscsi_init_grp_destroy(ig);
|
||||
|
||||
ig = spdk_iscsi_init_grp_find_by_tag(1);
|
||||
@ -133,22 +136,25 @@ find_initiator_group_success_case(void)
|
||||
}
|
||||
|
||||
static void
|
||||
create_initiator_group_fail_case(void)
|
||||
register_initiator_group_twice_case(void)
|
||||
{
|
||||
struct spdk_iscsi_init_grp *ig;
|
||||
struct spdk_iscsi_init_grp *ig, *tmp;
|
||||
int rc;
|
||||
|
||||
ig = spdk_iscsi_init_grp_create(1);
|
||||
CU_ASSERT(ig != NULL);
|
||||
|
||||
spdk_iscsi_init_grp_register(ig);
|
||||
rc = spdk_iscsi_init_grp_register(ig);
|
||||
CU_ASSERT(rc == 0);
|
||||
|
||||
ig = spdk_iscsi_init_grp_create(1);
|
||||
CU_ASSERT(ig == NULL);
|
||||
rc = spdk_iscsi_init_grp_register(ig);
|
||||
CU_ASSERT(rc != 0);
|
||||
|
||||
ig = spdk_iscsi_init_grp_find_by_tag(1);
|
||||
CU_ASSERT(ig != NULL);
|
||||
|
||||
spdk_initiator_group_unregister(ig);
|
||||
tmp = spdk_iscsi_init_grp_unregister(1);
|
||||
CU_ASSERT(tmp == ig);
|
||||
spdk_iscsi_init_grp_destroy(ig);
|
||||
|
||||
ig = spdk_iscsi_init_grp_find_by_tag(1);
|
||||
@ -158,6 +164,7 @@ create_initiator_group_fail_case(void)
|
||||
static void
|
||||
add_initiator_name_success_case(void)
|
||||
{
|
||||
|
||||
int rc;
|
||||
struct spdk_iscsi_init_grp *ig;
|
||||
struct spdk_iscsi_initiator_name *iname;
|
||||
@ -475,8 +482,8 @@ main(int argc, char **argv)
|
||||
create_initiator_group_success_case) == NULL
|
||||
|| CU_add_test(suite, "find initiator group success case",
|
||||
find_initiator_group_success_case) == NULL
|
||||
|| CU_add_test(suite, "create initiator group fail case",
|
||||
create_initiator_group_fail_case) == NULL
|
||||
|| CU_add_test(suite, "register initiator group twice case",
|
||||
register_initiator_group_twice_case) == NULL
|
||||
|| CU_add_test(suite, "add initiator name success case",
|
||||
add_initiator_name_success_case) == NULL
|
||||
|| CU_add_test(suite, "add initiator name fail case",
|
||||
|
Loading…
Reference in New Issue
Block a user