From 6ad3a5ce9b82fa9ce1ff9de1e5b88d2c62b0b740 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Tue, 6 Feb 2018 08:24:02 -0700 Subject: [PATCH] nvmf: check for duplicate listen addresses Don't allow a duplicate listener to be added to a subsystem. Change-Id: I1a5f2ae09146a31859921430fb716a36d7f2048e Signed-off-by: Daniel Verkamp Reviewed-on: https://review.gerrithub.io/398652 Tested-by: SPDK Automated Test System Reviewed-by: Changpeng Liu Reviewed-by: Jim Harris --- lib/nvmf/subsystem.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index e66ea7868..de07186cf 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -649,6 +649,21 @@ spdk_nvmf_host_get_nqn(struct spdk_nvmf_host *host) return host->nqn; } +static struct spdk_nvmf_listener * +_spdk_nvmf_subsystem_find_listener(struct spdk_nvmf_subsystem *subsystem, + const struct spdk_nvme_transport_id *trid) +{ + struct spdk_nvmf_listener *listener; + + TAILQ_FOREACH(listener, &subsystem->listeners, link) { + if (spdk_nvme_transport_id_compare(&listener->trid, trid) == 0) { + return listener; + } + } + + return NULL; +} + int spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem, struct spdk_nvme_transport_id *trid) @@ -661,6 +676,11 @@ spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem, return -EAGAIN; } + if (_spdk_nvmf_subsystem_find_listener(subsystem, trid)) { + /* Listener already exists in this subsystem */ + return 0; + } + transport = spdk_nvmf_tgt_get_transport(subsystem->tgt, trid->trtype); if (transport == NULL) { SPDK_ERRLOG("Unknown transport type %d\n", trid->trtype);