diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index 7c398bd7a..62b0425b8 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -83,6 +83,55 @@ spdk_nvmf_tgt_fini(void) return 0; } +struct spdk_nvmf_listen_addr * +spdk_nvmf_listen_addr_create(char *trname, char *traddr, char *trsvcid) +{ + struct spdk_nvmf_listen_addr *listen_addr; + const struct spdk_nvmf_transport *transport; + + transport = spdk_nvmf_transport_get(trname); + if (!transport) { + return NULL; + } + + listen_addr = calloc(1, sizeof(*listen_addr)); + if (!listen_addr) { + return NULL; + } + + listen_addr->traddr = strdup(traddr); + if (!listen_addr->traddr) { + free(listen_addr); + return NULL; + } + + listen_addr->trsvcid = strdup(trsvcid); + if (!listen_addr->trsvcid) { + free(listen_addr->traddr); + free(listen_addr); + return NULL; + } + + listen_addr->trname = strdup(trname); + if (!listen_addr->trname) { + free(listen_addr->traddr); + free(listen_addr->trsvcid); + free(listen_addr); + return NULL; + } + + return listen_addr; +} + +void +spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr) +{ + free(addr->trname); + free(addr->trsvcid); + free(addr->traddr); + free(addr); +} + SPDK_TRACE_REGISTER_FN(nvmf_trace) { spdk_trace_register_object(OBJECT_NVMF_IO, 'r'); diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index ae5bbf040..5af7dc7a8 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -78,4 +78,8 @@ nvmf_u32log2(uint32_t x) extern struct spdk_nvmf_globals g_nvmf_tgt; +struct spdk_nvmf_listen_addr *spdk_nvmf_listen_addr_create(char *trname, char *traddr, + char *trsvcid); +void spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr); + #endif /* __NVMF_INTERNAL_H__ */ diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index 15417156a..3e43d1d60 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -225,10 +225,7 @@ spdk_nvmf_delete_subsystem(struct spdk_nvmf_subsystem *subsystem) TAILQ_FOREACH_SAFE(listen_addr, &subsystem->listen_addrs, link, listen_addr_tmp) { TAILQ_REMOVE(&subsystem->listen_addrs, listen_addr, link); - free(listen_addr->traddr); - free(listen_addr->trsvcid); - free(listen_addr->trname); - free(listen_addr); + spdk_nvmf_listen_addr_destroy(listen_addr); subsystem->num_listen_addrs--; } @@ -266,32 +263,11 @@ spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem, return -1; } - listen_addr = calloc(1, sizeof(*listen_addr)); + listen_addr = spdk_nvmf_listen_addr_create(trname, traddr, trsvcid); if (!listen_addr) { return -1; } - listen_addr->traddr = strdup(traddr); - if (!listen_addr->traddr) { - free(listen_addr); - return -1; - } - - listen_addr->trsvcid = strdup(trsvcid); - if (!listen_addr->trsvcid) { - free(listen_addr->traddr); - free(listen_addr); - return -1; - } - - listen_addr->trname = strdup(trname); - if (!listen_addr->trname) { - free(listen_addr->traddr); - free(listen_addr->trsvcid); - free(listen_addr); - return -1; - } - TAILQ_INSERT_HEAD(&subsystem->listen_addrs, listen_addr, link); subsystem->num_listen_addrs++; g_discovery_genctr++; diff --git a/test/lib/nvmf/subsystem/subsystem_ut.c b/test/lib/nvmf/subsystem/subsystem_ut.c index e58831796..e9c1e082e 100644 --- a/test/lib/nvmf/subsystem/subsystem_ut.c +++ b/test/lib/nvmf/subsystem/subsystem_ut.c @@ -48,6 +48,49 @@ SPDK_LOG_REGISTER_TRACE_FLAG("nvmf", SPDK_TRACE_NVMF) struct spdk_nvmf_globals g_nvmf_tgt; +struct spdk_nvmf_listen_addr * +spdk_nvmf_listen_addr_create(char *trname, char *traddr, char *trsvcid) +{ + struct spdk_nvmf_listen_addr *listen_addr; + + listen_addr = calloc(1, sizeof(*listen_addr)); + if (!listen_addr) { + return NULL; + } + + listen_addr->traddr = strdup(traddr); + if (!listen_addr->traddr) { + free(listen_addr); + return NULL; + } + + listen_addr->trsvcid = strdup(trsvcid); + if (!listen_addr->trsvcid) { + free(listen_addr->traddr); + free(listen_addr); + return NULL; + } + + listen_addr->trname = strdup(trname); + if (!listen_addr->trname) { + free(listen_addr->traddr); + free(listen_addr->trsvcid); + free(listen_addr); + return NULL; + } + + return listen_addr; +} + +void +spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr) +{ + free(addr->trname); + free(addr->trsvcid); + free(addr->traddr); + free(addr); +} + static int test_transport1_listen_addr_add(struct spdk_nvmf_listen_addr *listen_addr) {