Commit 4185f778 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Jim Harris
Browse files

iscsi: check duplication of portal by portal list



Check duplication of registration of portals by using a global
portal list

Change-Id: I608fc9bd4473c11e69686e6474892f3f4272cd53
Signed-off-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/379929


Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 0b4a37d8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ spdk_acceptor(void *arg)
	struct spdk_iscsi_portal	*portal;

	TAILQ_FOREACH(portal_group, &iscsi->pg_head, tailq) {
		TAILQ_FOREACH(portal, &portal_group->head, tailq) {
		TAILQ_FOREACH(portal, &portal_group->head, per_pg_tailq) {
			spdk_iscsi_portal_accept(portal);
		}
	}
+1 −0
Original line number Diff line number Diff line
@@ -260,6 +260,7 @@ struct spdk_iscsi_globals {
	char *authfile;
	char *nodebase;
	pthread_mutex_t mutex;
	TAILQ_HEAD(, spdk_iscsi_portal)		portal_head;
	TAILQ_HEAD(, spdk_iscsi_portal_grp)	pg_head;
	TAILQ_HEAD(, spdk_iscsi_init_grp)	ig_head;
	int ntargets;
+4 −4
Original line number Diff line number Diff line
@@ -638,7 +638,7 @@ spdk_rpc_get_portal_groups(struct spdk_jsonrpc_request *request,

		spdk_json_write_name(w, "portals");
		spdk_json_write_array_begin(w);
		TAILQ_FOREACH(portal, &pg->head, tailq) {
		TAILQ_FOREACH(portal, &pg->head, per_pg_tailq) {
			spdk_json_write_object_begin(w);
			spdk_json_write_name(w, "host");
			spdk_json_write_string(w, portal->host);
@@ -737,7 +737,7 @@ spdk_rpc_add_portal_group(struct spdk_jsonrpc_request *request,
	struct rpc_portal_group req = {};
	struct spdk_iscsi_portal *portal_list[MAX_PORTAL] = {};
	struct spdk_json_write_ctx *w;
	size_t i;
	size_t i = 0;
	int rc = -1;

	if (spdk_json_decode_object(params, rpc_portal_group_decoders,
@@ -773,8 +773,8 @@ out:
	} else {
		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");

		for (i = 0; i < req.portal_list.num_portals; i++) {
			spdk_iscsi_portal_destroy(portal_list[i]);
		for (; i > 0; --i) {
			spdk_iscsi_portal_destroy(portal_list[i - 1]);
		}
	}
	free_rpc_portal_group(&req);
+1 −1
Original line number Diff line number Diff line
@@ -147,7 +147,7 @@ spdk_iscsi_config_dump_portal_groups(FILE *fp)
		if (NULL == pg) continue;
		fprintf(fp, PORTAL_GROUP_TMPL, pg->tag, pg->tag);
		/* Dump portals */
		TAILQ_FOREACH(p, &pg->head, tailq) {
		TAILQ_FOREACH(p, &pg->head, per_pg_tailq) {
			if (NULL == p) continue;
			fprintf(fp, PORTAL_TMPL, p->host, p->port);
		}
+28 −4
Original line number Diff line number Diff line
@@ -49,6 +49,20 @@
static int
spdk_iscsi_portal_grp_open(struct spdk_iscsi_portal_grp *pg);

static struct spdk_iscsi_portal *
spdk_iscsi_portal_find_by_addr(const char *host, const char *port)
{
	struct spdk_iscsi_portal *p;

	TAILQ_FOREACH(p, &g_spdk_iscsi.portal_head, g_tailq) {
		if (!strcmp(p->host, host) && !strcmp(p->port, port)) {
			return p;
		}
	}

	return NULL;
}

/* Assumes caller allocated host and port strings on the heap */
struct spdk_iscsi_portal *
spdk_iscsi_portal_create(const char *host, const char *port, uint64_t cpumask)
@@ -58,6 +72,12 @@ spdk_iscsi_portal_create(const char *host, const char *port, uint64_t cpumask)
	assert(host != NULL);
	assert(port != NULL);

	p = spdk_iscsi_portal_find_by_addr(host, port);
	if (p != NULL) {
		SPDK_ERRLOG("portal (%s, %s) already exists\n", host, port);
		return NULL;
	}

	p = malloc(sizeof(*p));
	if (!p) {
		SPDK_ERRLOG("portal malloc error (%s, %s)\n", host, port);
@@ -69,6 +89,8 @@ spdk_iscsi_portal_create(const char *host, const char *port, uint64_t cpumask)
	p->sock = -1;
	p->group = NULL; /* set at a later time by caller */

	TAILQ_INSERT_TAIL(&g_spdk_iscsi.portal_head, p, g_tailq);

	return p;
}

@@ -78,6 +100,7 @@ spdk_iscsi_portal_destroy(struct spdk_iscsi_portal *p)
	assert(p != NULL);

	SPDK_DEBUGLOG(SPDK_TRACE_ISCSI, "spdk_iscsi_portal_destroy\n");
	TAILQ_REMOVE(&g_spdk_iscsi.portal_head, p, g_tailq);
	free(p->host);
	free(p->port);
	free(p);
@@ -304,7 +327,7 @@ spdk_iscsi_portal_grp_destroy(struct spdk_iscsi_portal_grp *pg)
	SPDK_DEBUGLOG(SPDK_TRACE_ISCSI, "spdk_iscsi_portal_grp_destroy\n");
	while (!TAILQ_EMPTY(&pg->head)) {
		p = TAILQ_FIRST(&pg->head);
		TAILQ_REMOVE(&pg->head, p, tailq);
		TAILQ_REMOVE(&pg->head, p, per_pg_tailq);
		spdk_iscsi_portal_destroy(p);
	}
	free(pg);
@@ -466,7 +489,7 @@ spdk_iscsi_portal_grp_add_portal(struct spdk_iscsi_portal_grp *pg,
	assert(p != NULL);

	p->group = pg;
	TAILQ_INSERT_TAIL(&pg->head, p, tailq);
	TAILQ_INSERT_TAIL(&pg->head, p, per_pg_tailq);
}

struct spdk_iscsi_portal_grp *
@@ -489,6 +512,7 @@ spdk_iscsi_portal_grp_array_create(void)
	int rc = 0;
	struct spdk_conf_section *sp;

	TAILQ_INIT(&g_spdk_iscsi.portal_head);
	TAILQ_INIT(&g_spdk_iscsi.pg_head);
	sp = spdk_conf_first_section(NULL);
	while (sp != NULL) {
@@ -531,7 +555,7 @@ spdk_iscsi_portal_grp_open(struct spdk_iscsi_portal_grp *pg)
	struct spdk_iscsi_portal *p;
	int rc;

	TAILQ_FOREACH(p, &pg->head, tailq) {
	TAILQ_FOREACH(p, &pg->head, per_pg_tailq) {
		rc = spdk_iscsi_portal_open(p);
		if (rc < 0) {
			return rc;
@@ -564,7 +588,7 @@ spdk_iscsi_portal_grp_close(struct spdk_iscsi_portal_grp *pg)
{
	struct spdk_iscsi_portal *p;

	TAILQ_FOREACH(p, &pg->head, tailq) {
	TAILQ_FOREACH(p, &pg->head, per_pg_tailq) {
		spdk_iscsi_portal_close(p);
	}
}
Loading