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: