Commit 6d716c47 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Tomasz Zawadzki
Browse files

nvmf: Update only ANA state of specified ANA group by RPC



Signed-off-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: Iccf3f393d1f027d04a57324762e6aabaf9d5a0df
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9117


Community-CI: Mellanox Build Bot
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarDong Yi <dongx.yi@intel.com>
parent 694fa34d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -13,6 +13,8 @@ added in the `spdk_nvmf_ns_opts` structure.

An new parameter `anagrpid` was added to the RPC `nvmf_subsystem_add_ns`.

An new parameter `anagrpid` was added to the RPC `nvmf_subsystem_listener_set_ana_state`.

### bdev

New API `spdk_bdev_get_memory_domains` has been added, it allows to get SPDK memory domains used by bdev.
+3 −1
Original line number Diff line number Diff line
@@ -6278,7 +6278,8 @@ Example response:

### nvmf_subsystem_listener_set_ana_state  method {#rpc_nvmf_subsystem_listener_set_ana_state}

Set ANA state of a listener for an NVMe-oF subsystem.
Set ANA state of a listener for an NVMe-oF subsystem. Only the ANA state of the specified ANA
group is updated, or ANA states of all ANA groups if ANA group is not specified.

#### Parameters

@@ -6288,6 +6289,7 @@ nqn | Required | string | Subsystem NQN
tgt_name                | Optional | string      | Parent NVMe-oF target name.
listen_address          | Required | object      | @ref rpc_nvmf_listen_address object
ana_state               | Required | string      | ANA state to set ("optimized", "non_optimized", or "inaccessible")
anagrpid                | Optional | number      | ANA group ID

#### Example

+1 −1
Original line number Diff line number Diff line
@@ -391,7 +391,7 @@ struct spdk_nvmf_listener *nvmf_transport_find_listener(
	const struct spdk_nvme_transport_id *trid);
void nvmf_subsystem_set_ana_state(struct spdk_nvmf_subsystem *subsystem,
				  const struct spdk_nvme_transport_id *trid,
				  enum spdk_nvme_ana_state ana_state,
				  enum spdk_nvme_ana_state ana_state, uint32_t anagrpid,
				  spdk_nvmf_tgt_subsystem_listen_done_fn cb_fn, void *cb_arg);
bool nvmf_subsystem_get_ana_reporting(struct spdk_nvmf_subsystem *subsystem);

+3 −1
Original line number Diff line number Diff line
@@ -615,6 +615,7 @@ struct nvmf_rpc_listener_ctx {
	struct rpc_listen_address	address;
	char				*ana_state_str;
	enum spdk_nvme_ana_state	ana_state;
	uint32_t			anagrpid;

	struct spdk_jsonrpc_request	*request;
	struct spdk_nvme_transport_id	trid;
@@ -757,7 +758,7 @@ nvmf_rpc_listen_paused(struct spdk_nvmf_subsystem *subsystem,
						 "Invalid parameters");
		ctx->response_sent = true;
	} else if (ctx->op == NVMF_RPC_LISTEN_SET_ANA_STATE) {
		nvmf_subsystem_set_ana_state(subsystem, &ctx->trid, ctx->ana_state,
		nvmf_subsystem_set_ana_state(subsystem, &ctx->trid, ctx->ana_state, ctx->anagrpid,
					     nvmf_rpc_set_ana_state_done, ctx);
		return;
	} else {
@@ -978,6 +979,7 @@ static const struct spdk_json_object_decoder nvmf_rpc_set_ana_state_decoder[] =
	{"listen_address", offsetof(struct nvmf_rpc_listener_ctx, address), decode_rpc_listen_address},
	{"ana_state", offsetof(struct nvmf_rpc_listener_ctx, ana_state_str), spdk_json_decode_string},
	{"tgt_name", offsetof(struct nvmf_rpc_listener_ctx, tgt_name), spdk_json_decode_string, true},
	{"anagrpid", offsetof(struct nvmf_rpc_listener_ctx, anagrpid), spdk_json_decode_uint32, true},
};

static int
+16 −3
Original line number Diff line number Diff line
@@ -3024,7 +3024,7 @@ subsystem_listener_update_on_pg(struct spdk_io_channel_iter *i)
void
nvmf_subsystem_set_ana_state(struct spdk_nvmf_subsystem *subsystem,
			     const struct spdk_nvme_transport_id *trid,
			     enum spdk_nvme_ana_state ana_state,
			     enum spdk_nvme_ana_state ana_state, uint32_t anagrpid,
			     spdk_nvmf_tgt_subsystem_listen_done_fn cb_fn, void *cb_arg)
{
	struct spdk_nvmf_subsystem_listener *listener;
@@ -3052,6 +3052,12 @@ nvmf_subsystem_set_ana_state(struct spdk_nvmf_subsystem *subsystem,
		return;
	}

	if (anagrpid > subsystem->max_nsid) {
		SPDK_ERRLOG("ANA group ID %" PRIu32 " is more than maximum\n", anagrpid);
		cb_fn(cb_arg, -EINVAL);
		return;
	}

	listener = nvmf_subsystem_find_listener(subsystem, trid);
	if (!listener) {
		SPDK_ERRLOG("Unable to find listener.\n");
@@ -3059,6 +3065,11 @@ nvmf_subsystem_set_ana_state(struct spdk_nvmf_subsystem *subsystem,
		return;
	}

	if (anagrpid != 0 && listener->ana_state[anagrpid - 1] == ana_state) {
		cb_fn(cb_arg, 0);
		return;
	}

	ctx = calloc(1, sizeof(*ctx));
	if (!ctx) {
		SPDK_ERRLOG("Unable to allocate context\n");
@@ -3066,8 +3077,10 @@ nvmf_subsystem_set_ana_state(struct spdk_nvmf_subsystem *subsystem,
		return;
	}

	for (i = 0; i < subsystem->max_nsid; i++) {
		listener->ana_state[i] = ana_state;
	for (i = 1; i <= subsystem->max_nsid; i++) {
		if (anagrpid == 0 || i == anagrpid) {
			listener->ana_state[i - 1] = ana_state;
		}
	}
	listener->ana_state_change_count++;

Loading