aboutsummaryrefslogtreecommitdiff
path: root/block
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2009-08-31 12:26:57 +0200
committerAnthony Liguori <aliguori@us.ibm.com>2009-09-09 17:31:26 -0500
commitea80b906f445969a5ccc781beb4e8bb7f60bbdbb (patch)
tree979c101bddb9b7561484c721a6fd301112e60efc /block
parent3aefa744551f3e9a4ea8776b607e77e99637d2e1 (diff)
qcow2: Fix metadata preallocation
The wrong version of the preallocation patch has been applied, so this is the remaining diff. We can't use truncate to grow the image file to the right size because we don't know if metadata has been written after the last data cluster. In this case truncate would shrink the file and destroy its metadata. Write a zero sector at the end of the virtual disk instead to ensure that the file is big enough. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'block')
-rw-r--r--block/qcow2.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/block/qcow2.c b/block/qcow2.c
index 9637f2ea3a..b8eae902a3 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -677,7 +677,9 @@ static int preallocate(BlockDriverState *bs)
* EOF). Extend the image to the last allocated sector.
*/
if (cluster_offset != 0) {
- bdrv_truncate(s->hd, cluster_offset + (num << 9));
+ uint8_t buf[512];
+ memset(buf, 0, 512);
+ bdrv_write(s->hd, (cluster_offset >> 9) + num - 1, buf, 1);
}
return 0;