From e21aede9468156e9822d0f8ec9c48208e833ee2b Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Mon, 18 Sep 2017 10:49:22 +0200 Subject: [PATCH] lvol: add get_lvol_stores RPC This patch shows UUID and base bdev for logical volume stores when get_lvol_stores() RPC is called. Signed-off-by: Tomasz Zawadzki Change-Id: Idbd0bc6c4a0334e5af8d4a674a203ddb2270f3e4 Reviewed-on: https://review.gerrithub.io/374604 Tested-by: SPDK Automated Test System Reviewed-by: Maciej Szwed Reviewed-by: Daniel Verkamp --- include/spdk_internal/lvolstore.h | 6 +++++ lib/bdev/lvol/vbdev_lvol.c | 16 ++++++------ lib/bdev/lvol/vbdev_lvol_rpc.c | 43 ++++++++++++++++++++++++++++++- scripts/rpc.py | 7 +++++ 4 files changed, 63 insertions(+), 9 deletions(-) diff --git a/include/spdk_internal/lvolstore.h b/include/spdk_internal/lvolstore.h index 1ab53f16d..70f04d0d2 100644 --- a/include/spdk_internal/lvolstore.h +++ b/include/spdk_internal/lvolstore.h @@ -37,6 +37,9 @@ #include "spdk/lvol.h" #include "spdk_internal/bdev.h" +/* Length of string returned from uuid_unparse() */ +#define UUID_STRING_LEN 37 + struct spdk_lvol_store_req { union { struct { @@ -90,4 +93,7 @@ struct lvol_task { enum spdk_bdev_io_status status; }; +struct lvol_store_bdev *vbdev_lvol_store_first(void); +struct lvol_store_bdev *vbdev_lvol_store_next(struct lvol_store_bdev *prev); + #endif /* SPDK_INTERNAL_LVOLSTORE_H */ diff --git a/lib/bdev/lvol/vbdev_lvol.c b/lib/bdev/lvol/vbdev_lvol.c index b963d6e95..72058a1d5 100644 --- a/lib/bdev/lvol/vbdev_lvol.c +++ b/lib/bdev/lvol/vbdev_lvol.c @@ -162,8 +162,8 @@ vbdev_lvs_destruct(struct spdk_lvol_store *lvs, spdk_lvs_op_complete cb_fn, } } -static struct lvol_store_bdev * -_vbdev_lvol_store_first(void) +struct lvol_store_bdev * +vbdev_lvol_store_first(void) { struct lvol_store_bdev *lvs_bdev; @@ -175,8 +175,8 @@ _vbdev_lvol_store_first(void) return lvs_bdev; } -static struct lvol_store_bdev * -_vbdev_lvol_store_next(struct lvol_store_bdev *prev) +struct lvol_store_bdev * +vbdev_lvol_store_next(struct lvol_store_bdev *prev) { struct lvol_store_bdev *lvs_bdev; @@ -192,14 +192,14 @@ struct spdk_lvol_store * vbdev_get_lvol_store_by_uuid(uuid_t uuid) { struct spdk_lvol_store *lvs = NULL; - struct lvol_store_bdev *lvs_bdev = _vbdev_lvol_store_first(); + struct lvol_store_bdev *lvs_bdev = vbdev_lvol_store_first(); while (lvs_bdev != NULL) { lvs = lvs_bdev->lvs; if (uuid_compare(lvs->uuid, uuid) == 0) { return lvs; } - lvs_bdev = _vbdev_lvol_store_next(lvs_bdev); + lvs_bdev = vbdev_lvol_store_next(lvs_bdev); } return NULL; } @@ -208,14 +208,14 @@ struct lvol_store_bdev * vbdev_get_lvs_bdev_by_lvs(struct spdk_lvol_store *lvs_orig) { struct spdk_lvol_store *lvs = NULL; - struct lvol_store_bdev *lvs_bdev = _vbdev_lvol_store_first(); + struct lvol_store_bdev *lvs_bdev = vbdev_lvol_store_first(); while (lvs_bdev != NULL) { lvs = lvs_bdev->lvs; if (lvs == lvs_orig) { return lvs_bdev; } - lvs_bdev = _vbdev_lvol_store_next(lvs_bdev); + lvs_bdev = vbdev_lvol_store_next(lvs_bdev); } return NULL; } diff --git a/lib/bdev/lvol/vbdev_lvol_rpc.c b/lib/bdev/lvol/vbdev_lvol_rpc.c index 0c958d42a..7edd3fc27 100644 --- a/lib/bdev/lvol/vbdev_lvol_rpc.c +++ b/lib/bdev/lvol/vbdev_lvol_rpc.c @@ -58,7 +58,7 @@ static void _spdk_rpc_lvol_store_construct_cb(void *cb_arg, struct spdk_lvol_store *lvol_store, int lvserrno) { struct spdk_json_write_ctx *w; - char lvol_store_uuid[37]; + char lvol_store_uuid[UUID_STRING_LEN]; struct spdk_jsonrpc_request *request = cb_arg; char buf[64]; @@ -378,3 +378,44 @@ invalid: } SPDK_RPC_REGISTER("resize_lvol_bdev", spdk_rpc_resize_lvol_bdev) + +static void +spdk_rpc_get_lvol_stores(struct spdk_jsonrpc_request *request, + const struct spdk_json_val *params) +{ + struct spdk_json_write_ctx *w; + struct lvol_store_bdev *lvs_bdev; + char uuid[UUID_STRING_LEN]; + + if (params != NULL) { + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, + "get_lvol_stores requires no parameters"); + return; + } + + w = spdk_jsonrpc_begin_result(request); + if (w == NULL) { + return; + } + + spdk_json_write_array_begin(w); + + for (lvs_bdev = vbdev_lvol_store_first(); lvs_bdev != NULL; + lvs_bdev = vbdev_lvol_store_next(lvs_bdev)) { + spdk_json_write_object_begin(w); + + uuid_unparse(lvs_bdev->lvs->uuid, uuid); + spdk_json_write_name(w, "uuid"); + spdk_json_write_string(w, uuid); + + spdk_json_write_name(w, "base_bdev"); + spdk_json_write_string(w, spdk_bdev_get_name(lvs_bdev->bdev)); + + spdk_json_write_object_end(w); + } + spdk_json_write_array_end(w); + + spdk_jsonrpc_end_result(request, w); +} + +SPDK_RPC_REGISTER("get_lvol_stores", spdk_rpc_get_lvol_stores) diff --git a/scripts/rpc.py b/scripts/rpc.py index c68157aba..b9360b793 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -288,6 +288,13 @@ p.add_argument('lvol_store_uuid', help='lvol store UUID') p.set_defaults(func=destroy_lvol_store) +def get_lvol_stores(args): + print_dict(jsonrpc_call('get_lvol_stores')) + +p = subparsers.add_parser('get_lvol_stores', help='Display current logical volume store list') +p.set_defaults(func=get_lvol_stores) + + def set_trace_flag(args): params = {'flag': args.flag} jsonrpc_call('set_trace_flag', params)