Skip site navigation (1)Skip section navigation (2)
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>