aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2010-05-28 12:21:27 +0200
committerDoug Goldstein <cardoe@gentoo.org>2010-07-20 17:36:00 -0500
commitfdbec203bb2483e4533e62ef5c2dd0cc66f09234 (patch)
treeeaaa975cd489627f70e94ecee469b077eec65686 /block/qcow2-refcount.c
parentqcow2: Fix corruption after refblock allocation (diff)
downloadqemu-kvm-fdbec203bb2483e4533e62ef5c2dd0cc66f09234.tar.gz
qemu-kvm-fdbec203bb2483e4533e62ef5c2dd0cc66f09234.tar.bz2
qemu-kvm-fdbec203bb2483e4533e62ef5c2dd0cc66f09234.zip
qcow2: Fix corruption after error in update_refcount
After it is done with updating refcounts in the cache, update_refcount writes all changed entries to disk. If a refcount block allocation fails, however, there was no change yet and therefore first_index = last_index = -1. Don't treat -1 as a normal sector index (resulting in a 512 byte write!) but return without updating anything in this case. Signed-off-by: Kevin Wolf <kwolf@redhat.com> (cherry picked from commit 86fa8da83771238de55dc44819a1a27bafef5353)
Diffstat (limited to 'block/qcow2-refcount.c')
-rw-r--r--block/qcow2-refcount.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index fa78e46ee..465d5d36e 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -402,6 +402,10 @@ static int write_refcount_block_entries(BDRVQcowState *s,
return 0;
}
+ if (first_index < 0) {
+ return 0;
+ }
+
first_index &= ~(REFCOUNTS_PER_SECTOR - 1);
last_index = (last_index + REFCOUNTS_PER_SECTOR)
& ~(REFCOUNTS_PER_SECTOR - 1);