aboutsummaryrefslogtreecommitdiff
path: root/block/commit.c
diff options
context:
space:
mode:
authorAlberto Garcia <berto@igalia.com>2019-02-15 15:49:32 +0200
committerKevin Wolf <kwolf@redhat.com>2019-02-25 15:03:19 +0100
commit2468eed3befde57ee5be090dd957b9cec220449e (patch)
treec9cefa2cfb938c77097c952089addd3d0f122047 /block/commit.c
parent57830a499f7c815bb0cb325c94a3d8c910d13cfa (diff)
downloadqemu-2468eed3befde57ee5be090dd957b9cec220449e.zip
qemu-2468eed3befde57ee5be090dd957b9cec220449e.tar.gz
qemu-2468eed3befde57ee5be090dd957b9cec220449e.tar.bz2
commit: Replace commit_top_bs on failure after deleting the block job
If there's an error in commit_start() then the block job must be deleted before replacing commit_top_bs, otherwise it will fail because of lack of permissions. This happens since the permission system was introduced in 8dfba2797761d8a43744e4e6571c8175e448a478. Fortunately this bug doesn't seem to be possible to reproduce at the moment without changing the code. Signed-off-by: Alberto Garcia <berto@igalia.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block/commit.c')
-rw-r--r--block/commit.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/block/commit.c b/block/commit.c
index 53148e6..5deb059 100644
--- a/block/commit.c
+++ b/block/commit.c
@@ -374,10 +374,12 @@ fail:
if (s->top) {
blk_unref(s->top);
}
+ job_early_fail(&s->common.job);
+ /* commit_top_bs has to be replaced after deleting the block job,
+ * otherwise this would fail because of lack of permissions. */
if (commit_top_bs) {
bdrv_replace_node(commit_top_bs, top, &error_abort);
}
- job_early_fail(&s->common.job);
}