[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 19/21] block: add bdrv_remove_backing transaction action
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[PATCH 19/21] block: add bdrv_remove_backing transaction action |
Date: |
Mon, 23 Nov 2020 23:12:31 +0300 |
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
block.c | 42 ++++++++++++++++++++++++++++++++++++++++--
1 file changed, 40 insertions(+), 2 deletions(-)
diff --git a/block.c b/block.c
index cf7b859a81..6ea926e2c1 100644
--- a/block.c
+++ b/block.c
@@ -2974,12 +2974,19 @@ BdrvChild *bdrv_attach_child(BlockDriverState
*parent_bs,
return child;
}
+static void bdrv_child_free(void *opaque)
+{
+ BdrvChild *c = opaque;
+
+ g_free(c->name);
+ g_free(c);
+}
+
static void bdrv_remove_empty_child(BdrvChild *child)
{
assert(!child->bs);
QLIST_SAFE_REMOVE(child, next);
- g_free(child->name);
- g_free(child);
+ bdrv_child_free(child);
}
typedef struct BdrvAttachChildNopermState {
@@ -4852,6 +4859,37 @@ static bool should_update_child(BdrvChild *c,
BlockDriverState *to)
return ret;
}
+/* this doesn't restore original child bs, only the child itself */
+static void bdrv_remove_backing_abort(void *opaque)
+{
+ BdrvChild *c = opaque;
+ BlockDriverState *parent_bs = c->opaque;
+
+ QLIST_INSERT_HEAD(&parent_bs->children, c, next);
+ parent_bs->backing = c;
+}
+
+static BdrvActionDrv bdrv_remove_backing_drv = {
+ .abort = bdrv_remove_backing_abort,
+ .commit = bdrv_child_free,
+};
+
+__attribute__((unused))
+static void bdrv_remove_backing(BlockDriverState *bs, GSList **tran)
+{
+ if (!bs->backing) {
+ return;
+ }
+
+ if (bs->backing->bs) {
+ bdrv_replace_child_safe(bs->backing, NULL, tran);
+ }
+
+ tran_prepend(tran, &bdrv_remove_backing_drv, bs->backing);
+ QLIST_SAFE_REMOVE(bs->backing, next);
+ bs->backing = NULL;
+}
+
static int bdrv_replace_node_noperm(BlockDriverState *from,
BlockDriverState *to,
bool auto_skip, GSList **tran, Error
**errp)
--
2.21.3
- [PATCH 08/21] block: use topological sort for permission update, (continued)
- [PATCH 08/21] block: use topological sort for permission update, Vladimir Sementsov-Ogievskiy, 2020/11/23
- [PATCH 05/21] block: refactor bdrv_child* permission functions, Vladimir Sementsov-Ogievskiy, 2020/11/23
- [PATCH 09/21] block: add bdrv_drv_set_perm transaction action, Vladimir Sementsov-Ogievskiy, 2020/11/23
- [PATCH 10/21] block: add bdrv_list_* permission update functions, Vladimir Sementsov-Ogievskiy, 2020/11/23
- [PATCH 11/21] block: add bdrv_replace_child_safe() transaction action, Vladimir Sementsov-Ogievskiy, 2020/11/23
- [PATCH 12/21] block: return value from bdrv_replace_node(), Vladimir Sementsov-Ogievskiy, 2020/11/23
- [PATCH 13/21] block: fix bdrv_replace_node_common, Vladimir Sementsov-Ogievskiy, 2020/11/23
- [PATCH 15/21] block: split out bdrv_replace_node_noperm(), Vladimir Sementsov-Ogievskiy, 2020/11/23
- [PATCH 14/21] block: add bdrv_attach_child_noperm() transaction action, Vladimir Sementsov-Ogievskiy, 2020/11/23
- [PATCH 16/21] block: bdrv_append(): don't consume reference, Vladimir Sementsov-Ogievskiy, 2020/11/23
- [PATCH 19/21] block: add bdrv_remove_backing transaction action,
Vladimir Sementsov-Ogievskiy <=
- [PATCH 21/21] block/backup-top: drop .active, Vladimir Sementsov-Ogievskiy, 2020/11/23
- [PATCH 17/21] block: bdrv_append(): return status, Vladimir Sementsov-Ogievskiy, 2020/11/23
- [PATCH 18/21] block: adapt bdrv_append() for inserting filters, Vladimir Sementsov-Ogievskiy, 2020/11/23
- [PATCH 20/21] block: introduce bdrv_drop_filter(), Vladimir Sementsov-Ogievskiy, 2020/11/23