Subject: bin/21061: df gives bogus results for NFS filesystems >1TB
To: None <gnats-bugs@gnats.netbsd.org>
From: None <istvan+nb@redback.com>
List: netbsd-bugs
Date: 04/07/2003 18:33:14
>Number:         21061
>Category:       bin
>Synopsis:       df gives bogus results for NFS filesystems >1TB
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    bin-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Apr 07 18:34:00 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator:     Istvan Marko
>Release:        1.6
>Organization:
Redback Networks
>Environment:
NetBSD dys 1.6 NetBSD 1.6 (DYS) #32: Mon Jan  6 10:30:51 PST 2003     root@oink:/nbsrc16/sys/arch/i386/compile/DYS i386

>Description:
Runnin df on an NFS filesystem larger than 1TB will give bogus output:

% df .
Filesystem                    1K-blocks     Used     Avail Capacity  Mounted on
filer:/home/foo -536870912 -866682164 329811252    79%    /amd/filer/home/foo

note the negative numbers in the output.
>How-To-Repeat:
run df on an NFS filesystem that is larger than 1TB.
>Fix:
The following (ugly) patch makes df work for up to 2TB. A proper fix would require kernel changes I think.

--- /usr/src/bin/df/df.c	Thu Oct 11 09:31:33 2001
+++ df.c	Mon Apr  7 18:23:50 2003
@@ -334,7 +334,7 @@
 	static long blocksize;
 	static int headerlen, timesthrough;
 	static char *header;
-	long used, availblks, inodes;
+	unsigned long used, availblks, inodes;
 	static char *full = "100%";
 
 	if (maxwidth < 11)
@@ -358,12 +358,12 @@
 		(void)printf("  Mounted on\n");
 	}
 	(void)printf("%-*.*s", maxwidth, maxwidth, sfsp->f_mntfromname);
-	used = sfsp->f_blocks - sfsp->f_bfree;
-	availblks = sfsp->f_bavail + used;
-	(void)printf(" %*ld %8ld %9ld", headerlen,
-	    fsbtoblk(sfsp->f_blocks, sfsp->f_bsize, blocksize),
-	    fsbtoblk(used, sfsp->f_bsize, blocksize),
-	    fsbtoblk(sfsp->f_bavail, sfsp->f_bsize, blocksize));
+	used = (unsigned) sfsp->f_blocks - (unsigned) sfsp->f_bfree;
+	availblks = (unsigned) sfsp->f_bavail + used;
+	(void)printf(" %*lu %8u %9lu", headerlen,
+		     fsbtoblk((unsigned) sfsp->f_blocks, sfsp->f_bsize, blocksize),
+	    fsbtoblk((unsigned) used, sfsp->f_bsize, blocksize),
+	    fsbtoblk((unsigned) sfsp->f_bavail, sfsp->f_bsize, blocksize));
 	(void)printf("%7s",
 	    availblks == 0 ? full : strpct((u_long)used, (u_long)availblks, 0));
 	if (iflag) {

>Release-Note:
>Audit-Trail:
>Unformatted: