From 6680fdf81869ea31d6c6b33288dc4984a4733300 Mon Sep 17 00:00:00 2001 From: Krzysztof Smolinski Date: Fri, 14 Oct 2022 15:10:53 +0200 Subject: [PATCH] module/raid: bdev_raid_remove_base_bdev rpc Signed-off-by: Krzysztof Smolinski Change-Id: I4829f6cd0c10bfcd2c6893cf9412fc974c4b338c --- doc/jsonrpc.md | 35 +++++++++++++++++++++ module/bdev/raid/bdev_raid.c | 2 +- module/bdev/raid/bdev_raid.h | 1 + module/bdev/raid/bdev_raid_rpc.c | 53 ++++++++++++++++++++++++++++++++ python/spdk/rpc/bdev.py | 13 ++++++++ scripts/rpc.py | 7 +++++ 6 files changed, 110 insertions(+), 1 deletion(-) diff --git a/doc/jsonrpc.md b/doc/jsonrpc.md index 309e68ea1..633a935cc 100644 --- a/doc/jsonrpc.md +++ b/doc/jsonrpc.md @@ -10145,6 +10145,41 @@ Example response: } ~~~ +### bdev_raid_remove_base_bdev {#rpc_bdev_raid_remove_base_bdev} + +Remove base bdev from existing raid bdev. + +#### Parameters + +Name | Optional | Type | Description +----------------------- | -------- | ----------- | ----------- +name | Required | string | Base bdev name in RAID + +#### Example + +Example request: + +~~~json +{ + "jsonrpc": "2.0", + "method": "bdev_raid_remove_base_bdev", + "id": 1, + "params": { + "name": "Raid0" + } +} +~~~ + +Example response: + +~~~json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +~~~ + ## SPLIT ### bdev_split_create {#rpc_bdev_split_create} diff --git a/module/bdev/raid/bdev_raid.c b/module/bdev/raid/bdev_raid.c index c606ff7f7..7848cb6e7 100644 --- a/module/bdev/raid/bdev_raid.c +++ b/module/bdev/raid/bdev_raid.c @@ -1479,7 +1479,7 @@ raid_bdev_remove_base_bdev_on_suspended(struct raid_bdev *raid_bdev, void *ctx) * 0 - success * non zero - failure */ -static int +int raid_bdev_remove_base_bdev(struct spdk_bdev *base_bdev) { struct raid_bdev *raid_bdev; diff --git a/module/bdev/raid/bdev_raid.h b/module/bdev/raid/bdev_raid.h index 75aac9242..abe41c9ff 100644 --- a/module/bdev/raid/bdev_raid.h +++ b/module/bdev/raid/bdev_raid.h @@ -215,6 +215,7 @@ const char *raid_bdev_level_to_str(enum raid_level level); enum raid_bdev_state raid_bdev_str_to_state(const char *str); const char *raid_bdev_state_to_str(enum raid_bdev_state state); void raid_bdev_write_info_json(struct raid_bdev *raid_bdev, struct spdk_json_write_ctx *w); +int raid_bdev_remove_base_bdev(struct spdk_bdev *base_bdev); /* * RAID module descriptor diff --git a/module/bdev/raid/bdev_raid_rpc.c b/module/bdev/raid/bdev_raid_rpc.c index 1c5722572..c71089fbc 100644 --- a/module/bdev/raid/bdev_raid_rpc.c +++ b/module/bdev/raid/bdev_raid_rpc.c @@ -385,3 +385,56 @@ cleanup: free(ctx); } SPDK_RPC_REGISTER("bdev_raid_delete", rpc_bdev_raid_delete, SPDK_RPC_RUNTIME) + +/* + * Decoder object for RPC bdev_raid_remove_base_bdev + */ +static const struct spdk_json_object_decoder rpc_bdev_raid_remove_base_bdev_decoders[] = { + {"name", 0, spdk_json_decode_string}, +}; + +/* + * brief: + * bdev_raid_remove_base_bdev function is the RPC for removing base bdev from a raid bdev. + * It takes base bdev name as input. + * params: + * request - pointer to json rpc request + * params - pointer to request parameters + * returns: + * none + */ +static void +rpc_bdev_raid_remove_base_bdev(struct spdk_jsonrpc_request *request, + const struct spdk_json_val *params) +{ + struct spdk_bdev *bdev; + char *name = NULL; + int rc; + + if (spdk_json_decode_object(params, rpc_bdev_raid_remove_base_bdev_decoders, + SPDK_COUNTOF(rpc_bdev_raid_remove_base_bdev_decoders), + &name)) { + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR, + "spdk_json_decode_object failed"); + return; + } + + bdev = spdk_bdev_get_by_name(name); + if (bdev == NULL) { + spdk_jsonrpc_send_error_response_fmt(request, -ENODEV, "base bdev %s is not found in config", name); + goto cleanup; + } + + rc = raid_bdev_remove_base_bdev(bdev); + if (rc != 0) { + spdk_jsonrpc_send_error_response_fmt(request, rc, "Failed to remove base bdev %s from raid bdev", + name); + goto cleanup; + } + + spdk_jsonrpc_send_bool_response(request, true); + +cleanup: + free(name); +} +SPDK_RPC_REGISTER("bdev_raid_remove_base_bdev", rpc_bdev_raid_remove_base_bdev, SPDK_RPC_RUNTIME) diff --git a/python/spdk/rpc/bdev.py b/python/spdk/rpc/bdev.py index 7c3f95cc7..c7811105b 100644 --- a/python/spdk/rpc/bdev.py +++ b/python/spdk/rpc/bdev.py @@ -444,6 +444,19 @@ def bdev_raid_delete(client, name): return client.call('bdev_raid_delete', params) +def bdev_raid_remove_base_bdev(client, name): + """Remove base bdev from existing raid bdev + + Args: + name: base bdev name + + Returns: + None + """ + params = {'name': name} + return client.call('bdev_raid_remove_base_bdev', params) + + def bdev_aio_create(client, filename, name, block_size=None, readonly=False): """Construct a Linux AIO block device. diff --git a/scripts/rpc.py b/scripts/rpc.py index c6686e9d4..80b4a405a 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -2111,6 +2111,13 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse p.add_argument('name', help='raid bdev name') p.set_defaults(func=bdev_raid_delete) + def bdev_raid_remove_base_bdev(args): + rpc.bdev.bdev_raid_remove_base_bdev(args.client, + name=args.name) + p = subparsers.add_parser('bdev_raid_remove_base_bdev', help='Remove base bdev from existing raid bdev') + p.add_argument('name', help='base bdev name') + p.set_defaults(func=bdev_raid_remove_base_bdev) + # split def bdev_split_create(args): print_array(rpc.bdev.bdev_split_create(args.client,