Commit 1170628e authored by Xiaodong Liu's avatar Xiaodong Liu Committed by Jim Harris
Browse files

nbd: add get_nbd_disks RPC



At present, get_nbd_disks RPC can receive info
about SPDK exported nbd devices and corresponding
bdev names.

Change-Id: I04390c7faa6f698a703a599a152cff65fc8be546
Signed-off-by: default avatarXiaodong Liu <xiaodong.liu@intel.com>
Reviewed-on: https://review.gerrithub.io/390610


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent ffc0274a
Loading
Loading
Loading
Loading
+87 −0
Original line number Diff line number Diff line
@@ -162,3 +162,90 @@ invalid:
}

SPDK_RPC_REGISTER("stop_nbd_disk", spdk_rpc_stop_nbd_disk)

static void
spdk_rpc_dump_nbd_info(struct spdk_json_write_ctx *w,
		       struct spdk_nbd_disk *nbd)
{
	spdk_json_write_object_begin(w);

	spdk_json_write_name(w, "nbd_device");
	spdk_json_write_string(w, spdk_nbd_disk_get_nbd_path(nbd));

	spdk_json_write_name(w, "bdev_name");
	spdk_json_write_string(w, spdk_nbd_disk_get_bdev_name(nbd));

	spdk_json_write_object_end(w);
}

struct rpc_get_nbd_disks {
	char *nbd_device;
};

static void
free_rpc_get_nbd_disks(struct rpc_get_nbd_disks *r)
{
	free(r->nbd_device);
}

static const struct spdk_json_object_decoder rpc_get_nbd_disks_decoders[] = {
	{"nbd_device", offsetof(struct rpc_get_nbd_disks, nbd_device), spdk_json_decode_string},
};

static void
spdk_rpc_get_nbd_disks(struct spdk_jsonrpc_request *request,
		       const struct spdk_json_val *params)
{
	struct rpc_get_nbd_disks req = {};
	struct spdk_json_write_ctx *w;
	struct spdk_nbd_disk *nbd = NULL;

	if (params != NULL) {
		if (spdk_json_decode_object(params, rpc_get_nbd_disks_decoders,
					    SPDK_COUNTOF(rpc_get_nbd_disks_decoders),
					    &req)) {
			SPDK_ERRLOG("spdk_json_decode_object failed\n");
			goto invalid;
		} else {
			if (req.nbd_device == NULL) {
				SPDK_ERRLOG("missing nbd_device param\n");
				goto invalid;
			}

			nbd = spdk_nbd_disk_find_by_nbd_path(req.nbd_device);
			if (nbd == NULL) {
				SPDK_ERRLOG("nbd device '%s' does not exist\n", req.nbd_device);
				goto invalid;
			}

			free_rpc_get_nbd_disks(&req);
		}
	}

	w = spdk_jsonrpc_begin_result(request);
	if (w == NULL) {
		return;
	}

	spdk_json_write_array_begin(w);

	if (nbd != NULL) {
		spdk_rpc_dump_nbd_info(w, nbd);
	} else {
		for (nbd = spdk_nbd_disk_first(); nbd != NULL; nbd = spdk_nbd_disk_next(nbd)) {
			spdk_rpc_dump_nbd_info(w, nbd);
		}
	}

	spdk_json_write_array_end(w);

	spdk_jsonrpc_end_result(request, w);

	return;

invalid:
	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");

	free_rpc_get_nbd_disks(&req);
}
SPDK_RPC_REGISTER("get_nbd_disks", spdk_rpc_get_nbd_disks)
+10 −0
Original line number Diff line number Diff line
@@ -624,6 +624,16 @@ p = subparsers.add_parser('stop_nbd_disk', help='Stop a nbd disk')
p.add_argument('nbd_device', help='Nbd device name to be stopped. Example: /dev/nbd0.')
p.set_defaults(func=stop_nbd_disk)

def get_nbd_disks(args):
    params = {}
    if args.nbd_device:
        params['nbd_device'] = args.nbd_device
    print_dict(jsonrpc_call('get_nbd_disks', params))

p = subparsers.add_parser('get_nbd_disks', help='Display full or specified nbd device list')
p.add_argument('-n', '--nbd_device', help="Path of the nbd device. Example: /dev/nbd0", required=False)
p.set_defaults(func=get_nbd_disks)

def get_nvmf_subsystems(args):
    print_dict(jsonrpc_call('get_nvmf_subsystems'))