Bug 102694

Summary: df(1) can forget to print the unit with -h
Product: Base System Reporter: Ceri Davies <ceri>
Component: binAssignee: Antoine Brodin <antoine>
Status: Closed FIXED    
Severity: Affects Only Me    
Priority: Normal    
Version: 6.1-STABLE   
Hardware: Any   
OS: Any   

Description Ceri Davies freebsd_committer freebsd_triage 2006-08-30 14:20:22 UTC
	The unit is missing from the Used column here:

	{ceri@shrike}-{~} % df -h /usr/ports
	Filesystem     Size    Used   Avail Capacity  Mounted on
	/dev/ad1s1a    1.1G    1000    104M    91%    /usr/ports
	{ceri@shrike}-{~} % df -k /usr/ports
	Filesystem  1K-blocks    Used  Avail Capacity  Mounted on
	/dev/ad1s1a   1190120 1023920 106696    91%    /usr/ports

Fix: 

Not sure if this is df(1) or libutil's humanize_number(3)
	to be honest.
How-To-Repeat: 	
	Have a filesystem that has used 1000M.  Look at it.
Comment 1 Ricardo Nabinger Sanchez 2006-10-07 03:36:34 UTC
> Not sure if this is df(1) or libutil's humanize_number(3)
> to be honest.

I was looking at it and was able to reproduce it and found what's going on.

What happens is that, for numbers close to the next scale (1000<= x <1024),
the scaled number is big for the 6-char buffer, which in fact is told be be
6-1 bytes.  From the source:

humanize_number(buf, sizeof(buf) - (bytes < 0 ? 0 : 1),
	    bytes, "", HN_AUTOSCALE, flags);

That "sizeof(buf) - (bytes < 0 ? 0 : 1)" causes humanize_number to think that
the buffer has only 5 chars, thus producing:

	[ ][1][0][0][0][\0]

If one remove that restriction, the unit comes back:

	[1][0][0][0][M][\0]

The drawback is that it no longer scales "humanly" for numbers >= 1024, going
up to 9999 (ugly).

I spent a good time trying to figure out a clean and effective solution, but
the best I got was to not use humanize_number, and scale the number locally.

If that is good enough, I can clean up my code and send a patch.

Regards.

-- 
Ricardo Nabinger Sanchez     <rnsanchez@{gmail.com,wait4.org}>
Powered by FreeBSD

  "Left to themselves, things tend to go from bad to worse."
Comment 2 Gleb Smirnoff freebsd_committer freebsd_triage 2006-10-21 10:32:03 UTC
Responsible Changed
From-To: freebsd-bugs->pjd

Since Pawel has changed df(1) to use humanize_number(3) let him ponder 
on this problem.
Comment 3 dfilter service freebsd_committer freebsd_triage 2008-03-08 21:56:07 UTC
antoine     2008-03-08 21:55:59 UTC

  FreeBSD src repository

  Modified files:
    lib/libutil          humanize_number.c 
  Log:
  Merge changes from NetBSD on humanize_number.c, 1.8 -> 1.13
  Significant changes:
  - rev. 1.11: Use PRId64 instead of a cast to long long and %lld to print
  an int64_t.
  - rev. 1.12: Fix a bug that humanize_number() produces "1000" where it
  should be "1.0G" or "1.0M".  The bug reported by Greg Troxel.
  
  PR:             118461
  PR:             102694
  Approved by:    rwatson (mentor)
  Obtained from:  NetBSD
  MFC after:      1 month
  
  Revision  Changes    Path
  1.3       +10 -5     src/lib/libutil/humanize_number.c
_______________________________________________
cvs-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-all
To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
Comment 4 Mark Linimon freebsd_committer freebsd_triage 2008-03-29 01:51:18 UTC
State Changed
From-To: open->patched

Set as MFC reminder and assign to committer. 


Comment 5 Mark Linimon freebsd_committer freebsd_triage 2008-03-29 01:51:18 UTC
Responsible Changed
From-To: pjd->antoine
Comment 6 dfilter service freebsd_committer freebsd_triage 2008-04-20 17:29:05 UTC
antoine     2008-04-20 16:29:01 UTC

  FreeBSD src repository

  Modified files:        (Branch: RELENG_7)
    lib/libutil          humanize_number.c 
  Log:
  MFC to RELENG_7:
    Merge changes from NetBSD on humanize_number.c, 1.8 -> 1.13
    Significant changes:
    - rev. 1.11: Use PRId64 instead of a cast to long long and %lld to print
    an int64_t.
    - rev. 1.12: Fix a bug that humanize_number() produces "1000" where it
    should be "1.0G" or "1.0M".  The bug reported by Greg Troxel.
  
    PR:             118461
    PR:             102694
    Approved by:    rwatson (mentor)
    Obtained from:  NetBSD
    MFC after:      1 month
  
  Revision  Changes    Path
  1.2.10.1  +10 -5     src/lib/libutil/humanize_number.c
_______________________________________________
cvs-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-all
To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
Comment 7 dfilter service freebsd_committer freebsd_triage 2008-04-20 17:32:25 UTC
antoine     2008-04-20 16:32:20 UTC

  FreeBSD src repository

  Modified files:        (Branch: RELENG_6)
    lib/libutil          humanize_number.c 
  Log:
  MFC to RELENG_6:
    Merge changes from NetBSD on humanize_number.c, 1.8 -> 1.13
    Significant changes:
    - rev. 1.11: Use PRId64 instead of a cast to long long and %lld to print
    an int64_t.
    - rev. 1.12: Fix a bug that humanize_number() produces "1000" where it
    should be "1.0G" or "1.0M".  The bug reported by Greg Troxel.
  
    PR:             118461
    PR:             102694
    Approved by:    rwatson (mentor)
    Obtained from:  NetBSD
    MFC after:      1 month
  
  Revision  Changes    Path
  1.2.2.1   +10 -5     src/lib/libutil/humanize_number.c
_______________________________________________
cvs-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-all
To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
Comment 8 Antoine Brodin freebsd_committer freebsd_triage 2008-04-20 17:46:48 UTC
State Changed
From-To: patched->closed

Fixed in HEAD, RELENG_7 and RELENG_6. 
Thanks for the report!