diff mbox series

[v3,12/33] block: Unify bdrv_child_cb_detach()

Message ID 20200218124242.584644-13-mreitz@redhat.com (mailing list archive)
State New, archived
Headers show
Series block: Introduce real BdrvChildRole | expand

Commit Message

Max Reitz Feb. 18, 2020, 12:42 p.m. UTC
Make bdrv_child_cb_detach() call bdrv_backing_detach() for children with
a COW role (and drop the reverse call from bdrv_backing_detach()), so it
can be used for any child (with a proper role set).

Because so far no child has a proper role set, we need a temporary new
callback for child_backing.detach that ensures bdrv_backing_detach() is
called for all COW children that do not have their role set yet.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 block.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

Comments

Kevin Wolf May 6, 2020, 12:41 p.m. UTC | #1
Am 18.02.2020 um 13:42 hat Max Reitz geschrieben:
> Make bdrv_child_cb_detach() call bdrv_backing_detach() for children with
> a COW role (and drop the reverse call from bdrv_backing_detach()), so it
> can be used for any child (with a proper role set).
> 
> Because so far no child has a proper role set, we need a temporary new
> callback for child_backing.detach that ensures bdrv_backing_detach() is
> called for all COW children that do not have their role set yet.
> 
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> ---
>  block.c | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/block.c b/block.c
> index 3cf1293a7b..0f24546863 100644
> --- a/block.c
> +++ b/block.c
> @@ -943,6 +943,7 @@ static void bdrv_child_cb_drained_end(BdrvChild *child,
>  }
>  
>  static void bdrv_backing_attach(BdrvChild *c);
> +static void bdrv_backing_detach(BdrvChild *c);

This series leaves a few static forward declarations behind, and even
in the middle of the code rather than at the top.

Does anything stop us from adding bdrv_inherited_options() after all the
old functions instead? This will require a temporary forward
declaration, too, but it can go away at the end of the series when there
is only child_of_bds left.

Kevin
Max Reitz May 7, 2020, 9:09 a.m. UTC | #2
On 06.05.20 14:41, Kevin Wolf wrote:
> Am 18.02.2020 um 13:42 hat Max Reitz geschrieben:
>> Make bdrv_child_cb_detach() call bdrv_backing_detach() for children with
>> a COW role (and drop the reverse call from bdrv_backing_detach()), so it
>> can be used for any child (with a proper role set).
>>
>> Because so far no child has a proper role set, we need a temporary new
>> callback for child_backing.detach that ensures bdrv_backing_detach() is
>> called for all COW children that do not have their role set yet.
>>
>> Signed-off-by: Max Reitz <mreitz@redhat.com>
>> Reviewed-by: Eric Blake <eblake@redhat.com>
>> ---
>>  block.c | 15 ++++++++++++++-
>>  1 file changed, 14 insertions(+), 1 deletion(-)
>>
>> diff --git a/block.c b/block.c
>> index 3cf1293a7b..0f24546863 100644
>> --- a/block.c
>> +++ b/block.c
>> @@ -943,6 +943,7 @@ static void bdrv_child_cb_drained_end(BdrvChild *child,
>>  }
>>  
>>  static void bdrv_backing_attach(BdrvChild *c);
>> +static void bdrv_backing_detach(BdrvChild *c);
> 
> This series leaves a few static forward declarations behind, and even
> in the middle of the code rather than at the top.
> 
> Does anything stop us from adding bdrv_inherited_options() after all the
> old functions instead? This will require a temporary forward
> declaration, too, but it can go away at the end of the series when there
> is only child_of_bds left.

Personally, I have nothing against forward declarations, although they
probably should reside at the top, yes.

I suppose I can indeed just put the whole code after all the current
code (i.e., behind child_backing), though.

Max
diff mbox series

Patch

diff --git a/block.c b/block.c
index 3cf1293a7b..0f24546863 100644
--- a/block.c
+++ b/block.c
@@ -943,6 +943,7 @@  static void bdrv_child_cb_drained_end(BdrvChild *child,
 }
 
 static void bdrv_backing_attach(BdrvChild *c);
+static void bdrv_backing_detach(BdrvChild *c);
 
 static void bdrv_child_cb_attach(BdrvChild *child)
 {
@@ -958,6 +959,11 @@  static void bdrv_child_cb_attach(BdrvChild *child)
 static void bdrv_child_cb_detach(BdrvChild *child)
 {
     BlockDriverState *bs = child->opaque;
+
+    if (child->role & BDRV_CHILD_COW) {
+        bdrv_backing_detach(child);
+    }
+
     bdrv_unapply_subtree_drain(child, bs);
 }
 
@@ -1204,7 +1210,14 @@  static void bdrv_backing_detach(BdrvChild *c)
     bdrv_op_unblock_all(c->bs, parent->backing_blocker);
     error_free(parent->backing_blocker);
     parent->backing_blocker = NULL;
+}
 
+/* XXX: Will be removed along with child_backing */
+static void bdrv_child_cb_detach_backing(BdrvChild *c)
+{
+    if (!(c->role & BDRV_CHILD_COW)) {
+        bdrv_backing_detach(c);
+    }
     bdrv_child_cb_detach(c);
 }
 
@@ -1252,7 +1265,7 @@  const BdrvChildClass child_backing = {
     .parent_is_bds   = true,
     .get_parent_desc = bdrv_child_get_parent_desc,
     .attach          = bdrv_child_cb_attach_backing,
-    .detach          = bdrv_backing_detach,
+    .detach          = bdrv_child_cb_detach_backing,
     .inherit_options = bdrv_backing_options,
     .drained_begin   = bdrv_child_cb_drained_begin,
     .drained_poll    = bdrv_child_cb_drained_poll,