Commit bc06e05a authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Jim Harris
Browse files

nvmf: Add spdk_nvmf_subsystem_set_ns_ana_group()



Add a new public API spdk_nvmf_subsystem_set_ns_ana_group() to change
ANA group ID of an active namespace of a subsystem.

Another approach is make the API generic one like
spdk_nvmf_subsystem_change_ns() with spdk_nvmf_ns_opts as a parameter.

However, it will not be easy because it requires spdk_nvmf_ns_opts
to be initialized by spdk_nvmf_ns_get_opts() and change only difference
of spdk_nvmf_ns_opts of the namespace.

Signed-off-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Suggested-by: default avatarLeonid Chernin <leonidc@il.ibm.com>
Tested-by: default avatarLeonid Chernin <leonidc@il.ibm.com>
Change-Id: Ib58731950c184bda4b9bb395d05d8c7e95c54897
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/24059


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent eb35d8c9
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -965,6 +965,20 @@ int spdk_nvmf_subsystem_get_ana_state(struct spdk_nvmf_subsystem *subsystem,
				      uint32_t anagrpid,
				      enum spdk_nvme_ana_state *ana_state);

/**
 * Change ANA group ID of a namespace of a subsystem.
 *
 * May only be performed on subsystems in the INACTIVE or PAUSED state.
 *
 * \param subsystem Subsystem the namespace belongs to.
 * \param nsid Namespace ID to change.
 * \param anagrpid A new ANA group ID to set.
 *
 * \return 0 on success, negated errno on failure.
 */
int spdk_nvmf_subsystem_set_ns_ana_group(struct spdk_nvmf_subsystem *subsystem,
		uint32_t nsid, uint32_t anagrpid);

/**
 * Sets the controller ID range for a subsystem.
 *
+11 −0
Original line number Diff line number Diff line
@@ -1546,6 +1546,16 @@ poll_group_update_subsystem(struct spdk_nvmf_poll_group *group,
				      ns_info->num_blocks,
				      spdk_bdev_get_num_blocks(ns->bdev));
			ns_changed = true;
		} else if (ns_info->anagrpid != ns->anagrpid) {
			/* Namespace is still there but ANA group ID has changed */
			SPDK_DEBUGLOG(nvmf, "ANA group ID changed: subsystem_id %u,"
				      "nsid %u, pg %p, old %u, new %u\n",
				      subsystem->id,
				      ns->nsid,
				      group,
				      ns_info->anagrpid,
				      ns->anagrpid);
			ns_changed = true;
		}

		if (ns == NULL) {
@@ -1553,6 +1563,7 @@ poll_group_update_subsystem(struct spdk_nvmf_poll_group *group,
		} else {
			ns_info->uuid = *spdk_bdev_get_uuid(ns->bdev);
			ns_info->num_blocks = spdk_bdev_get_num_blocks(ns->bdev);
			ns_info->anagrpid = ns->anagrpid;
			ns_info->crkey = ns->crkey;
			ns_info->rtype = ns->rtype;
			if (ns->holder) {
+1 −0
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ struct spdk_nvmf_subsystem_pg_ns_info {
	/* Host ID for the registrants with the namespace */
	struct spdk_uuid		reg_hostid[SPDK_NVMF_MAX_NUM_REGISTRANTS];
	uint64_t			num_blocks;
	uint32_t			anagrpid;

	/* I/O outstanding to this namespace */
	uint64_t			io_outstanding;
+1 −0
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@
	spdk_nvmf_subsystem_get_ana_reporting;
	spdk_nvmf_subsystem_set_ana_state;
	spdk_nvmf_subsystem_get_ana_state;
	spdk_nvmf_subsystem_set_ns_ana_group;
	spdk_nvmf_subsystem_is_discovery;
	spdk_nvmf_subsystem_set_cntlid_range;
	spdk_nvmf_set_custom_ns_reservation_ops;
+41 −0
Original line number Diff line number Diff line
@@ -2307,6 +2307,47 @@ err:
	return 0;
}

int
spdk_nvmf_subsystem_set_ns_ana_group(struct spdk_nvmf_subsystem *subsystem,
				     uint32_t nsid, uint32_t anagrpid)
{
	struct spdk_nvmf_ns *ns;

	if (anagrpid > subsystem->max_nsid) {
		SPDK_ERRLOG("ANAGRPID greater than maximum NSID not allowed\n");
		return -1;
	}

	if (anagrpid == 0) {
		SPDK_ERRLOG("Zero is not allowed to ANAGRPID\n");
		return -1;
	}

	if (nsid == 0 || nsid > subsystem->max_nsid) {
		return -1;
	}

	ns = subsystem->ns[nsid - 1];
	if (!ns) {
		return -1;
	}

	assert(ns->anagrpid - 1 < subsystem->max_nsid);

	assert(subsystem->ana_group[ns->anagrpid - 1] > 0);

	subsystem->ana_group[ns->anagrpid - 1]--;

	subsystem->ana_group[anagrpid - 1]++;

	ns->anagrpid = anagrpid;
	ns->opts.anagrpid = anagrpid;

	nvmf_subsystem_ns_changed(subsystem, nsid);

	return 0;
}

static uint32_t
nvmf_subsystem_get_next_allocated_nsid(struct spdk_nvmf_subsystem *subsystem,
				       uint32_t prev_nsid)