[U-Boot] [PATCH] disk/part.c: 'usb storage' avoiding overflow when output capacity

Sergei Shtylyov sshtylyov at mvista.com
Sun Aug 8 12:01:10 CEST 2010


Hello.

Sergei Trofimovich wrote:

> Before:
>     Marvell>> usb storage
>       Device 0: Vendor: StoreJet Rev:  Prod:  Transcend
>                 Type: Hard Disk
>                 Capacity: 28759.9 MB = 28.0 GB (488397168 x 512)
> After:
>     Marvell>> usb storage
>       Device 0: Vendor: StoreJet Rev:  Prod:  Transcend
>                 Type: Hard Disk
>                 Capacity: 238475.1 MB = 232.8 GB (488397168 x 512)

> Signed-off-by: Sergei Trofimovich <slyfox at gentoo.org>
> ---
>  disk/part.c |   28 +++++++++++++++++++++++-----
>  1 files changed, 23 insertions(+), 5 deletions(-)

> diff --git a/disk/part.c b/disk/part.c
> index b6bae17..ee5be2b 100644
> --- a/disk/part.c
> +++ b/disk/part.c
> @@ -109,14 +109,31 @@ block_dev_desc_t *get_dev(char* ifname, int dev)
>  /*
>   * reports device info to the user
>   */
> -void dev_print (block_dev_desc_t *dev_desc)
> -{
> +
>  #ifdef CONFIG_LBA48
> -	uint64_t lba512; /* number of blocks if 512bytes block size */
> +typedef uint64_t lba512_t;
>  #else
> -	lbaint_t lba512;
> +typedef lbaint_t lba512_t;
>  #endif
>  
> +/*
> + * Overflowless variant of (block_count * mul_by / div_by)
> + * when div_by > mul_by
> + */
> +static lba512_t lba512_muldiv (lba512_t block_count, lba512_t mul_by, lba512_t div_by)
> +{
> +    lba512_t bc_quot, bc_rem;
> +
> +    /* x * m / d == x / d * m + (x % d) * m / d */
> +    bc_quot = block_count / div_by;
> +    bc_rem  = block_count - div_by * bc_quot;
> +    return bc_quot * mul_by + (bc_rem * mul_by) / div_by;

    Please use tabs to indent the code to match the style of that file.

WBR, Sergei


More information about the U-Boot mailing list