From 761056f8d2055ff271777b2c4defd6de781f0f89 Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Tue, 21 Jun 2022 14:08:00 -0700 Subject: [PATCH] nvmf: Make spdk_nvmf_subsystem_pause accept the broadcast NSID If the broadcast NSID is supplied, every namespace is paused. Change-Id: I40cc3e04b5a75b731ab0c8946ed8146275cc8ee4 Signed-off-by: Ben Walker Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13394 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Paul Luse Reviewed-by: Changpeng Liu --- lib/nvmf/nvmf.c | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index 0777d0dcc..9f7df8c88 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -1524,6 +1524,7 @@ nvmf_poll_group_pause_subsystem(struct spdk_nvmf_poll_group *group, struct spdk_nvmf_subsystem_poll_group *sgroup; struct spdk_nvmf_subsystem_pg_ns_info *ns_info = NULL; int rc = 0; + uint32_t i; if (subsystem->id >= group->num_sgroups) { rc = -1; @@ -1536,10 +1537,17 @@ nvmf_poll_group_pause_subsystem(struct spdk_nvmf_poll_group *group, } sgroup->state = SPDK_NVMF_SUBSYSTEM_PAUSING; - /* NOTE: This implicitly also checks for 0, since 0 - 1 wraps around to UINT32_MAX. */ - if (nsid - 1 < sgroup->num_ns) { - ns_info = &sgroup->ns_info[nsid - 1]; - ns_info->state = SPDK_NVMF_SUBSYSTEM_PAUSING; + if (nsid == SPDK_NVME_GLOBAL_NS_TAG) { + for (i = 0; i < sgroup->num_ns; i++) { + ns_info = &sgroup->ns_info[i]; + ns_info->state = SPDK_NVMF_SUBSYSTEM_PAUSING; + } + } else { + /* NOTE: This implicitly also checks for 0, since 0 - 1 wraps around to UINT32_MAX. */ + if (nsid - 1 < sgroup->num_ns) { + ns_info = &sgroup->ns_info[nsid - 1]; + ns_info->state = SPDK_NVMF_SUBSYSTEM_PAUSING; + } } if (sgroup->mgmt_io_outstanding > 0) { @@ -1550,12 +1558,26 @@ nvmf_poll_group_pause_subsystem(struct spdk_nvmf_poll_group *group, return; } - if (ns_info != NULL && ns_info->io_outstanding > 0) { - assert(sgroup->cb_fn == NULL); - sgroup->cb_fn = cb_fn; - assert(sgroup->cb_arg == NULL); - sgroup->cb_arg = cb_arg; - return; + if (nsid == SPDK_NVME_GLOBAL_NS_TAG) { + for (i = 0; i < sgroup->num_ns; i++) { + ns_info = &sgroup->ns_info[i]; + + if (ns_info->io_outstanding > 0) { + assert(sgroup->cb_fn == NULL); + sgroup->cb_fn = cb_fn; + assert(sgroup->cb_arg == NULL); + sgroup->cb_arg = cb_arg; + return; + } + } + } else { + if (ns_info != NULL && ns_info->io_outstanding > 0) { + assert(sgroup->cb_fn == NULL); + sgroup->cb_fn = cb_fn; + assert(sgroup->cb_arg == NULL); + sgroup->cb_arg = cb_arg; + return; + } } assert(sgroup->mgmt_io_outstanding == 0);