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 <benjamin.walker@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13394
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Paul Luse <paul.e.luse@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
Ben Walker 2022-06-21 14:08:00 -07:00 committed by Tomasz Zawadzki
parent 862bdb53b9
commit 761056f8d2

View File

@ -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);