diff --git a/lib/iscsi/portal_grp.c b/lib/iscsi/portal_grp.c index 76c841938..e4f8aefdd 100644 --- a/lib/iscsi/portal_grp.c +++ b/lib/iscsi/portal_grp.c @@ -69,18 +69,13 @@ spdk_iscsi_portal_find_by_addr(const char *host, const char *port) struct spdk_iscsi_portal * spdk_iscsi_portal_create(const char *host, const char *port, const char *cpumask) { - struct spdk_iscsi_portal *p = NULL; + struct spdk_iscsi_portal *p = NULL, *tmp; struct spdk_cpuset *core_mask = NULL; int rc; 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 = calloc(1, sizeof(*p)); if (!p) { @@ -140,7 +135,16 @@ spdk_iscsi_portal_create(const char *host, const char *port, const char *cpumask p->group = NULL; /* set at a later time by caller */ p->acceptor_poller = NULL; + pthread_mutex_lock(&g_spdk_iscsi.mutex); + tmp = spdk_iscsi_portal_find_by_addr(host, port); + if (tmp != NULL) { + pthread_mutex_unlock(&g_spdk_iscsi.mutex); + SPDK_ERRLOG("portal (%s, %s) already exists\n", host, port); + goto error_out; + } + TAILQ_INSERT_TAIL(&g_spdk_iscsi.portal_head, p, g_tailq); + pthread_mutex_unlock(&g_spdk_iscsi.mutex); return p; @@ -159,11 +163,16 @@ spdk_iscsi_portal_destroy(struct spdk_iscsi_portal *p) assert(p != NULL); SPDK_DEBUGLOG(SPDK_LOG_ISCSI, "spdk_iscsi_portal_destroy\n"); + + pthread_mutex_lock(&g_spdk_iscsi.mutex); TAILQ_REMOVE(&g_spdk_iscsi.portal_head, p, g_tailq); + pthread_mutex_unlock(&g_spdk_iscsi.mutex); + free(p->host); free(p->port); spdk_cpuset_free(p->cpumask); free(p); + } static int @@ -562,13 +571,16 @@ spdk_iscsi_portal_grp_array_create(void) void spdk_iscsi_portal_grp_array_destroy(void) { - struct spdk_iscsi_portal_grp *pg, *tmp; + struct spdk_iscsi_portal_grp *pg; SPDK_DEBUGLOG(SPDK_LOG_ISCSI, "spdk_iscsi_portal_grp_array_destroy\n"); pthread_mutex_lock(&g_spdk_iscsi.mutex); - TAILQ_FOREACH_SAFE(pg, &g_spdk_iscsi.pg_head, tailq, tmp) { + while (!TAILQ_EMPTY(&g_spdk_iscsi.pg_head)) { + pg = TAILQ_FIRST(&g_spdk_iscsi.pg_head); TAILQ_REMOVE(&g_spdk_iscsi.pg_head, pg, tailq); + pthread_mutex_unlock(&g_spdk_iscsi.mutex); spdk_iscsi_portal_grp_destroy(pg); + pthread_mutex_lock(&g_spdk_iscsi.mutex); } pthread_mutex_unlock(&g_spdk_iscsi.mutex); } @@ -653,7 +665,5 @@ spdk_iscsi_portal_grp_release(struct spdk_iscsi_portal_grp *pg) { spdk_iscsi_portal_grp_close(pg); spdk_iscsi_portal_grp_unregister(pg); - pthread_mutex_lock(&g_spdk_iscsi.mutex); spdk_iscsi_portal_grp_destroy(pg); - pthread_mutex_unlock(&g_spdk_iscsi.mutex); } diff --git a/test/unit/lib/iscsi/portal_grp.c/portal_grp_ut.c b/test/unit/lib/iscsi/portal_grp.c/portal_grp_ut.c index 6006ca562..2a0454a9a 100644 --- a/test/unit/lib/iscsi/portal_grp.c/portal_grp_ut.c +++ b/test/unit/lib/iscsi/portal_grp.c/portal_grp_ut.c @@ -45,6 +45,7 @@ static int test_setup(void) { TAILQ_INIT(&g_spdk_iscsi.portal_head); + pthread_mutex_init(&g_spdk_iscsi.mutex, NULL); return 0; }