diff options
author | Sergei Trofimovich <slyfox@gentoo.org> | 2010-08-08 15:05:39 +0300 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2010-08-10 23:08:55 +0200 |
commit | 69a2a4d9a5884a6f2d04a551308980d452b9b349 (patch) | |
tree | b2784e2ad2d08056a8bb904e42c2197c8070e176 /disk/part.c | |
parent | b9d51fbb18097975ff86d3a7b4a21a92a1b345f0 (diff) | |
download | u-boot-69a2a4d9a5884a6f2d04a551308980d452b9b349.tar.gz u-boot-69a2a4d9a5884a6f2d04a551308980d452b9b349.tar.bz2 u-boot-69a2a4d9a5884a6f2d04a551308980d452b9b349.zip |
disk/part.c: 'usb storage' avoiding overflow when output capacity
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@gentoo.org>
Diffstat (limited to 'disk/part.c')
-rw-r--r-- | disk/part.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/disk/part.c b/disk/part.c index b6bae17940..3ba88c7e81 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; +} + +void dev_print (block_dev_desc_t *dev_desc) +{ + lba512_t lba512; /* number of blocks if 512bytes block size */ + if (dev_desc->type == DEV_TYPE_UNKNOWN) { puts ("not available\n"); return; @@ -184,8 +201,9 @@ void dev_print (block_dev_desc_t *dev_desc) lba = dev_desc->lba; lba512 = (lba * (dev_desc->blksz/512)); - mb = (10 * lba512) / 2048; /* 2048 = (1024 * 1024) / 512 MB */ /* round to 1 digit */ + mb = lba512_muldiv(lba512, 10, 2048); /* 2048 = (1024 * 1024) / 512 MB */ + mb_quot = mb / 10; mb_rem = mb - (10 * mb_quot); |