From ef675d38c1903e42a34786d0bfe82566e24dd379 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Wed, 11 May 2022 13:15:31 +0200 Subject: [PATCH] bdev/nvme: check discovery service trids during start Check that we're not already connected to a discovery service that has the same address (or has a referall to) as the service we're trying to start. Signed-off-by: Konrad Sztyber Change-Id: I84863fd959f62b30e9a348f69d10c7f1edffda7a Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12627 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Community-CI: Broadcom CI Reviewed-by: Shuhei Matsumoto Reviewed-by: Aleksey Marchuk --- module/bdev/nvme/bdev_nvme.c | 14 +++++++++++++- test/nvmf/host/discovery.sh | 6 ++++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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