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;
> > 
> > 
> > 
> > 
> 

Reply via email to