@@ -3856,6 +3856,23 @@
##
{ 'command': 'blockdev-del', 'data': { 'node-name': 'str' } }
+##
+# @x-drop-fleecing:
+#
+# Deletes fleecing-hook filter from the top of the backing chain.
+#
+# @node-name: Name of the fleecing-hook node name.
+#
+# Since: 3.1
+#
+# -> { "execute": "x-drop-fleecing",
+# "arguments": { "node-name": "fleece0" }
+# }
+# <- { "return": {} }
+#
+##
+{ 'command': 'x-drop-fleecing', 'data': { 'node-name': 'str' } }
+
##
# @BlockdevCreateOptionsFile:
#
@@ -4250,6 +4250,43 @@ out:
aio_context_release(aio_context);
}
+void qmp_x_drop_fleecing(const char *node_name, Error **errp)
+{
+ AioContext *aio_context;
+ BlockDriverState *bs;
+
+ bs = bdrv_find_node(node_name);
+ if (!bs) {
+ error_setg(errp, "Cannot find node %s", node_name);
+ return;
+ }
+
+ if (!bdrv_has_blk(bs)) {
+ error_setg(errp, "Node %s is not inserted", node_name);
+ return;
+ }
+
+ if (!bs->backing) {
+ error_setg(errp, "'%s' has no backing", node_name);
+ return;
+ }
+
+ aio_context = bdrv_get_aio_context(bs);
+ aio_context_acquire(aio_context);
+
+ bdrv_drained_begin(bs);
+
+ bdrv_child_try_set_perm(bs->backing, 0, BLK_PERM_ALL, &error_abort);
+ bdrv_replace_node(bs, backing_bs(bs), &error_abort);
+ bdrv_set_backing_hd(bs, NULL, &error_abort);
+
+ bdrv_drained_end(bs);
+
+ qmp_blockdev_del(node_name, &error_abort);
+
+ aio_context_release(aio_context);
+}
+
static BdrvChild *bdrv_find_child(BlockDriverState *parent_bs,
const char *child_name)
{
To insert fleecing-hook, it should be just created (blockdev-add) with corresponding parameters. But it can't be properly removed by blockdev-del (we can't restore backing chain in fleecing-hook .close), So, let's add this expiremental api to drop the hook. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> --- qapi/block-core.json | 17 +++++++++++++++++ blockdev.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+)