Message ID | 1471836963-28548-1-git-send-email-berto@igalia.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 --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); }
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(-)