Neil, will you take the patch in this bugreport for the next version?

http://bugs.debian.org/763917.

Thanks,

/mjt

On Fri, 3 Oct 2014 20:24:54 +0200 Jan Echternach <j...@goneko.de> wrote:
> Package: mdadm
> Version: 3.3.2-1
> Severity: minor
> Tags: patch
> 
> 
> While setting up a new system, I noticed an incorrect value in the output
> of mdadm --examine:
> 
>  Avail Dev Size : 2095080 (1023.16 MiB 1072.68 MB)
> 
> The 1023.16 MiB were quite irritating because the underlying partition has
> a size of exactly 1023 MiB.
> 
> The number of sectors seems plausible: 2095080 sectors * 512 bytes/sector
> are 1022.988 MiB or 1072.681 MB. I looked into the code and found an
> inaccuracy in human_size() and human_size_brief(). The formula used for
> the MiB value is essentially
> 
>   long cMiB = (bytes / ( (1LL<<20) / 200LL ) +1) /2;
> 
> but (1LL<<20) / 200LL is not an integer. It's rounded down and cMiB becomes
> too large. The quick fix would have been multiplying by 200 before dividing
> by 1<<20, but that might cause integer overflows in the GiB case.
> 
> The following patch uses a more complicated formula that computes the
> fractional portion separately from the integer portion. It also changes some
> longs to long longs to eliminate a different cause of integer overflows.
> 
> 
> --- mdadm-3.3.2/util.c        2014-10-03 19:06:51.000000000 +0200
> +++ mdadm-3.3.2/util.c        2014-10-03 19:08:06.000000000 +0200
> @@ -671,15 +671,17 @@
>       if (bytes < 5000*1024)
>               buf[0] = 0;
>       else if (bytes < 2*1024LL*1024LL*1024LL) {
> -             long cMiB = (bytes / ( (1LL<<20) / 200LL ) +1) /2;
> +             long cMiB = bytes / (1LL<<20) * 100
> +                         + ((bytes % (1LL<<20)) * 200 / (1LL<<20) +1) /2;
>               long cMB  = (bytes / ( 1000000LL / 200LL ) +1) /2;
>               snprintf(buf, sizeof(buf), " (%ld.%02ld MiB %ld.%02ld MB)",
>                       cMiB/100 , cMiB % 100,
>                       cMB/100, cMB % 100);
>       } else {
> -             long cGiB = (bytes / ( (1LL<<30) / 200LL ) +1) /2;
> -             long cGB  = (bytes / (1000000000LL/200LL ) +1) /2;
> -             snprintf(buf, sizeof(buf), " (%ld.%02ld GiB %ld.%02ld GB)",
> +             long long cGiB = bytes / (1LL<<30) * 100
> +                              + ((bytes % (1LL<<30)) * 200 / (1LL<<30) +1) 
> /2;
> +             long long cGB  = (bytes / (1000000000LL/200LL ) +1) /2;
> +             snprintf(buf, sizeof(buf), " (%lld.%02lld GiB %lld.%02lld GB)",
>                       cGiB/100 , cGiB % 100,
>                       cGB/100, cGB % 100);
>       }
> @@ -706,12 +708,14 @@
>               buf[0] = 0;
>       else if (prefix == IEC) {
>               if (bytes < 2*1024LL*1024LL*1024LL) {
> -                     long cMiB = (bytes / ( (1LL<<20) / 200LL ) +1) /2;
> +                     long cMiB = bytes / (1LL<<20) * 100


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to