diff --git a/include/spdk/nvmf.h b/include/spdk/nvmf.h index 3e26a2ae6..588e8e342 100644 --- a/include/spdk/nvmf.h +++ b/include/spdk/nvmf.h @@ -50,6 +50,8 @@ extern "C" { #endif +#define NVMF_TGT_NAME_MAX_LENGTH 256 + struct spdk_nvmf_tgt; struct spdk_nvmf_subsystem; struct spdk_nvmf_ctrlr; @@ -64,6 +66,7 @@ struct spdk_json_write_ctx; struct spdk_nvmf_transport; struct spdk_nvmf_target_opts { + char name[NVMF_TGT_NAME_MAX_LENGTH]; uint32_t max_subsystems; }; diff --git a/lib/event/subsystems/nvmf/conf.c b/lib/event/subsystems/nvmf/conf.c index 4f1f0a9c2..1b1370172 100644 --- a/lib/event/subsystems/nvmf/conf.c +++ b/lib/event/subsystems/nvmf/conf.c @@ -186,7 +186,10 @@ spdk_nvmf_parse_nvmf_tgt(void) { int rc; int using_deprecated_options; - struct spdk_nvmf_target_opts opts = { 0 }; + struct spdk_nvmf_target_opts opts = { + .name = "nvmf_tgt", + .max_subsystems = 0 + }; if (!g_spdk_nvmf_tgt_max_subsystems) { using_deprecated_options = spdk_nvmf_parse_tgt_max_subsystems(); diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index d9c3ef7cf..b90e838c8 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -221,13 +221,27 @@ spdk_nvmf_tgt_destroy_poll_group_qpairs(struct spdk_nvmf_poll_group *group) struct spdk_nvmf_tgt * spdk_nvmf_tgt_create(struct spdk_nvmf_target_opts *opts) { - struct spdk_nvmf_tgt *tgt; + struct spdk_nvmf_tgt *tgt, *tmp_tgt; + + if (strnlen(opts->name, NVMF_TGT_NAME_MAX_LENGTH) == NVMF_TGT_NAME_MAX_LENGTH) { + SPDK_ERRLOG("Provided target name exceeds the max length of %u.\n", NVMF_TGT_NAME_MAX_LENGTH); + return NULL; + } + + TAILQ_FOREACH(tmp_tgt, &g_nvmf_tgts, link) { + if (!strncmp(opts->name, tmp_tgt->name, strlen(tmp_tgt->name))) { + SPDK_ERRLOG("Provided target name must be unique.\n"); + return NULL; + } + } tgt = calloc(1, sizeof(*tgt)); if (!tgt) { return NULL; } + snprintf(tgt->name, NVMF_TGT_NAME_MAX_LENGTH, "%s", opts->name); + if (!opts || !opts->max_subsystems) { tgt->max_subsystems = SPDK_NVMF_DEFAULT_MAX_SUBSYSTEMS; } else { @@ -251,7 +265,7 @@ spdk_nvmf_tgt_create(struct spdk_nvmf_target_opts *opts) spdk_nvmf_tgt_create_poll_group, spdk_nvmf_tgt_destroy_poll_group, sizeof(struct spdk_nvmf_poll_group), - "nvmf_tgt"); + tgt->name); return tgt; } diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index a74d9b3ce..616de2eb4 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -74,6 +74,8 @@ enum spdk_nvmf_qpair_state { typedef void (*spdk_nvmf_state_change_done)(void *cb_arg, int status); struct spdk_nvmf_tgt { + char name[NVMF_TGT_NAME_MAX_LENGTH]; + uint64_t discovery_genctr; uint32_t max_subsystems; diff --git a/test/unit/lib/nvmf/fc.c/fc_ut.c b/test/unit/lib/nvmf/fc.c/fc_ut.c index 9aeb3e522..cd95d258c 100644 --- a/test/unit/lib/nvmf/fc.c/fc_ut.c +++ b/test/unit/lib/nvmf/fc.c/fc_ut.c @@ -264,8 +264,11 @@ static void create_transport_test(void) { const struct spdk_nvmf_transport_ops *ops = NULL; - struct spdk_nvmf_target_opts tgt_opts = { 0 }; struct spdk_nvmf_transport_opts opts = { 0 }; + struct spdk_nvmf_target_opts tgt_opts = { + .name = "nvmf_test_tgt", + .max_subsystems = 0 + }; allocate_threads(8); set_thread(0);