diff options
author | Stefan Weil <weil@mail.berlios.de> | 2009-08-14 21:50:02 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-08-27 19:33:15 -0500 |
commit | 6eea90eba47534d57f05d16c1b7d695574e2395d (patch) | |
tree | dfc5adfd7b06bf6a22a2aaa8f251097922e04b9f /block | |
parent | d1cd4bf41906980434bee1c6656e8aeb9a132df3 (diff) |
block/vdi.c: Fix several bugs
* The code for option '-static' was wrong, so image creation
always created static images.
* Static images created with qemu-img did not set header entry
blocks_allocated.
* The size of the block map must be rounded to the next multiple
of SECTOR_SIZE, otherwise the block map is only read partially
for block map sizes which are not a multiple of SECTOR_SIZE.
Signed-off-by: Stefan Weil <weil@mail.berlios.de>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/vdi.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/block/vdi.c b/block/vdi.c index 4ca8dcb7dc..c9c8890f59 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -437,9 +437,9 @@ static int vdi_open(BlockDriverState *bs, const char *filename, int flags) s->header = header; bmap_size = header.blocks_in_image * sizeof(uint32_t); - s->bmap = qemu_malloc(bmap_size); - if (bdrv_read(s->hd, s->bmap_sector, - (uint8_t *)s->bmap, bmap_size / SECTOR_SIZE) < 0) { + bmap_size = (bmap_size + SECTOR_SIZE - 1) / SECTOR_SIZE; + s->bmap = qemu_malloc(bmap_size * SECTOR_SIZE); + if (bdrv_read(s->hd, s->bmap_sector, (uint8_t *)s->bmap, bmap_size) < 0) { goto fail_free_bmap; } @@ -817,7 +817,9 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options) #endif #if defined(CONFIG_VDI_STATIC_IMAGE) } else if (!strcmp(options->name, BLOCK_OPT_STATIC)) { - image_type = VDI_TYPE_STATIC; + if (options->value.n) { + image_type = VDI_TYPE_STATIC; + } #endif } options++; @@ -845,6 +847,9 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options) header.disk_size = bytes; header.block_size = block_size; header.blocks_in_image = blocks; + if (image_type == VDI_TYPE_STATIC) { + header.blocks_allocated = blocks; + } uuid_generate(header.uuid_image); uuid_generate(header.uuid_last_snap); /* There is no need to set header.uuid_link or header.uuid_parent here. */ |