Message ID | 1413881486-24710-3-git-send-email-mreitz@redhat.com |
---|---|
State | New |
Headers | show |
On 10/21/2014 02:51 AM, Max Reitz wrote: > The bmap can be rather large (maximum blocks per image count: > 0x3fffffff; the bmap has a size of block_count * sizeof(uint32_t) bytes, > which makes 0xfffffffc bytes) and exceed INT_MAX. Using block layer > functions which take a byte count as an int is therefore not a good > idea. Use bdrv_write()+bdrv_flush() instead of bdrv_pwrite_sync(). > > See: https://bugzilla.redhat.com/show_bug.cgi?id=1154940 > > Signed-off-by: Max Reitz <mreitz@redhat.com> > --- > block/vdi.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) Reviewed-by: Eric Blake <eblake@redhat.com>
diff --git a/block/vdi.c b/block/vdi.c index 19701ee..322efcd 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -783,11 +783,18 @@ static int vdi_create(const char *filename, QemuOpts *opts, Error **errp) bmap[i] = VDI_UNALLOCATED; } } - ret = bdrv_pwrite_sync(bs, offset, bmap, bmap_size); + assert(!(offset % BDRV_SECTOR_SIZE)); + ret = bdrv_write(bs, offset / BDRV_SECTOR_SIZE, (uint8_t *)bmap, + bmap_size / BDRV_SECTOR_SIZE); if (ret < 0) { error_setg(errp, "Error writing bmap to %s", filename); goto exit; } + ret = bdrv_flush(bs); + if (ret < 0) { + error_setg(errp, "Error flushing bmap to %s", filename); + goto exit; + } offset += bmap_size; }
The bmap can be rather large (maximum blocks per image count: 0x3fffffff; the bmap has a size of block_count * sizeof(uint32_t) bytes, which makes 0xfffffffc bytes) and exceed INT_MAX. Using block layer functions which take a byte count as an int is therefore not a good idea. Use bdrv_write()+bdrv_flush() instead of bdrv_pwrite_sync(). See: https://bugzilla.redhat.com/show_bug.cgi?id=1154940 Signed-off-by: Max Reitz <mreitz@redhat.com> --- block/vdi.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)