summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2010-05-28 12:21:27 +0200
committerAurelien Jarno <aurelien@aurel32.net>2010-06-09 18:36:09 +0200
commita513171f809da4e83800e6bd6e7518dd4b190d9f (patch)
tree48fb58934d43f18beb23163ea19599a18aa77139
parentqcow2: Fix corruption after refblock allocation (diff)
downloadqemu-kvm-a513171f809da4e83800e6bd6e7518dd4b190d9f.tar.gz
qemu-kvm-a513171f809da4e83800e6bd6e7518dd4b190d9f.tar.bz2
qemu-kvm-a513171f809da4e83800e6bd6e7518dd4b190d9f.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)
-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);