All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
	qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>
Subject: [PATCH for-5.0 20/31] block: Make backing files child_of_bds children
Date: Wed, 27 Nov 2019 14:16:13 +0100	[thread overview]
Message-ID: <20191127131624.1062403-21-mreitz@redhat.com> (raw)
In-Reply-To: <20191127131624.1062403-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 4b8c33dccc..63fe19fd73 100644
--- a/block.c
+++ b/block.c
@@ -2725,6 +2725,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().
@@ -2752,8 +2766,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). */
@@ -2850,7 +2864,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: ");
@@ -3670,8 +3684,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);
@@ -6642,7 +6656,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 811bc67fc7..ce97c0146a 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 0c2f77bece..b8096763d5 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.23.0



  parent reply	other threads:[~2019-11-27 13:34 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-27 13:15 [PATCH for-5.0 00/31] block: Introduce real BdrvChildRole Max Reitz
2019-11-27 13:15 ` [PATCH for-5.0 01/31] block: Rename BdrvChildRole to BdrvChildClass Max Reitz
2019-11-27 13:15 ` [PATCH for-5.0 02/31] block: Add BdrvChildRole Max Reitz
2019-11-28  9:31   ` Vladimir Sementsov-Ogievskiy
2019-11-28 10:52     ` Max Reitz
2019-11-28 11:24       ` Vladimir Sementsov-Ogievskiy
2019-11-28 14:00         ` Max Reitz
2019-11-28 14:12   ` Kevin Wolf
2019-11-28 16:36     ` Max Reitz
2019-11-27 13:15 ` [PATCH for-5.0 03/31] block: Add BdrvChildRole to BdrvChild Max Reitz
2019-11-27 13:15 ` [PATCH for-5.0 04/31] block: Pass BdrvChildRole to bdrv_child_perm() Max Reitz
2019-11-27 13:15 ` [PATCH for-5.0 05/31] block: Drop BdrvChildClass.stay_at_node Max Reitz
2019-11-27 13:15 ` [PATCH for-5.0 06/31] block: Keep BDRV_O_NO_IO in *inherited_fmt_options Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 07/31] block: Pass BdrvChildRole to .inherit_options() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 08/31] block: Unify bdrv_*inherited_options() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 09/31] block: Unify bdrv_child_cb_attach() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 10/31] block: Unify bdrv_child_cb_detach() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 11/31] block: Add child_of_bds Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 12/31] block: Distinguish paths in *_format_default_perms Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 13/31] block: Pull out bdrv_default_perms_for_backing() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 14/31] block: Pull out bdrv_default_perms_for_storage() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 15/31] block: Split bdrv_default_perms_for_storage() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 16/31] block: Add bdrv_default_perms() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 17/31] raw-format: Split raw_read_options() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 18/31] block: Switch child_format users to child_of_bds Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 19/31] block: Drop child_format Max Reitz
2019-11-27 13:16 ` Max Reitz [this message]
2019-11-27 13:16 ` [PATCH for-5.0 21/31] block: Drop child_backing Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 22/31] block: Make format drivers use child_of_bds Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 23/31] block: Make filter " Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 24/31] block: Use child_of_bds in remaining places Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 25/31] tests: Use child_of_bds instead of child_file Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 26/31] block: Use bdrv_default_perms() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 27/31] block: Make bdrv_filter_default_perms() static Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 28/31] block: Drop bdrv_format_default_perms() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 29/31] block: Drop child_file Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 30/31] block: Pass BdrvChildRole in remaining cases Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 31/31] block: Drop @child_class from bdrv_child_perm() Max Reitz

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=20191127131624.1062403-21-mreitz@redhat.com \
    --to=mreitz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.