Date: Tue, 22 Mar 2011 01:40:02 GMT From: Mark Linimon <linimon@lonesome.com> To: freebsd-bugs@FreeBSD.org Subject: [delphij@delphij.net: Re: bin/146205: df(1) fails to display total space on a 100PB?filesystem correctly] Message-ID: <201103220140.p2M1e2lA087993@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/146205; it has been noted by GNATS. From: Mark Linimon <linimon@lonesome.com> To: bug-followup@FreeBSD.org Cc: Subject: [delphij@delphij.net: Re: bin/146205: df(1) fails to display total space on a 100PB?filesystem correctly] Date: Mon, 21 Mar 2011 20:35:17 -0500 ----- Forwarded message from Xin LI <delphij@delphij.net> ----- Date: Mon, 21 Mar 2011 17:44:43 -0700 From: Xin LI <delphij@delphij.net> To: d@delphij.net Cc: Alexander Best <arundel@freebsd.org>, freebsd-bugs@FreeBSD.org Subject: Re: bin/146205: df(1) fails to display total space on a 100PB filesystem correctly -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Revised version, I have mistakenly understood the old code, which only keeps one digit after the dot. Cheers, - -- Xin LI <delphij@delphij.net> http://www.delphij.net/ FreeBSD - The Power to Serve! Live free or die -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.17 (FreeBSD) iQEcBAEBCAAGBQJNh/D6AAoJEATO+BI/yjfBbDoH/25nmc7rQ914Rgfp2iVTBTCo 0J6D29V1tRfqFnzg62zYH23tsoQfcYI/gesx5TyegdCOpR1nOAEUl7T/UA4CmUuh CN54KNQ631WUT/V5Rndf5ikIcAnu7L5IP14RNGUWH5CJhi70OmrbWt3d2XKvLMvO Uhtq+Uhl/NyoGaq2tE9/WyGyeb70Ribzd4zE6hMVSSY9rPKASpCj3oSpAn7ioSms X9MvcUCM/eOQxLMYtq1PN6Dz5GPqewiBfmoOWNGssbYnhqotYpIKNUAkDeKUuFop P940nVkhhiSmsZPGD4W67fgKwXhxzj7Ukw7ru+XOp0z3afK6xxkkUQAvAfGop4g= =mx5z -----END PGP SIGNATURE----- Index: humanize_number.c =================================================================== --- humanize_number.c (revision 219842) +++ humanize_number.c (working copy) @@ -47,8 +47,9 @@ const char *suffix, int scale, int flags) { const char *prefixes, *sep; - int b, i, r, maxscale, s1, s2, sign; + int i, r, maxscale, s1, s2, sign; int64_t divisor, max; + int64_t quotient = bytes, reminder = 0; size_t baselen; assert(buf != NULL); @@ -88,11 +89,10 @@ buf[0] = '\0'; if (bytes < 0) { sign = -1; - bytes *= -100; + quotient = -quotient; baselen = 3; /* sign, digit, prefix */ } else { sign = 1; - bytes *= 100; baselen = 2; /* digit, prefix */ } if (flags & HN_NOSPACE) @@ -109,7 +109,7 @@ if (scale & (HN_AUTOSCALE | HN_GETSCALE)) { /* See if there is additional columns can be used. */ - for (max = 100, i = len - baselen; i-- > 0;) + for (max = 1, i = len - baselen; i-- > 0;) max *= 10; /* @@ -117,29 +117,33 @@ * If there will be an overflow by the rounding below, * divide once more. */ - for (i = 0; bytes >= max - 50 && i < maxscale; i++) - bytes /= divisor; + for (i = 0; quotient > max && i < maxscale; i++) { + reminder = quotient % divisor; + quotient /= divisor; + } if (scale & HN_GETSCALE) return (i); - } else - for (i = 0; i < scale && i < maxscale; i++) - bytes /= divisor; + } else { + for (i = 0; i < scale && i < maxscale; i++) { + reminder = quotient % divisor; + quotient /= divisor; + } + } /* If a value <= 9.9 after rounding and ... */ - if (bytes < 995 && i > 0 && flags & HN_DECIMAL) { + if (quotient == 9 && reminder < 950 && i > 0 && flags & HN_DECIMAL) { /* baselen + \0 + .N */ if (len < baselen + 1 + 2) return (-1); - b = ((int)bytes + 5) / 10; - s1 = b / 10; - s2 = b % 10; + s1 = (int)quotient + (((int)reminder + 50) / 100); + s2 = (((int)reminder + 50) / 10) % 10; r = snprintf(buf, len, "%d%s%d%s%s%s", sign * s1, localeconv()->decimal_point, s2, sep, SCALE2PREFIX(i), suffix); } else r = snprintf(buf, len, "%" PRId64 "%s%s%s", - sign * ((bytes + 50) / 100), + sign * (quotient + (reminder + 50) / 100), sep, SCALE2PREFIX(i), suffix); return (r); _______________________________________________ freebsd-bugs@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-bugs To unsubscribe, send any mail to "freebsd-bugs-unsubscribe@freebsd.org" ----- End forwarded message -----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201103220140.p2M1e2lA087993>