From d1b0d2cbe5eeb9475bc936eac79dae18e8672a7a Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Mon, 20 Jul 2020 14:34:16 -0700 Subject: [PATCH] nvmf/rpc: stop_listen rpc now uses the async stop listen function. Signed-off-by: Seth Howell Change-Id: Ie7352d6f1a9d74557a92c6e39c376856804f021c Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3450 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Aleksey Marchuk Reviewed-by: Ziye Yang --- lib/nvmf/nvmf_rpc.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/nvmf/nvmf_rpc.c b/lib/nvmf/nvmf_rpc.c index 5dc9f42f0..afb91aa4c 100644 --- a/lib/nvmf/nvmf_rpc.c +++ b/lib/nvmf/nvmf_rpc.c @@ -587,6 +587,7 @@ struct nvmf_rpc_listener_ctx { char *nqn; char *tgt_name; struct spdk_nvmf_tgt *tgt; + struct spdk_nvmf_transport *transport; struct spdk_nvmf_subsystem *subsystem; struct rpc_listen_address address; @@ -656,6 +657,26 @@ nvmf_rpc_subsystem_listen(void *cb_arg, int status) /* Can't really do anything to recover here - subsystem will remain paused. */ } } +static void +nvmf_rpc_stop_listen_async_done(void *cb_arg, int status) +{ + struct nvmf_rpc_listener_ctx *ctx = cb_arg; + + if (status) { + SPDK_ERRLOG("Unable to remove listener.\n"); + spdk_jsonrpc_send_error_response_fmt(ctx->request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, + "error stopping listener: %d\n", status); + ctx->response_sent = true; + } + + if (spdk_nvmf_subsystem_resume(ctx->subsystem, nvmf_rpc_listen_resumed, ctx)) { + if (!ctx->response_sent) { + spdk_jsonrpc_send_error_response(ctx->request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Internal error"); + } + nvmf_rpc_listener_ctx_free(ctx); + /* Can't really do anything to recover here - subsystem will remain paused. */ + } +} static void nvmf_rpc_listen_paused(struct spdk_nvmf_subsystem *subsystem, @@ -683,7 +704,9 @@ nvmf_rpc_listen_paused(struct spdk_nvmf_subsystem *subsystem, "Invalid parameters"); ctx->response_sent = true; } - spdk_nvmf_tgt_stop_listen(ctx->tgt, &ctx->trid); + spdk_nvmf_transport_stop_listen_async(ctx->transport, &ctx->trid, nvmf_rpc_stop_listen_async_done, + ctx); + return; } else { SPDK_UNREACHABLE(); } @@ -857,6 +880,14 @@ rpc_nvmf_subsystem_remove_listener(struct spdk_jsonrpc_request *request, return; } + ctx->transport = spdk_nvmf_tgt_get_transport(tgt, ctx->trid.trstring); + if (!ctx->transport) { + spdk_jsonrpc_send_error_response(ctx->request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, + "Invalid parameters"); + nvmf_rpc_listener_ctx_free(ctx); + return; + } + ctx->op = NVMF_RPC_LISTEN_REMOVE; if (spdk_nvmf_subsystem_pause(subsystem, nvmf_rpc_listen_paused, ctx)) {