aboutsummaryrefslogtreecommitdiff
path: root/block
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2012-03-15 17:20:11 +0100
committerKevin Wolf <kwolf@redhat.com>2012-04-20 15:57:27 +0200
commitb0b6862e5e1a1394e0ab3d5da94ba8b0da8664e2 (patch)
treeadcf7976a6b1a237f8b5b4ab9828d4dea2f9b9e0 /block
parent2bfcc4a0a0b5120b6518e1c823c18cf0e8b963cb (diff)
downloadqemu-b0b6862e5e1a1394e0ab3d5da94ba8b0da8664e2.zip
qemu-b0b6862e5e1a1394e0ab3d5da94ba8b0da8664e2.tar.gz
qemu-b0b6862e5e1a1394e0ab3d5da94ba8b0da8664e2.tar.bz2
qcow2: Fail write_compressed when overwriting data
qcow2_alloc_compressed_cluster_offset() already fails if the copied flag is set, because qcow2_write_compressed() doesn't perform COW as it would have to do to allow this. However, what we really want to check here is whether the cluster is allocated or not. With internal snapshots the copied flag may not be set on allocated clusters. Check the cluster offset instead. Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block')
-rw-r--r--block/qcow2-cluster.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index 7b05990..dff782f 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -571,15 +571,14 @@ uint64_t qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
return 0;
}
+ /* Compression can't overwrite anything. Fail if the cluster was already
+ * allocated. */
cluster_offset = be64_to_cpu(l2_table[l2_index]);
- if (cluster_offset & QCOW_OFLAG_COPIED) {
+ if (cluster_offset & L2E_OFFSET_MASK) {
qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
return 0;
}
- if (cluster_offset)
- qcow2_free_any_clusters(bs, cluster_offset, 1);
-
cluster_offset = qcow2_alloc_bytes(bs, compressed_size);
if (cluster_offset < 0) {
qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);