From: Max Reitz <mreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>
Subject: [PATCH v2 22/33] block: Make backing files child_of_bds children
Date: Tue, 4 Feb 2020 18:08:37 +0100 [thread overview]
Message-ID: <20200204170848.614480-23-mreitz@redhat.com> (raw)
In-Reply-To: <20200204170848.614480-1-mreitz@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
block.c | 26 ++++++++++++++++++++------
block/backup-top.c | 2 +-
block/vvfat.c | 3 ++-
tests/test-bdrv-drain.c | 13 +++++++------
4 files changed, 30 insertions(+), 14 deletions(-)
diff --git a/block.c b/block.c
index 77755f0c6c..6b705ee23a 100644
--- a/block.c
+++ b/block.c
@@ -2748,6 +2748,20 @@ static bool bdrv_inherits_from_recursive(BlockDriverState *child,
return child != NULL;
}
+/*
+ * Return the BdrvChildRole for @bs's backing child. bs->backing is
+ * mostly used for COW backing children (role = COW), but also for
+ * filtered children (role = FILTERED | PRIMARY).
+ */
+static BdrvChildRole bdrv_backing_role(BlockDriverState *bs)
+{
+ if (bs->drv && bs->drv->is_filter) {
+ return BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY;
+ } else {
+ return BDRV_CHILD_COW;
+ }
+}
+
/*
* Sets the backing file link of a BDS. A new reference is created; callers
* which don't need their own reference any more must call bdrv_unref().
@@ -2775,8 +2789,8 @@ void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd,
goto out;
}
- bs->backing = bdrv_attach_child(bs, backing_hd, "backing", &child_backing,
- 0, errp);
+ bs->backing = bdrv_attach_child(bs, backing_hd, "backing", &child_of_bds,
+ bdrv_backing_role(bs), errp);
/* If backing_hd was already part of bs's backing chain, and
* inherits_from pointed recursively to bs then let's update it to
* point directly to bs (else it will become NULL). */
@@ -2873,7 +2887,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
}
backing_hd = bdrv_open_inherit(backing_filename, reference, options, 0, bs,
- &child_backing, 0, errp);
+ &child_of_bds, BDRV_CHILD_COW, errp);
if (!backing_hd) {
bs->open_flags |= BDRV_O_NO_BACKING;
error_prepend(errp, "Could not open backing file: ");
@@ -3709,8 +3723,8 @@ int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp)
if (state->replace_backing_bs && state->new_backing_bs) {
uint64_t nperm, nshared;
bdrv_child_perm(state->bs, state->new_backing_bs,
- NULL, &child_backing, 0, bs_queue,
- state->perm, state->shared_perm,
+ NULL, &child_of_bds, bdrv_backing_role(state->bs),
+ bs_queue, state->perm, state->shared_perm,
&nperm, &nshared);
ret = bdrv_check_update_perm(state->new_backing_bs, NULL,
nperm, nshared, NULL, NULL, errp);
@@ -6656,7 +6670,7 @@ void bdrv_refresh_filename(BlockDriverState *bs)
drv->bdrv_gather_child_options(bs, opts, backing_overridden);
} else {
QLIST_FOREACH(child, &bs->children, next) {
- if (child->klass == &child_backing && !backing_overridden) {
+ if (child == bs->backing && !backing_overridden) {
/* We can skip the backing BDS if it has not been overridden */
continue;
}
diff --git a/block/backup-top.c b/block/backup-top.c
index 36ed71413b..8ac7009852 100644
--- a/block/backup-top.c
+++ b/block/backup-top.c
@@ -138,7 +138,7 @@ static void backup_top_child_perm(BlockDriverState *bs, BdrvChild *c,
return;
}
- if (child_class == &child_file) {
+ if (!(role & BDRV_CHILD_FILTERED)) {
/*
* Target child
*
diff --git a/block/vvfat.c b/block/vvfat.c
index 3bcf860af7..2bc5812dc5 100644
--- a/block/vvfat.c
+++ b/block/vvfat.c
@@ -3228,7 +3228,8 @@ static void vvfat_child_perm(BlockDriverState *bs, BdrvChild *c,
{
BDRVVVFATState *s = bs->opaque;
- assert(c == s->qcow || child_class == &child_backing);
+ assert(c == s->qcow ||
+ (child_class == &child_of_bds && (role & BDRV_CHILD_COW)));
if (c == s->qcow) {
/* This is a private node, nobody should try to attach to it */
diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c
index b3d7960bd0..15393a0140 100644
--- a/tests/test-bdrv-drain.c
+++ b/tests/test-bdrv-drain.c
@@ -96,7 +96,7 @@ static void bdrv_test_child_perm(BlockDriverState *bs, BdrvChild *c,
* bdrv_format_default_perms() accepts only these two, so disguise
* detach_by_driver_cb_parent as one of them.
*/
- if (child_class != &child_file && child_class != &child_backing) {
+ if (child_class != &child_file && child_class != &child_of_bds) {
child_class = &child_file;
}
@@ -1399,8 +1399,8 @@ static void test_detach_indirect(bool by_parent_cb)
bdrv_ref(a);
child_b = bdrv_attach_child(parent_b, b, "PB-B", &child_file, 0,
&error_abort);
- child_a = bdrv_attach_child(parent_b, a, "PB-A", &child_backing, 0,
- &error_abort);
+ child_a = bdrv_attach_child(parent_b, a, "PB-A", &child_of_bds,
+ BDRV_CHILD_COW, &error_abort);
bdrv_ref(a);
bdrv_attach_child(parent_a, a, "PA-A",
@@ -1793,7 +1793,7 @@ static void test_drop_intermediate_poll(void)
int i;
int ret;
- chain_child_class = child_backing;
+ chain_child_class = child_of_bds;
chain_child_class.update_filename = drop_intermediate_poll_update_filename;
for (i = 0; i < 3; i++) {
@@ -1816,7 +1816,7 @@ static void test_drop_intermediate_poll(void)
/* Takes the reference to chain[i - 1] */
chain[i]->backing = bdrv_attach_child(chain[i], chain[i - 1],
"chain", &chain_child_class,
- 0, &error_abort);
+ BDRV_CHILD_COW, &error_abort);
}
}
@@ -2034,7 +2034,8 @@ static void do_test_replace_child_mid_drain(int old_drain_count,
bdrv_ref(old_child_bs);
parent_bs->backing = bdrv_attach_child(parent_bs, old_child_bs, "child",
- &child_backing, 0, &error_abort);
+ &child_of_bds, BDRV_CHILD_COW,
+ &error_abort);
for (i = 0; i < old_drain_count; i++) {
bdrv_drained_begin(old_child_bs);
--
2.24.1
next prev parent reply other threads:[~2020-02-04 17:18 UTC|newest]
Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-04 17:08 [PATCH v2 00/33] block: Introduce real BdrvChildRole Max Reitz
2020-02-04 17:08 ` [PATCH v2 01/33] block: Add BlockDriver.is_format Max Reitz
2020-02-05 13:51 ` Eric Blake
2020-02-06 10:25 ` Max Reitz
2020-02-11 15:30 ` Alberto Garcia
2020-02-04 17:08 ` [PATCH v2 02/33] block: Rename BdrvChildRole to BdrvChildClass Max Reitz
2020-02-05 15:20 ` Eric Blake
2020-02-11 15:31 ` Alberto Garcia
2020-02-04 17:08 ` [PATCH v2 03/33] block: Add BdrvChildRole Max Reitz
2020-02-05 15:24 ` Eric Blake
2020-02-06 10:47 ` Max Reitz
2020-02-06 10:49 ` Max Reitz
2020-02-11 15:35 ` Eric Blake
2020-02-11 15:41 ` Alberto Garcia
2020-02-17 14:40 ` Max Reitz
2020-02-04 17:08 ` [PATCH v2 04/33] block: Add BdrvChildRole to BdrvChild Max Reitz
2020-02-05 15:33 ` Eric Blake
2020-02-06 10:53 ` Max Reitz
2020-02-11 15:37 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 05/33] block: Pass BdrvChildRole to bdrv_child_perm() Max Reitz
2020-02-05 16:14 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 06/33] block: Pass BdrvChildRole to .inherit_options() Max Reitz
2020-02-05 16:18 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 07/33] block: Pass parent_is_format " Max Reitz
2020-02-05 16:26 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 08/33] block: Rename bdrv_inherited_options() Max Reitz
2020-02-05 16:36 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 09/33] block: Add generic bdrv_inherited_options() Max Reitz
2020-02-05 16:48 ` Eric Blake
2020-02-06 11:06 ` Max Reitz
2020-02-04 17:08 ` [PATCH v2 10/33] block: Use bdrv_inherited_options() Max Reitz
2020-02-05 17:14 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 11/33] block: Unify bdrv_child_cb_attach() Max Reitz
2020-02-05 17:24 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 12/33] block: Unify bdrv_child_cb_detach() Max Reitz
2020-02-05 17:26 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 13/33] block: Add child_of_bds Max Reitz
2020-02-05 20:33 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 14/33] block: Distinguish paths in *_format_default_perms Max Reitz
2020-02-05 20:54 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 15/33] block: Pull out bdrv_default_perms_for_backing() Max Reitz
2020-02-05 20:56 ` Eric Blake
2020-02-06 11:19 ` Max Reitz
2020-02-11 15:38 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 16/33] block: Pull out bdrv_default_perms_for_storage() Max Reitz
2020-02-05 21:02 ` Eric Blake
2020-02-06 11:20 ` Max Reitz
2020-02-04 17:08 ` [PATCH v2 17/33] block: Split bdrv_default_perms_for_storage() Max Reitz
2020-02-05 21:25 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 18/33] block: Add bdrv_default_perms() Max Reitz
2020-02-05 21:53 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 19/33] raw-format: Split raw_read_options() Max Reitz
2020-02-05 21:57 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 20/33] block: Switch child_format users to child_of_bds Max Reitz
2020-02-05 22:11 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 21/33] block: Drop child_format Max Reitz
2020-02-05 22:19 ` Eric Blake
2020-02-04 17:08 ` Max Reitz [this message]
2020-02-05 22:45 ` [PATCH v2 22/33] block: Make backing files child_of_bds children Eric Blake
2020-02-06 11:33 ` Max Reitz
2020-02-11 15:39 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 23/33] block: Drop child_backing Max Reitz
2020-02-05 22:48 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 24/33] block: Make format drivers use child_of_bds Max Reitz
2020-02-05 22:54 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 25/33] block: Make filter " Max Reitz
2020-02-05 23:02 ` Eric Blake
2020-02-06 11:35 ` Max Reitz
2020-02-04 17:08 ` [PATCH v2 26/33] block: Use child_of_bds in remaining places Max Reitz
2020-02-05 23:28 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 27/33] tests: Use child_of_bds instead of child_file Max Reitz
2020-02-11 15:42 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 28/33] block: Use bdrv_default_perms() Max Reitz
2020-02-11 15:46 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 29/33] block: Make bdrv_filter_default_perms() static Max Reitz
2020-02-11 15:48 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 30/33] block: Drop bdrv_format_default_perms() Max Reitz
2020-02-11 15:48 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 31/33] block: Drop child_file Max Reitz
2020-02-11 15:49 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 32/33] block: Pass BdrvChildRole in remaining cases Max Reitz
2020-02-11 15:53 ` Eric Blake
2020-02-18 12:01 ` Max Reitz
2020-02-18 12:53 ` Eric Blake
2020-02-04 17:08 ` [PATCH v2 33/33] block: Drop @child_class from bdrv_child_perm() Max Reitz
2020-02-11 15:56 ` Eric Blake
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200204170848.614480-23-mreitz@redhat.com \
--to=mreitz@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@virtuozzo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).