From 29d94b7f018f0f0832c5f961a97ccd4b93539b1b Mon Sep 17 00:00:00 2001 From: Alexey Marchuk Date: Thu, 27 Jan 2022 15:38:20 +0300 Subject: [PATCH] nvmf: Stop all listeners when destroying transport When subsystem is destroyed, it removes its listeners, however transport level listeners remain active. This patch removes all transport listerners when the transport is being destroyed. Fixes issue 2353/ Signed-off-by: Alexey Marchuk Change-Id: Ica7bcb0052b626aa62d0da9049bb8f216027dc49 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11307 Community-CI: Mellanox Build Bot Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Ben Walker Reviewed-by: Konrad Sztyber --- lib/nvmf/transport.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/nvmf/transport.c b/lib/nvmf/transport.c index 578f0d4aa..2cb389d95 100644 --- a/lib/nvmf/transport.c +++ b/lib/nvmf/transport.c @@ -284,6 +284,8 @@ int spdk_nvmf_transport_destroy(struct spdk_nvmf_transport *transport, spdk_nvmf_transport_destroy_done_cb cb_fn, void *cb_arg) { + struct spdk_nvmf_listener *listener, *listener_tmp; + if (transport->data_buf_pool != NULL) { if (spdk_mempool_count(transport->data_buf_pool) != transport->opts.num_shared_buffers) { @@ -294,6 +296,12 @@ spdk_nvmf_transport_destroy(struct spdk_nvmf_transport *transport, spdk_mempool_free(transport->data_buf_pool); } + TAILQ_FOREACH_SAFE(listener, &transport->listeners, link, listener_tmp) { + TAILQ_REMOVE(&transport->listeners, listener, link); + transport->ops->stop_listen(transport, &listener->trid); + free(listener); + } + return transport->ops->destroy(transport, cb_fn, cb_arg); }