Commit 13cffa4a authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Jim Harris
Browse files

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: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/397032


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 2ea005f0
Loading
Loading
Loading
Loading
+28 −29
Original line number Diff line number Diff line
@@ -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);
	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;
		}
	}

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;
}
+3 −1
Original line number Diff line number Diff line
@@ -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);

+2 −2
Original line number Diff line number Diff line
@@ -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) {
+18 −11
Original line number Diff line number Diff line
@@ -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",