diff --git a/lib/bdev/ocf/vbdev_ocf.c b/lib/bdev/ocf/vbdev_ocf.c index b34f71550..243ea87ab 100644 --- a/lib/bdev/ocf/vbdev_ocf.c +++ b/lib/bdev/ocf/vbdev_ocf.c @@ -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); } } } diff --git a/lib/bdev/ocf/vbdev_ocf.h b/lib/bdev/ocf/vbdev_ocf.h index 627daa521..c9fc7ffbe 100644 --- a/lib/bdev/ocf/vbdev_ocf.h +++ b/lib/bdev/ocf/vbdev_ocf.h @@ -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 *); diff --git a/lib/bdev/ocf/vbdev_ocf_rpc.c b/lib/bdev/ocf/vbdev_ocf_rpc.c index 86f601b41..b16b37be6 100644 --- a/lib/bdev/ocf/vbdev_ocf_rpc.c +++ b/lib/bdev/ocf/vbdev_ocf_rpc.c @@ -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); }