From 21aade7a9c874a1c7b7e8b2ab918303f98f21dde Mon Sep 17 00:00:00 2001 From: GangCao Date: Tue, 22 Aug 2017 21:52:15 -0400 Subject: [PATCH] bdev: update the get_bdevs RPC method with optional parameter Change-Id: I2a1c148deed1d6378eaf848d33b0f28cfeb1b65a Signed-off-by: GangCao Reviewed-on: https://review.gerrithub.io/375274 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Ben Walker --- lib/bdev/rpc/bdev_rpc.c | 146 +++++++++++++++++++++++++++------------- scripts/rpc.py | 11 ++- 2 files changed, 106 insertions(+), 51 deletions(-) diff --git a/lib/bdev/rpc/bdev_rpc.c b/lib/bdev/rpc/bdev_rpc.c index 9dc71f45a..8ff9b8eff 100644 --- a/lib/bdev/rpc/bdev_rpc.c +++ b/lib/bdev/rpc/bdev_rpc.c @@ -36,17 +36,97 @@ #include "spdk_internal/bdev.h" +static void +spdk_rpc_dump_bdev_info(struct spdk_json_write_ctx *w, + struct spdk_bdev *bdev) +{ + spdk_json_write_object_begin(w); + + spdk_json_write_name(w, "name"); + spdk_json_write_string(w, spdk_bdev_get_name(bdev)); + + spdk_json_write_name(w, "product_name"); + spdk_json_write_string(w, spdk_bdev_get_product_name(bdev)); + + spdk_json_write_name(w, "block_size"); + spdk_json_write_uint32(w, spdk_bdev_get_block_size(bdev)); + + spdk_json_write_name(w, "num_blocks"); + spdk_json_write_uint64(w, spdk_bdev_get_num_blocks(bdev)); + + spdk_json_write_name(w, "bdev_opened_for_write"); + spdk_json_write_bool(w, bdev->bdev_opened_for_write); + + spdk_json_write_name(w, "supported_io_types"); + spdk_json_write_object_begin(w); + spdk_json_write_name(w, "read"); + spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_READ)); + spdk_json_write_name(w, "write"); + spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_WRITE)); + spdk_json_write_name(w, "unmap"); + spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_UNMAP)); + spdk_json_write_name(w, "write_zeroes"); + spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_WRITE_ZEROES)); + spdk_json_write_name(w, "flush"); + spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_FLUSH)); + spdk_json_write_name(w, "reset"); + spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_RESET)); + spdk_json_write_name(w, "nvme_admin"); + spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_NVME_ADMIN)); + spdk_json_write_name(w, "nvme_io"); + spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_NVME_IO)); + spdk_json_write_object_end(w); + + spdk_json_write_name(w, "driver_specific"); + spdk_json_write_object_begin(w); + spdk_bdev_dump_config_json(bdev, w); + spdk_json_write_object_end(w); + + spdk_json_write_object_end(w); +} + +struct rpc_get_bdevs { + char *name; +}; + +static void +free_rpc_get_bdevs(struct rpc_get_bdevs *r) +{ + free(r->name); +} + +static const struct spdk_json_object_decoder rpc_get_bdevs_decoders[] = { + {"name", offsetof(struct rpc_get_bdevs, name), spdk_json_decode_string}, +}; + static void spdk_rpc_get_bdevs(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { + struct rpc_get_bdevs req = {}; struct spdk_json_write_ctx *w; - struct spdk_bdev *bdev; + struct spdk_bdev *bdev = NULL; if (params != NULL) { - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, - "get_bdevs requires no parameters"); - return; + if (spdk_json_decode_object(params, rpc_get_bdevs_decoders, + sizeof(rpc_get_bdevs_decoders) / sizeof(*rpc_get_bdevs_decoders), + &req)) { + SPDK_ERRLOG("spdk_json_decode_object failed\n"); + goto invalid; + } else { + if (req.name == NULL) { + SPDK_ERRLOG("missing name param\n"); + goto invalid; + } + + bdev = spdk_bdev_get_by_name(req.name); + if (bdev == NULL) { + SPDK_ERRLOG("bdev '%s' does not exist\n", req.name); + goto invalid; + } + + free_rpc_get_bdevs(&req); + } } w = spdk_jsonrpc_begin_result(request); @@ -56,54 +136,24 @@ spdk_rpc_get_bdevs(struct spdk_jsonrpc_request *request, spdk_json_write_array_begin(w); - for (bdev = spdk_bdev_first(); bdev != NULL; bdev = spdk_bdev_next(bdev)) { - spdk_json_write_object_begin(w); - - spdk_json_write_name(w, "name"); - spdk_json_write_string(w, spdk_bdev_get_name(bdev)); - - spdk_json_write_name(w, "product_name"); - spdk_json_write_string(w, spdk_bdev_get_product_name(bdev)); - - spdk_json_write_name(w, "block_size"); - spdk_json_write_uint32(w, spdk_bdev_get_block_size(bdev)); - - spdk_json_write_name(w, "num_blocks"); - spdk_json_write_uint64(w, spdk_bdev_get_num_blocks(bdev)); - - spdk_json_write_name(w, "bdev_opened_for_write"); - spdk_json_write_bool(w, bdev->bdev_opened_for_write); - - spdk_json_write_name(w, "supported_io_types"); - spdk_json_write_object_begin(w); - spdk_json_write_name(w, "read"); - spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_READ)); - spdk_json_write_name(w, "write"); - spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_WRITE)); - spdk_json_write_name(w, "unmap"); - spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_UNMAP)); - spdk_json_write_name(w, "write_zeroes"); - spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_WRITE_ZEROES)); - spdk_json_write_name(w, "flush"); - spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_FLUSH)); - spdk_json_write_name(w, "reset"); - spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_RESET)); - spdk_json_write_name(w, "nvme_admin"); - spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_NVME_ADMIN)); - spdk_json_write_name(w, "nvme_io"); - spdk_json_write_bool(w, spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_NVME_IO)); - spdk_json_write_object_end(w); - - spdk_json_write_name(w, "driver_specific"); - spdk_json_write_object_begin(w); - spdk_bdev_dump_config_json(bdev, w); - spdk_json_write_object_end(w); - - spdk_json_write_object_end(w); + if (bdev != NULL) { + spdk_rpc_dump_bdev_info(w, bdev); + } else { + for (bdev = spdk_bdev_first(); bdev != NULL; bdev = spdk_bdev_next(bdev)) { + spdk_rpc_dump_bdev_info(w, bdev); + } } + 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_bdevs(&req); } SPDK_RPC_REGISTER("get_bdevs", spdk_rpc_get_bdevs) diff --git a/scripts/rpc.py b/scripts/rpc.py index 7848776f2..b93d23a36 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -377,10 +377,15 @@ def get_interfaces(args): p = subparsers.add_parser('get_interfaces', help='Display current interface list') p.set_defaults(func=get_interfaces) -def get_bdevs(args): - print_dict(jsonrpc_call('get_bdevs')) -p = subparsers.add_parser('get_bdevs', help='Display current blockdev list') +def get_bdevs(args): + params = {} + if args.name: + params['name'] = args.name + print_dict(jsonrpc_call('get_bdevs', params)) + +p = subparsers.add_parser('get_bdevs', help='Display current blockdev list or required blockdev') +p.add_argument('-b', '--name', help="Name of the Blockdev. Example: Nvme0n1", required=False) p.set_defaults(func=get_bdevs)