From 13a05f59ccdd0e37dcaa1a52931decbf43f87d92 Mon Sep 17 00:00:00 2001 From: Pawel Wodkowski Date: Fri, 23 Feb 2018 20:05:47 +0100 Subject: [PATCH] bdev/rbd: add JSON config dump Change-Id: I3122c899f76c1ce1eb422bcf73af87d1b41b9364 Signed-off-by: Pawel Wodkowski Reviewed-on: https://review.gerrithub.io/401223 Reviewed-by: Shuhei Matsumoto Reviewed-by: Daniel Verkamp Tested-by: SPDK Automated Test System --- lib/bdev/rbd/bdev_rbd.c | 30 +++++++++++++++++++++++++++--- lib/bdev/rbd/bdev_rbd.h | 4 ++-- lib/bdev/rbd/bdev_rbd_rpc.c | 5 ++++- scripts/rpc.py | 1 + scripts/rpc/bdev.py | 4 ++++ 5 files changed, 38 insertions(+), 6 deletions(-) diff --git a/lib/bdev/rbd/bdev_rbd.c b/lib/bdev/rbd/bdev_rbd.c index 5927426f6..5407730d2 100644 --- a/lib/bdev/rbd/bdev_rbd.c +++ b/lib/bdev/rbd/bdev_rbd.c @@ -557,16 +557,36 @@ bdev_rbd_dump_info_json(void *ctx, struct spdk_json_write_ctx *w) return 0; } +static void +bdev_rbd_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w) +{ + struct bdev_rbd *rbd = bdev->ctxt; + + spdk_json_write_object_begin(w); + + spdk_json_write_named_string(w, "method", "construct_rbd_bdev"); + + spdk_json_write_named_object_begin(w, "params"); + spdk_json_write_named_string(w, "name", bdev->name); + spdk_json_write_named_string(w, "pool_name", rbd->pool_name); + spdk_json_write_named_string(w, "rbd_name", rbd->rbd_name); + spdk_json_write_object_end(w); + + spdk_json_write_object_end(w); +} + static const struct spdk_bdev_fn_table rbd_fn_table = { .destruct = bdev_rbd_destruct, .submit_request = bdev_rbd_submit_request, .io_type_supported = bdev_rbd_io_type_supported, .get_io_channel = bdev_rbd_get_io_channel, .dump_info_json = bdev_rbd_dump_info_json, + .write_config_json = bdev_rbd_write_config_json, }; struct spdk_bdev * -spdk_bdev_rbd_create(const char *pool_name, const char *rbd_name, uint32_t block_size) +spdk_bdev_rbd_create(const char *name, const char *pool_name, const char *rbd_name, + uint32_t block_size) { struct bdev_rbd *rbd; int ret; @@ -600,7 +620,11 @@ spdk_bdev_rbd_create(const char *pool_name, const char *rbd_name, uint32_t block return NULL; } - rbd->disk.name = spdk_sprintf_alloc("Ceph%d", bdev_rbd_count); + if (name) { + rbd->disk.name = strdup(name); + } else { + rbd->disk.name = spdk_sprintf_alloc("Ceph%d", bdev_rbd_count); + } if (!rbd->disk.name) { bdev_rbd_free(rbd); return NULL; @@ -684,7 +708,7 @@ bdev_rbd_library_init(void) } } - if (spdk_bdev_rbd_create(pool_name, rbd_name, block_size) == NULL) { + if (spdk_bdev_rbd_create(NULL, pool_name, rbd_name, block_size) == NULL) { rc = -1; goto end; } diff --git a/lib/bdev/rbd/bdev_rbd.h b/lib/bdev/rbd/bdev_rbd.h index 397d710f9..9d1701d83 100644 --- a/lib/bdev/rbd/bdev_rbd.h +++ b/lib/bdev/rbd/bdev_rbd.h @@ -38,7 +38,7 @@ #include "spdk/bdev.h" -struct spdk_bdev *spdk_bdev_rbd_create(const char *pool_name, const char *rbd_name, - uint32_t block_size); +struct spdk_bdev *spdk_bdev_rbd_create(const char *name, const char *pool_name, + const char *rbd_name, uint32_t block_size); #endif // SPDK_BDEV_RBD_H diff --git a/lib/bdev/rbd/bdev_rbd_rpc.c b/lib/bdev/rbd/bdev_rbd_rpc.c index a7d617a1b..96e081eca 100644 --- a/lib/bdev/rbd/bdev_rbd_rpc.c +++ b/lib/bdev/rbd/bdev_rbd_rpc.c @@ -38,6 +38,7 @@ #include "spdk_internal/log.h" struct rpc_construct_rbd { + char *name; char *pool_name; char *rbd_name; uint32_t block_size; @@ -46,11 +47,13 @@ struct rpc_construct_rbd { static void free_rpc_construct_rbd(struct rpc_construct_rbd *req) { + free(req->name); free(req->pool_name); free(req->rbd_name); } static const struct spdk_json_object_decoder rpc_construct_rbd_decoders[] = { + {"name", offsetof(struct rpc_construct_rbd, name), spdk_json_decode_string, true}, {"pool_name", offsetof(struct rpc_construct_rbd, pool_name), spdk_json_decode_string}, {"rbd_name", offsetof(struct rpc_construct_rbd, rbd_name), spdk_json_decode_string}, {"block_size", offsetof(struct rpc_construct_rbd, block_size), spdk_json_decode_uint32}, @@ -71,7 +74,7 @@ spdk_rpc_construct_rbd_bdev(struct spdk_jsonrpc_request *request, goto invalid; } - bdev = spdk_bdev_rbd_create(req.pool_name, req.rbd_name, req.block_size); + bdev = spdk_bdev_rbd_create(req.name, req.pool_name, req.rbd_name, req.block_size); if (bdev == NULL) { goto invalid; } diff --git a/scripts/rpc.py b/scripts/rpc.py index e47be7202..49ed90441 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -85,6 +85,7 @@ if __name__ == "__main__": p = subparsers.add_parser('construct_rbd_bdev', help='Add a bdev with ceph rbd backend') + p.add_argument('-b', '--name', help="Name of the bdev", required=False) p.add_argument('pool_name', help='rbd pool name') p.add_argument('rbd_name', help='rbd image name') p.add_argument('block_size', help='rbd block size', type=int) diff --git a/scripts/rpc/bdev.py b/scripts/rpc/bdev.py index ed5a85f13..8459fb6f0 100755 --- a/scripts/rpc/bdev.py +++ b/scripts/rpc/bdev.py @@ -56,6 +56,10 @@ def construct_rbd_bdev(args): 'rbd_name': args.rbd_name, 'block_size': args.block_size, } + + if args.name: + params['name'] = args.name + print_array(args.client.call( 'construct_rbd_bdev', params))