diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index 3ff83a67c..dbed700a0 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -447,6 +447,9 @@ void spdk_nvmf_subsystem_remove_all_listeners(struct spdk_nvmf_subsystem *subsys bool stop); struct spdk_nvmf_ctrlr *spdk_nvmf_subsystem_get_ctrlr(struct spdk_nvmf_subsystem *subsystem, uint16_t cntlid); +struct spdk_nvmf_listener *spdk_nvmf_subsystem_find_listener(struct spdk_nvmf_subsystem *subsystem, + const struct spdk_nvme_transport_id *trid); + int spdk_nvmf_ctrlr_async_event_ns_notice(struct spdk_nvmf_ctrlr *ctrlr); void spdk_nvmf_ctrlr_async_event_reservation_notification(struct spdk_nvmf_ctrlr *ctrlr); void spdk_nvmf_ns_reservation_request(void *ctx); diff --git a/lib/nvmf/nvmf_rpc.c b/lib/nvmf/nvmf_rpc.c index 061de38d5..9855c942a 100644 --- a/lib/nvmf/nvmf_rpc.c +++ b/lib/nvmf/nvmf_rpc.c @@ -655,8 +655,10 @@ nvmf_rpc_listen_paused(struct spdk_nvmf_subsystem *subsystem, struct nvmf_rpc_listener_ctx *ctx = cb_arg; if (ctx->op == NVMF_RPC_LISTEN_ADD) { - spdk_nvmf_tgt_listen(ctx->tgt, &ctx->trid, nvmf_rpc_tgt_listen, ctx); - return; + if (!spdk_nvmf_subsystem_find_listener(subsystem, &ctx->trid)) { + spdk_nvmf_tgt_listen(ctx->tgt, &ctx->trid, nvmf_rpc_tgt_listen, ctx); + return; + } } else if (ctx->op == NVMF_RPC_LISTEN_REMOVE) { if (spdk_nvmf_subsystem_remove_listener(subsystem, &ctx->trid)) { SPDK_ERRLOG("Unable to remove listener.\n"); diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index eace99f97..c62797d6d 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -732,9 +732,9 @@ 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 * +spdk_nvmf_subsystem_find_listener(struct spdk_nvmf_subsystem *subsystem, + const struct spdk_nvme_transport_id *trid) { struct spdk_nvmf_listener *listener; @@ -759,7 +759,7 @@ spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem, return -EAGAIN; } - if (_spdk_nvmf_subsystem_find_listener(subsystem, trid)) { + if (spdk_nvmf_subsystem_find_listener(subsystem, trid)) { /* Listener already exists in this subsystem */ return 0; } @@ -795,7 +795,7 @@ spdk_nvmf_subsystem_remove_listener(struct spdk_nvmf_subsystem *subsystem, return -EAGAIN; } - listener = _spdk_nvmf_subsystem_find_listener(subsystem, trid); + listener = spdk_nvmf_subsystem_find_listener(subsystem, trid); if (listener == NULL) { return -ENOENT; }