diff --git a/lib/nvmf/nvmf_rpc.c b/lib/nvmf/nvmf_rpc.c index 2574a3aa5..46148c453 100644 --- a/lib/nvmf/nvmf_rpc.c +++ b/lib/nvmf/nvmf_rpc.c @@ -185,10 +185,12 @@ decode_ns_uuid(const struct spdk_json_val *val, void *out) } struct rpc_get_subsystem { + char *nqn; char *tgt_name; }; static const struct spdk_json_object_decoder rpc_get_subsystem_decoders[] = { + {"nqn", offsetof(struct rpc_get_subsystem, nqn), spdk_json_decode_string, true}, {"tgt_name", offsetof(struct rpc_get_subsystem, tgt_name), spdk_json_decode_string, true}, }; @@ -308,7 +310,7 @@ rpc_nvmf_get_subsystems(struct spdk_jsonrpc_request *request, { struct rpc_get_subsystem req = { 0 }; struct spdk_json_write_ctx *w; - struct spdk_nvmf_subsystem *subsystem; + struct spdk_nvmf_subsystem *subsystem = NULL; struct spdk_nvmf_tgt *tgt; if (params) { @@ -326,19 +328,37 @@ rpc_nvmf_get_subsystems(struct spdk_jsonrpc_request *request, spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Unable to find a target."); free(req.tgt_name); + free(req.nqn); return; } + if (req.nqn) { + subsystem = spdk_nvmf_tgt_find_subsystem(tgt, req.nqn); + if (!subsystem) { + SPDK_ERRLOG("subsystem '%s' does not exist\n", req.nqn); + spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV)); + free(req.tgt_name); + free(req.nqn); + return; + } + } + w = spdk_jsonrpc_begin_result(request); spdk_json_write_array_begin(w); - subsystem = spdk_nvmf_subsystem_get_first(tgt); - while (subsystem) { + + if (subsystem) { dump_nvmf_subsystem(w, subsystem); - subsystem = spdk_nvmf_subsystem_get_next(subsystem); + } else { + for (subsystem = spdk_nvmf_subsystem_get_first(tgt); subsystem != NULL; + subsystem = spdk_nvmf_subsystem_get_next(subsystem)) { + dump_nvmf_subsystem(w, subsystem); + } } + spdk_json_write_array_end(w); spdk_jsonrpc_end_result(request, w); free(req.tgt_name); + free(req.nqn); } SPDK_RPC_REGISTER("nvmf_get_subsystems", rpc_nvmf_get_subsystems, SPDK_RPC_RUNTIME) SPDK_RPC_REGISTER_ALIAS_DEPRECATED(nvmf_get_subsystems, get_nvmf_subsystems) diff --git a/scripts/rpc.py b/scripts/rpc.py index 1fe05d7d1..f8ad88a2c 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -1948,10 +1948,11 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse p.set_defaults(func=nvmf_get_transports) def nvmf_get_subsystems(args): - print_dict(rpc.nvmf.nvmf_get_subsystems(args.client, tgt_name=args.tgt_name)) + print_dict(rpc.nvmf.nvmf_get_subsystems(args.client, nqn=args.nqn, tgt_name=args.tgt_name)) p = subparsers.add_parser('nvmf_get_subsystems', aliases=['get_nvmf_subsystems'], - help='Display nvmf subsystems') + help='Display nvmf subsystems or required subsystem') + p.add_argument('nqn', help='Subsystem NQN (optional)', nargs="?", default=None) p.add_argument('-t', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str) p.set_defaults(func=nvmf_get_subsystems) diff --git a/scripts/rpc/nvmf.py b/scripts/rpc/nvmf.py index a8bbf603c..2e6e27a03 100644 --- a/scripts/rpc/nvmf.py +++ b/scripts/rpc/nvmf.py @@ -153,9 +153,10 @@ def nvmf_get_transports(client, tgt_name=None): @deprecated_alias('get_nvmf_subsystems') -def nvmf_get_subsystems(client, tgt_name=None): +def nvmf_get_subsystems(client, nqn=None, tgt_name=None): """Get list of NVMe-oF subsystems. Args: + nqn: Subsystem NQN (optional; if omitted, query all subsystems). tgt_name: name of the parent NVMe-oF target (optional). Returns: @@ -165,9 +166,10 @@ def nvmf_get_subsystems(client, tgt_name=None): params = {} if tgt_name: - params = { - 'tgt_name': tgt_name, - } + params['tgt_name'] = tgt_name + + if nqn: + params['nqn'] = nqn return client.call('nvmf_get_subsystems', params)