On Tue, 13 Nov 2012, Paolo Bonzini wrote: > Il 12/11/2012 20:12, Charles Arnold ha scritto: > > Ping? > > > > Any thoughts on whether this is acceptable? > > I would like to know what is done by other platforms. Stefano, any idea > about XenServer? >
I am not sure, but maybe Thanos, that is working on blktap3, knows, or at least knows who to CC. > > - Charles > > > >>>> On 10/30/2012 at 08:59 PM, in message <50a0e561.5b74.009...@suse.com>, > >>>> Charles > > Arnold wrote: > >> The VHD specification allows for up to a 2 TB disk size. The current > >> implementation in qemu emulates EIDE and ATA-2 hardware which only allows > >> for up to 127 GB. This disk size limitation can be overridden by allowing > >> up to 255 heads instead of the normal 4 bit limitation of 16. Doing so > >> allows disk images to be created of up to nearly 2 TB. This change does > >> not violate the VHD format specification nor does it change how smaller > >> disks (ie, <=127GB) are defined. > >> > >> Signed-off-by: Charles Arnold <carn...@suse.com> > >> > >> diff --git a/block/vpc.c b/block/vpc.c > >> index b6bf52f..0c2eaf8 100644 > >> --- a/block/vpc.c > >> +++ b/block/vpc.c > >> @@ -198,7 +198,8 @@ static int vpc_open(BlockDriverState *bs, int flags) > >> bs->total_sectors = (int64_t) > >> be16_to_cpu(footer->cyls) * footer->heads * footer->secs_per_cyl; > >> > >> - if (bs->total_sectors >= 65535 * 16 * 255) { > >> + /* Allow a maximum disk size of approximately 2 TB */ > >> + if (bs->total_sectors >= 65535LL * 255 * 255) {qemu-devel@nongnu.org > >> err = -EFBIG; > >> goto fail; > >> } > >> @@ -524,19 +525,27 @@ static coroutine_fn int > >> vpc_co_write(BlockDriverState > >> *bs, int64_t sector_num, > >> * Note that the geometry doesn't always exactly match total_sectors but > >> * may round it down. > >> * > >> - * Returns 0 on success, -EFBIG if the size is larger than 127 GB > >> + * Returns 0 on success, -EFBIG if the size is larger than ~2 TB. Override > >> + * the hardware EIDE and ATA-2 limit of 16 heads (max disk size of 127 GB) > >> + * and instead allow up to 255 heads. > >> */ > >> static int calculate_geometry(int64_t total_sectors, uint16_t* cyls, > >> uint8_t* heads, uint8_t* secs_per_cyl) > >> { > >> uint32_t cyls_times_heads; > >> > >> - if (total_sectors > 65535 * 16 * 255) > >> + /* Allow a maximum disk size of approximately 2 TB */ > >> + if (total_sectors > 65535LL * 255 * 255) { > >> return -EFBIG; > >> + } > >> > >> if (total_sectors > 65535 * 16 * 63) { > >> *secs_per_cyl = 255; > >> - *heads = 16; > >> + if (total_sectors > 65535 * 16 * 255) { > >> + *heads = 255; > >> + } else { > >> + *heads = 16; > >> + } > >> cyls_times_heads = total_sectors / *secs_per_cyl; > >> } else { > >> *secs_per_cyl = 17; > > > > > > > > >