ocf: make vbdev_ocf_delete function asynchronous

vbdev_ocf_delete function accepts callback now.
RPC delete_ocf_bdev is also updated to adopt this change.

Change-Id: I1d357a5e37015268e28c07fd81dc35f48ec80ab8
Signed-off-by: Vitaliy Mysak <vitaliy.mysak@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/449777
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Piotr Pelpliński <piotr.pelplinski@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Vitaliy Mysak 2019-04-01 22:01:55 +00:00 committed by Jim Harris
parent fee323b2ab
commit 9977424df1
3 changed files with 28 additions and 15 deletions

View File

@ -232,14 +232,17 @@ vbdev_ocf_destruct(void *opaque)
/* Stop OCF cache and unregister SPDK bdev */
int
vbdev_ocf_delete(struct vbdev_ocf *vbdev)
vbdev_ocf_delete(struct vbdev_ocf *vbdev, void (*cb)(void *, int), void *cb_arg)
{
int rc = 0;
if (vbdev->state.started) {
spdk_bdev_unregister(&vbdev->exp_bdev, NULL, NULL);
spdk_bdev_unregister(&vbdev->exp_bdev, cb, cb_arg);
} else {
rc = vbdev_ocf_destruct(vbdev);
if (rc == 0 && cb) {
cb(cb_arg, 0);
}
}
return rc;
@ -917,7 +920,7 @@ hotremove_cb(void *ctx)
SPDK_NOTICELOG("Deinitializing '%s' because its core device '%s' was removed\n",
base->parent->name, base->name);
vbdev_ocf_delete(base->parent);
vbdev_ocf_delete(base->parent, NULL, NULL);
return;
}
@ -929,7 +932,7 @@ hotremove_cb(void *ctx)
SPDK_NOTICELOG("Deinitializing '%s' because"
" its cache device '%s' was removed\n",
vbdev->name, base->name);
vbdev_ocf_delete(vbdev);
vbdev_ocf_delete(vbdev, NULL, NULL);
}
}
}

View File

@ -145,7 +145,7 @@ struct vbdev_ocf *vbdev_ocf_get_by_name(const char *name);
struct vbdev_ocf_base *vbdev_ocf_get_base_by_name(const char *name);
/* Stop OCF cache and unregister SPDK bdev */
int vbdev_ocf_delete(struct vbdev_ocf *vbdev);
int vbdev_ocf_delete(struct vbdev_ocf *vbdev, void (*cb)(void *, int), void *cb_arg);
typedef void (*vbdev_ocf_foreach_fn)(struct vbdev_ocf *, void *);

View File

@ -114,12 +114,30 @@ static const struct spdk_json_object_decoder rpc_delete_ocf_bdev_decoders[] = {
{"name", offsetof(struct rpc_delete_ocf_bdev, name), spdk_json_decode_string},
};
static void
delete_cb(void *cb_arg, int status)
{
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 delete OCF vbdev: %d",
status);
} else {
w = spdk_jsonrpc_begin_result(request);
if (w) {
spdk_json_write_bool(w, true);
spdk_jsonrpc_end_result(request, w);
}
}
}
static void
spdk_rpc_delete_ocf_bdev(struct spdk_jsonrpc_request *request,
const struct spdk_json_val *params)
{
struct rpc_delete_ocf_bdev req = {NULL};
struct spdk_json_write_ctx *w;
struct vbdev_ocf *vbdev;
int status;
@ -139,7 +157,7 @@ spdk_rpc_delete_ocf_bdev(struct spdk_jsonrpc_request *request,
goto end;
}
status = vbdev_ocf_delete(vbdev);
status = vbdev_ocf_delete(vbdev, delete_cb, request);
if (status) {
spdk_jsonrpc_send_error_response_fmt(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
"Could not delete OCF vbdev: %s",
@ -147,14 +165,6 @@ spdk_rpc_delete_ocf_bdev(struct spdk_jsonrpc_request *request,
goto end;
}
w = spdk_jsonrpc_begin_result(request);
if (w == NULL) {
goto end;
}
spdk_json_write_bool(w, true);
spdk_jsonrpc_end_result(request, w);
end:
free_rpc_delete_ocf_bdev(&req);
}