From fdd5151e6b314d7fdd4ed3e4382711f8ad723380 Mon Sep 17 00:00:00 2001 From: yidong0635 Date: Tue, 31 Mar 2020 07:17:01 -0400 Subject: [PATCH] lib/nvmf: Free listener if executing listening failed. We callocated the listener, but if we to execute the listening behaviors which got failed, and all the other resources have been released, only left listener. Fixes issue #1326. Signed-off-by: yidong0635 Change-Id: I020b509caed79e9880d07b01888ed389630ff67f Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1595 Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Changpeng Liu Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris Reviewed-by: Ben Walker Reviewed-by: Darek Stojaczyk Reviewed-by: Tomasz Zawadzki --- lib/nvmf/transport.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/nvmf/transport.c b/lib/nvmf/transport.c index 6a08d2355..78cd288b1 100644 --- a/lib/nvmf/transport.c +++ b/lib/nvmf/transport.c @@ -208,6 +208,7 @@ spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport, const struct spdk_nvme_transport_id *trid) { struct spdk_nvmf_listener *listener; + int rc; listener = spdk_nvmf_transport_find_listener(transport, trid); if (!listener) { @@ -219,7 +220,13 @@ spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport, listener->ref = 1; listener->trid = *trid; TAILQ_INSERT_TAIL(&transport->listeners, listener, link); - return transport->ops->listen(transport, &listener->trid); + + rc = transport->ops->listen(transport, &listener->trid); + if (rc != 0) { + TAILQ_REMOVE(&transport->listeners, listener, link); + free(listener); + } + return rc; } ++listener->ref;