diff mbox

commit: get the overlay node before manipulating the backing chain

Message ID 1471836963-28548-1-git-send-email-berto@igalia.com (mailing list archive)
State New, archived
Headers show

Commit Message

Alberto Garcia Aug. 22, 2016, 3:36 a.m. UTC
The 'block-commit' command has a 'top' parameter to specify the
topmost node from which the data is going to be copied.

   [E] <- [D] <- [C] <- [B] <- [A]

In this case if [C] is the top node then this is the result:

   [E] <- [B] <- [A]

[B] must be modified so its backing image string points to [E] instead
of [C]. commit_start() takes care of reopening [B] in read-write
mode, and commit_complete() puts it back in read-only mode once the
operation has finished.

In order to find [B] (the overlay node) we look for the node that has
[C] (the top node) as its backing image. However in commit_complete()
we're doing it after [C] has been removed from the chain, so [B] is
never found and remains in read-write mode.

This patch gets the overlay node before the backing chain is
manipulated.

Signed-off-by: Alberto Garcia <berto@igalia.com>
---
 block/commit.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

Comments

Max Reitz Aug. 24, 2016, 4:38 p.m. UTC | #1
On 2016-08-21 at 23:36, Alberto Garcia wrote:
> The 'block-commit' command has a 'top' parameter to specify the
> topmost node from which the data is going to be copied.
>
>    [E] <- [D] <- [C] <- [B] <- [A]
>
> In this case if [C] is the top node then this is the result:
>
>    [E] <- [B] <- [A]
>
> [B] must be modified so its backing image string points to [E] instead
> of [C]. commit_start() takes care of reopening [B] in read-write
> mode, and commit_complete() puts it back in read-only mode once the
> operation has finished.
>
> In order to find [B] (the overlay node) we look for the node that has
> [C] (the top node) as its backing image. However in commit_complete()
> we're doing it after [C] has been removed from the chain, so [B] is
> never found and remains in read-write mode.

That's... Unfortunate.

> This patch gets the overlay node before the backing chain is
> manipulated.
>
> Signed-off-by: Alberto Garcia <berto@igalia.com>
> ---
>  block/commit.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)

Thanks, applied to my block-next tree:

https://github.com/XanClic/qemu/commits/block-next

Max
diff mbox

Patch

diff --git a/block/commit.c b/block/commit.c
index 553e18d..a02539b 100644
--- a/block/commit.c
+++ b/block/commit.c
@@ -83,7 +83,7 @@  static void commit_complete(BlockJob *job, void *opaque)
     BlockDriverState *active = s->active;
     BlockDriverState *top = blk_bs(s->top);
     BlockDriverState *base = blk_bs(s->base);
-    BlockDriverState *overlay_bs;
+    BlockDriverState *overlay_bs = bdrv_find_overlay(active, top);
     int ret = data->ret;
 
     if (!block_job_is_cancelled(&s->common) && ret == 0) {
@@ -97,7 +97,6 @@  static void commit_complete(BlockJob *job, void *opaque)
     if (s->base_flags != bdrv_get_flags(base)) {
         bdrv_reopen(base, s->base_flags, NULL);
     }
-    overlay_bs = bdrv_find_overlay(active, top);
     if (overlay_bs && s->orig_overlay_flags != bdrv_get_flags(overlay_bs)) {
         bdrv_reopen(overlay_bs, s->orig_overlay_flags, NULL);
     }