[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 23/36] block: adapt bdrv_append() for inserting filters
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[PATCH v2 23/36] block: adapt bdrv_append() for inserting filters |
Date: |
Fri, 27 Nov 2020 17:45:09 +0300 |
bdrv_append is not very good for inserting filters: it does extra
permission update as part of bdrv_set_backing_hd(). During this update
filter may conflict with other parents of top_bs.
Instead, let's first do all graph modifications and after it update
permissions.
Note: bdrv_append() is still only works for backing-child based
filters. It's something to improve later.
It simplifies the fact that bdrv_append() used to append new nodes,
without backing child. Let's add an assertion.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
block.c | 28 +++++++++++++++++-----------
1 file changed, 17 insertions(+), 11 deletions(-)
diff --git a/block.c b/block.c
index 02da1a90bc..7094922509 100644
--- a/block.c
+++ b/block.c
@@ -4998,22 +4998,28 @@ int bdrv_replace_node(BlockDriverState *from,
BlockDriverState *to,
int bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
Error **errp)
{
- Error *local_err = NULL;
+ int ret;
+ GSList *tran = NULL;
- bdrv_set_backing_hd(bs_new, bs_top, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- return -EPERM;
+ assert(!bs_new->backing);
+
+ ret = bdrv_attach_child_noperm(bs_new, bs_top, "backing",
+ &child_of_bds, bdrv_backing_role(bs_new),
+ &bs_new->backing, &tran, errp);
+ if (ret < 0) {
+ goto out;
}
- bdrv_replace_node(bs_top, bs_new, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- bdrv_set_backing_hd(bs_new, NULL, &error_abort);
- return -EPERM;
+ ret = bdrv_replace_node_noperm(bs_top, bs_new, true, &tran, errp);
+ if (ret < 0) {
+ goto out;
}
- return 0;
+ ret = bdrv_refresh_perms(bs_new, errp);
+out:
+ tran_finalize(tran, ret);
+
+ return ret;
}
static void bdrv_delete(BlockDriverState *bs)
--
2.21.3
- [PATCH v2 08/36] block: make bdrv_reopen_{prepare, commit, abort} private, (continued)
- [PATCH v2 08/36] block: make bdrv_reopen_{prepare, commit, abort} private, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 09/36] block: return value from bdrv_replace_node(), Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 13/36] block: rewrite bdrv_child_try_set_perm() using bdrv_refresh_perms(), Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 14/36] block: inline bdrv_child_*() permission functions calls, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 11/36] block: bdrv_refresh_perms: check parents compliance, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 12/36] block: refactor bdrv_child* permission functions, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 15/36] block: use topological sort for permission update, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 10/36] util: add transactions.c, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 20/36] block: add bdrv_attach_child_common() transaction action, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 19/36] block: fix bdrv_replace_node_common, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 23/36] block: adapt bdrv_append() for inserting filters,
Vladimir Sementsov-Ogievskiy <=
- [PATCH v2 17/36] block: add bdrv_list_* permission update functions, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 16/36] block: add bdrv_drv_set_perm transaction action, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 26/36] block/backup-top: drop .active, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 21/36] block: add bdrv_attach_child_noperm() transaction action, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 28/36] block: add bdrv_set_backing_noperm() transaction action, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 02/36] tests/test-bdrv-graph-mod: add test_parallel_perm_update, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 18/36] block: add bdrv_replace_child_safe() transaction action, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 22/36] block: split out bdrv_replace_node_noperm(), Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 24/36] block: add bdrv_remove_backing transaction action, Vladimir Sementsov-Ogievskiy, 2020/11/27
- [PATCH v2 03/36] block: bdrv_append(): don't consume reference, Vladimir Sementsov-Ogievskiy, 2020/11/27