iscsi/rpc: Adjust format of bdev_name_id_pair between dump and construct

JSON format of bdev_name_id_pair is different between
construct_target_node() and get_target_nodes().

construct_target_nodes() uses the following format:

    "lun_ids": [
      1
    ],
    "bdev_names": [
      "Malloc0"
    ]

get_target_nodes() uses the following format:

    "luns": [
      {
        "lun_id": 0,
        "bdev_name": "lvs_1/lbd_1"
      },
    ]

The second format is better than the first format. Hence unify to
the second format.

Change-Id: If097e41ada0f2fe3754691cee0a0774db97c4ebb
Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-on: https://review.gerrithub.io/399993
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Shuhei Matsumoto 2018-02-19 08:41:48 +09:00 committed by Jim Harris
parent 3b4e5493d9
commit f35f395b82
2 changed files with 47 additions and 44 deletions

View File

@ -484,54 +484,56 @@ decode_rpc_pg_ig_maps(const struct spdk_json_val *val, void *out)
#define RPC_CONSTRUCT_TARGET_NODE_MAX_LUN 64 #define RPC_CONSTRUCT_TARGET_NODE_MAX_LUN 64
struct rpc_bdev_names { struct rpc_lun {
size_t num_names; char *bdev_name;
char *names[RPC_CONSTRUCT_TARGET_NODE_MAX_LUN]; int32_t lun_id;
};
static const struct spdk_json_object_decoder rpc_lun_decoders[] = {
{"bdev_name", offsetof(struct rpc_lun, bdev_name), spdk_json_decode_string},
{"lun_id", offsetof(struct rpc_lun, lun_id), spdk_json_decode_int32},
}; };
static int static int
decode_rpc_bdev_names(const struct spdk_json_val *val, void *out) decode_rpc_lun(const struct spdk_json_val *val, void *out)
{ {
struct rpc_bdev_names *bdev_names = out; struct rpc_lun *lun = out;
return spdk_json_decode_array(val, spdk_json_decode_string, bdev_names->names, return spdk_json_decode_object(val, rpc_lun_decoders,
SPDK_COUNTOF(rpc_lun_decoders), lun);
}
struct rpc_luns {
size_t num_luns;
struct rpc_lun luns[RPC_CONSTRUCT_TARGET_NODE_MAX_LUN];
};
static int
decode_rpc_luns(const struct spdk_json_val *val, void *out)
{
struct rpc_luns *luns = out;
return spdk_json_decode_array(val, decode_rpc_lun, luns->luns,
RPC_CONSTRUCT_TARGET_NODE_MAX_LUN, RPC_CONSTRUCT_TARGET_NODE_MAX_LUN,
&bdev_names->num_names, sizeof(char *)); &luns->num_luns, sizeof(struct rpc_lun));
} }
static void static void
free_rpc_bdev_names(struct rpc_bdev_names *r) free_rpc_luns(struct rpc_luns *p)
{ {
size_t i; size_t i;
for (i = 0; i < r->num_names; i++) { for (i = 0; i < p->num_luns; i++) {
free(r->names[i]); free(p->luns[i].bdev_name);
} }
} }
struct rpc_lun_ids {
size_t num_ids;
int32_t ids[RPC_CONSTRUCT_TARGET_NODE_MAX_LUN];
};
static int
decode_rpc_lun_ids(const struct spdk_json_val *val, void *out)
{
struct rpc_lun_ids *lun_ids = out;
return spdk_json_decode_array(val, spdk_json_decode_int32, lun_ids->ids,
RPC_CONSTRUCT_TARGET_NODE_MAX_LUN,
&lun_ids->num_ids, sizeof(int32_t));
}
struct rpc_target_node { struct rpc_target_node {
char *name; char *name;
char *alias_name; char *alias_name;
struct rpc_pg_ig_maps pg_ig_maps; struct rpc_pg_ig_maps pg_ig_maps;
struct rpc_luns luns;
struct rpc_bdev_names bdev_names;
struct rpc_lun_ids lun_ids;
int32_t queue_depth; int32_t queue_depth;
int32_t chap_disabled; int32_t chap_disabled;
@ -548,15 +550,14 @@ free_rpc_target_node(struct rpc_target_node *req)
{ {
free(req->name); free(req->name);
free(req->alias_name); free(req->alias_name);
free_rpc_bdev_names(&req->bdev_names); free_rpc_luns(&req->luns);
} }
static const struct spdk_json_object_decoder rpc_target_node_decoders[] = { static const struct spdk_json_object_decoder rpc_target_node_decoders[] = {
{"name", offsetof(struct rpc_target_node, name), spdk_json_decode_string}, {"name", offsetof(struct rpc_target_node, name), spdk_json_decode_string},
{"alias_name", offsetof(struct rpc_target_node, alias_name), spdk_json_decode_string}, {"alias_name", offsetof(struct rpc_target_node, alias_name), spdk_json_decode_string},
{"pg_ig_maps", offsetof(struct rpc_target_node, pg_ig_maps), decode_rpc_pg_ig_maps}, {"pg_ig_maps", offsetof(struct rpc_target_node, pg_ig_maps), decode_rpc_pg_ig_maps},
{"bdev_names", offsetof(struct rpc_target_node, bdev_names), decode_rpc_bdev_names}, {"luns", offsetof(struct rpc_target_node, luns), decode_rpc_luns},
{"lun_ids", offsetof(struct rpc_target_node, lun_ids), decode_rpc_lun_ids},
{"queue_depth", offsetof(struct rpc_target_node, queue_depth), spdk_json_decode_int32}, {"queue_depth", offsetof(struct rpc_target_node, queue_depth), spdk_json_decode_int32},
{"chap_disabled", offsetof(struct rpc_target_node, chap_disabled), spdk_json_decode_int32}, {"chap_disabled", offsetof(struct rpc_target_node, chap_disabled), spdk_json_decode_int32},
{"chap_required", offsetof(struct rpc_target_node, chap_required), spdk_json_decode_int32}, {"chap_required", offsetof(struct rpc_target_node, chap_required), spdk_json_decode_int32},
@ -574,6 +575,8 @@ spdk_rpc_construct_target_node(struct spdk_jsonrpc_request *request,
struct spdk_json_write_ctx *w; struct spdk_json_write_ctx *w;
struct spdk_iscsi_tgt_node *target; struct spdk_iscsi_tgt_node *target;
int32_t pg_tags[MAX_TARGET_MAP] = {0}, ig_tags[MAX_TARGET_MAP] = {0}; int32_t pg_tags[MAX_TARGET_MAP] = {0}, ig_tags[MAX_TARGET_MAP] = {0};
char *bdev_names[RPC_CONSTRUCT_TARGET_NODE_MAX_LUN] = {0};
int32_t lun_ids[RPC_CONSTRUCT_TARGET_NODE_MAX_LUN] = {0};
size_t i; size_t i;
req.header_digest = 0; req.header_digest = 0;
@ -586,16 +589,16 @@ spdk_rpc_construct_target_node(struct spdk_jsonrpc_request *request,
goto invalid; goto invalid;
} }
if (req.bdev_names.num_names != req.lun_ids.num_ids) {
SPDK_ERRLOG("bdev_names/lun_ids count mismatch\n");
goto invalid;
}
for (i = 0; i < req.pg_ig_maps.num_maps; i++) { for (i = 0; i < req.pg_ig_maps.num_maps; i++) {
pg_tags[i] = req.pg_ig_maps.maps[i].pg_tag; pg_tags[i] = req.pg_ig_maps.maps[i].pg_tag;
ig_tags[i] = req.pg_ig_maps.maps[i].ig_tag; ig_tags[i] = req.pg_ig_maps.maps[i].ig_tag;
} }
for (i = 0; i < req.luns.num_luns; i++) {
bdev_names[i] = req.luns.luns[i].bdev_name;
lun_ids[i] = req.luns.luns[i].lun_id;
}
/* /*
* Use default parameters in a few places: * Use default parameters in a few places:
* index = -1 : automatically pick an index for the new target node * index = -1 : automatically pick an index for the new target node
@ -606,9 +609,9 @@ spdk_rpc_construct_target_node(struct spdk_jsonrpc_request *request,
pg_tags, pg_tags,
ig_tags, ig_tags,
req.pg_ig_maps.num_maps, req.pg_ig_maps.num_maps,
(const char **)req.bdev_names.names, (const char **)bdev_names,
req.lun_ids.ids, lun_ids,
req.bdev_names.num_names, req.luns.num_luns,
req.queue_depth, req.queue_depth,
req.chap_disabled, req.chap_disabled,
req.chap_required, req.chap_required,

View File

@ -18,9 +18,10 @@ def get_target_nodes(args):
def construct_target_node(args): def construct_target_node(args):
bdev_name_id_dict = dict(u.split(":") for u in args.bdev_name_id_pairs.strip().split(" ")) luns = []
bdev_names = bdev_name_id_dict.keys() for u in args.bdev_name_id_pairs.strip().split(" "):
lun_ids = list(map(int, bdev_name_id_dict.values())) bdev_name, lun_id = u.split(":")
luns.append({"bdev_name": bdev_name, "lun_id": int(lun_id)})
pg_ig_maps = [] pg_ig_maps = []
for u in args.pg_ig_mappings.strip().split(" "): for u in args.pg_ig_mappings.strip().split(" "):
@ -31,8 +32,7 @@ def construct_target_node(args):
'name': args.name, 'name': args.name,
'alias_name': args.alias_name, 'alias_name': args.alias_name,
'pg_ig_maps': pg_ig_maps, 'pg_ig_maps': pg_ig_maps,
'bdev_names': bdev_names, 'luns': luns,
'lun_ids': lun_ids,
'queue_depth': args.queue_depth, 'queue_depth': args.queue_depth,
'chap_disabled': args.chap_disabled, 'chap_disabled': args.chap_disabled,
'chap_required': args.chap_required, 'chap_required': args.chap_required,