Commit 761056f8 authored by Ben Walker's avatar Ben Walker Committed by Tomasz Zawadzki
Browse files

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: default avatarBen 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: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarPaul Luse <paul.e.luse@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
parent 862bdb53
Loading
Loading
Loading
Loading
+32 −10
Original line number Diff line number Diff line
@@ -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,11 +1537,18 @@ nvmf_poll_group_pause_subsystem(struct spdk_nvmf_poll_group *group,
	}
	sgroup->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) {
		assert(sgroup->cb_fn == NULL);
@@ -1550,6 +1558,19 @@ nvmf_poll_group_pause_subsystem(struct spdk_nvmf_poll_group *group,
		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;
@@ -1557,6 +1578,7 @@ nvmf_poll_group_pause_subsystem(struct spdk_nvmf_poll_group *group,
			sgroup->cb_arg = cb_arg;
			return;
		}
	}

	assert(sgroup->mgmt_io_outstanding == 0);
	sgroup->state = SPDK_NVMF_SUBSYSTEM_PAUSED;