qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] block: vpc support for ~2 TB disks


From: Charles Arnold
Subject: Re: [Qemu-devel] [PATCH] block: vpc support for ~2 TB disks
Date: Mon, 12 Nov 2012 12:12:15 -0700

Ping?

Any thoughts on whether this is acceptable?

- Charles

>>> On 10/30/2012 at 08:59 PM, in message <address@hidden>, 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 <address@hidden>
> 
> 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) address@hidden
>          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

[Prev in Thread] Current Thread [Next in Thread]