diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index b89215a8b..1e174ce68 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -5170,10 +5170,23 @@ bdev_nvme_start_discovery(struct spdk_nvme_transport_id *trid, struct discovery_ctx *ctx; struct discovery_entry_ctx *discovery_entry_ctx; + snprintf(trid->subnqn, sizeof(trid->subnqn), "%s", SPDK_NVMF_DISCOVERY_NQN); TAILQ_FOREACH(ctx, &g_discovery_ctxs, tailq) { if (strcmp(ctx->name, base_name) == 0) { return -EEXIST; } + + if (ctx->entry_ctx_in_use != NULL) { + if (!spdk_nvme_transport_id_compare(trid, &ctx->entry_ctx_in_use->trid)) { + return -EEXIST; + } + } + + TAILQ_FOREACH(discovery_entry_ctx, &ctx->discovery_entry_ctxs, tailq) { + if (!spdk_nvme_transport_id_compare(trid, &discovery_entry_ctx->trid)) { + return -EEXIST; + } + } } ctx = calloc(1, sizeof(*ctx)); @@ -5200,7 +5213,6 @@ bdev_nvme_start_discovery(struct spdk_nvme_transport_id *trid, ctx->cb_ctx = cb_ctx; TAILQ_INIT(&ctx->nvm_entry_ctxs); TAILQ_INIT(&ctx->discovery_entry_ctxs); - snprintf(trid->subnqn, sizeof(trid->subnqn), "%s", SPDK_NVMF_DISCOVERY_NQN); memcpy(&ctx->trid, trid, sizeof(*trid)); /* Even if user did not specify hostnqn, we can still strdup("\0"); */ ctx->hostnqn = strdup(ctx->drv_opts.hostnqn); diff --git a/test/nvmf/host/discovery.sh b/test/nvmf/host/discovery.sh index 6a9ecb4ba..b0add5c9b 100755 --- a/test/nvmf/host/discovery.sh +++ b/test/nvmf/host/discovery.sh @@ -145,6 +145,12 @@ NOT $rpc_py -s $HOST_SOCK bdev_nvme_start_discovery -b nvme -t $TEST_TRANSPORT \ [[ $(get_discovery_ctrlrs) == "nvme" ]] [[ $(get_bdev_list) == "nvme0n1 nvme0n2" ]] +# Make sure that it's also impossible to start the discovery using the same trid +NOT $rpc_py -s $HOST_SOCK bdev_nvme_start_discovery -b nvme_second -t $TEST_TRANSPORT \ + -a $NVMF_FIRST_TARGET_IP -s $DISCOVERY_PORT -f ipv4 -q $HOST_NQN -w +[[ $(get_discovery_ctrlrs) == "nvme" ]] +[[ $(get_bdev_list) == "nvme0n1 nvme0n2" ]] + trap - SIGINT SIGTERM EXIT kill $hostpid