From 5c0e1c266322ce20a1b637f682c11bc66723f4c5 Mon Sep 17 00:00:00 2001 From: Jacek Kalwas Date: Fri, 26 Nov 2021 06:51:14 -0500 Subject: [PATCH] nvmf: fix negative path for add transport to tgt in case of failure groups shall be destroyed Signed-off-by: Jacek Kalwas Change-Id: I8933f4128a7a3361bbb55d6a9c08a540521e5bda Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/10435 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Tomasz Zawadzki --- lib/nvmf/nvmf.c | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index 4265c9050..e91f37eb7 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -717,18 +717,52 @@ struct spdk_nvmf_tgt_add_transport_ctx { struct spdk_nvmf_transport *transport; spdk_nvmf_tgt_add_transport_done_fn cb_fn; void *cb_arg; + int status; }; +static void +_nvmf_tgt_remove_transport_done(struct spdk_io_channel_iter *i, int status) +{ + struct spdk_nvmf_tgt_add_transport_ctx *ctx = spdk_io_channel_iter_get_ctx(i); + + ctx->cb_fn(ctx->cb_arg, ctx->status); + free(ctx); +} + +static void +_nvmf_tgt_remove_transport(struct spdk_io_channel_iter *i) +{ + struct spdk_nvmf_tgt_add_transport_ctx *ctx = spdk_io_channel_iter_get_ctx(i); + struct spdk_io_channel *ch = spdk_io_channel_iter_get_channel(i); + struct spdk_nvmf_poll_group *group = spdk_io_channel_get_ctx(ch); + struct spdk_nvmf_transport_poll_group *tgroup, *tmp; + + TAILQ_FOREACH_SAFE(tgroup, &group->tgroups, link, tmp) { + if (tgroup->transport == ctx->transport) { + TAILQ_REMOVE(&group->tgroups, tgroup, link); + nvmf_transport_poll_group_destroy(tgroup); + } + } + + spdk_for_each_channel_continue(i, 0); +} + static void _nvmf_tgt_add_transport_done(struct spdk_io_channel_iter *i, int status) { struct spdk_nvmf_tgt_add_transport_ctx *ctx = spdk_io_channel_iter_get_ctx(i); - if (!status) { - ctx->transport->tgt = ctx->tgt; - TAILQ_INSERT_TAIL(&ctx->tgt->transports, ctx->transport, link); + if (status) { + ctx->status = status; + spdk_for_each_channel(ctx->tgt, + _nvmf_tgt_remove_transport, + ctx, + _nvmf_tgt_remove_transport_done); + return; } + ctx->transport->tgt = ctx->tgt; + TAILQ_INSERT_TAIL(&ctx->tgt->transports, ctx->transport, link); ctx->cb_fn(ctx->cb_arg, status); free(ctx); }