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 <vitaliy.mysak@intel.com>
Change-Id: Ib6a78e2caf34ac057d4da53ad5dda47163e8a089
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/452146 (master)
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Signed-off-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/457187
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Tomasz Zawadzki 2019-06-07 03:15:22 -04:00 committed by Darek Stojaczyk
parent 5ba7fb92c6
commit cf0daf7f3b
3 changed files with 38 additions and 25 deletions

View File

@ -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

View File

@ -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);

View File

@ -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)