From cf0daf7f3bca948d74c3706c4569d1e4bf9402e4 Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Fri, 7 Jun 2019 03:15:22 -0400 Subject: [PATCH] ocf: add callback argument to vbdev_ocf_construct() Add callback for construct function. It is not asynchronous yet, but will be after adopting asynchronous OCF API Also adopt RPC construct call for this change. This is done in this patch because (1) change is small (2) leaving implementation as TODO still requires implementing a mock because we decided that callback should be required rather than optional. Signed-off-by: Vitaliy Mysak Change-Id: Ib6a78e2caf34ac057d4da53ad5dda47163e8a089 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/452146 (master) Tested-by: SPDK CI Jenkins Reviewed-by: Tomasz Zawadzki Reviewed-by: Darek Stojaczyk Reviewed-by: Shuhei Matsumoto Signed-off-by: Tomasz Zawadzki Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/457187 Reviewed-by: Ben Walker --- lib/bdev/ocf/vbdev_ocf.c | 15 ++++++++----- lib/bdev/ocf/vbdev_ocf.h | 6 ++++-- lib/bdev/ocf/vbdev_ocf_rpc.c | 42 ++++++++++++++++++++---------------- 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/lib/bdev/ocf/vbdev_ocf.c b/lib/bdev/ocf/vbdev_ocf.c index e23bf63df..1f817b6ce 100644 --- a/lib/bdev/ocf/vbdev_ocf.c +++ b/lib/bdev/ocf/vbdev_ocf.c @@ -1069,11 +1069,13 @@ create_from_bdevs(struct vbdev_ocf *vbdev, } /* Init and then start vbdev if all base devices are present */ -int +void vbdev_ocf_construct(const char *vbdev_name, const char *cache_mode_name, const char *cache_name, - const char *core_name) + const char *core_name, + void (*cb)(int, struct vbdev_ocf *, void *), + void *cb_arg) { int rc; struct spdk_bdev *cache_bdev = spdk_bdev_get_by_name(cache_name); @@ -1082,12 +1084,14 @@ vbdev_ocf_construct(const char *vbdev_name, rc = init_vbdev(vbdev_name, cache_mode_name, cache_name, core_name); if (rc) { - return rc; + cb(rc, NULL, cb_arg); + return; } vbdev = vbdev_ocf_get_by_name(vbdev_name); if (vbdev == NULL) { - return -ENODEV; + cb(-ENODEV, NULL, cb_arg); + return; } if (cache_bdev == NULL) { @@ -1099,7 +1103,8 @@ vbdev_ocf_construct(const char *vbdev_name, vbdev->name, core_name); } - return create_from_bdevs(vbdev, cache_bdev, core_bdev); + rc = create_from_bdevs(vbdev, cache_bdev, core_bdev); + cb(rc, vbdev, cb_arg); } /* This called if new device is created in SPDK application diff --git a/lib/bdev/ocf/vbdev_ocf.h b/lib/bdev/ocf/vbdev_ocf.h index 850a02ce1..a6ed0296c 100644 --- a/lib/bdev/ocf/vbdev_ocf.h +++ b/lib/bdev/ocf/vbdev_ocf.h @@ -160,11 +160,13 @@ struct vbdev_ocf { TAILQ_ENTRY(vbdev_ocf) tailq; }; -int vbdev_ocf_construct( +void vbdev_ocf_construct( const char *vbdev_name, const char *cache_mode_name, const char *cache_name, - const char *core_name); + const char *core_name, + void (*cb)(int, struct vbdev_ocf *, void *), + void *cb_arg); /* If vbdev is online, return its object */ struct vbdev_ocf *vbdev_ocf_get_by_name(const char *name); diff --git a/lib/bdev/ocf/vbdev_ocf_rpc.c b/lib/bdev/ocf/vbdev_ocf_rpc.c index b16b37be6..7430fbe8c 100644 --- a/lib/bdev/ocf/vbdev_ocf_rpc.c +++ b/lib/bdev/ocf/vbdev_ocf_rpc.c @@ -62,13 +62,31 @@ static const struct spdk_json_object_decoder rpc_construct_ocf_bdev_decoders[] = {"core_bdev_name", offsetof(struct rpc_construct_ocf_bdev, core_bdev_name), spdk_json_decode_string}, }; +static void +construct_cb(int status, struct vbdev_ocf *vbdev, void *cb_arg) +{ + struct spdk_jsonrpc_request *request = cb_arg; + struct spdk_json_write_ctx *w; + + if (status) { + spdk_jsonrpc_send_error_response_fmt(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, + "Could not create OCF vbdev: %d", + status); + } else { + w = spdk_jsonrpc_begin_result(request); + if (w) { + spdk_json_write_string(w, vbdev->name); + spdk_jsonrpc_end_result(request, w); + } + } +} + static void spdk_rpc_construct_ocf_bdev(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { - int ret = 0; struct rpc_construct_ocf_bdev req = {NULL}; - struct spdk_json_write_ctx *w; + int ret; ret = spdk_json_decode_object(params, rpc_construct_ocf_bdev_decoders, SPDK_COUNTOF(rpc_construct_ocf_bdev_decoders), @@ -76,24 +94,12 @@ spdk_rpc_construct_ocf_bdev(struct spdk_jsonrpc_request *request, if (ret) { spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters"); - goto end; + free_rpc_construct_ocf_bdev(&req); + return; } - ret = vbdev_ocf_construct(req.name, req.mode, req.cache_bdev_name, req.core_bdev_name); - if (ret) { - spdk_jsonrpc_send_error_response_fmt(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, - "Could not create OCF vbdev: %s", - spdk_strerror(-ret)); - goto end; - } - - w = spdk_jsonrpc_begin_result(request); - if (w) { - spdk_json_write_string(w, req.name); - spdk_jsonrpc_end_result(request, w); - } - -end: + vbdev_ocf_construct(req.name, req.mode, req.cache_bdev_name, req.core_bdev_name, + construct_cb, request); free_rpc_construct_ocf_bdev(&req); } SPDK_RPC_REGISTER("construct_ocf_bdev", spdk_rpc_construct_ocf_bdev, SPDK_RPC_RUNTIME)