5.2-RC: odd df(1) output
Mitsuru IWASAKI
iwasaki at jp.FreeBSD.org
Tue Dec 9 21:35:40 PST 2003
Hi, I've found a odd df(1) output when filesystem available space
is negative value.
% df -k /usr
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1g 18084782 16722518 -84518 101% /usr
% df -m /usr
Filesystem 1M-blocks Used Avail Capacity Mounted on
/dev/ad0s1g 17660 16329 36028797018963886 101% /usr
It seems that this happen in case df block size is bigger than
fs block size(eg. df -m on 2048-byte block filesystem).
And we can reproduce the problem with simple program, such as:
----
#include <sys/types.h>
#include <inttypes.h>
int
main()
{
int64_t num = -58420;
uint64_t fsbs = 2048;
u_long bs = 1048576;
printf("%jd\n", (intmax_t)(num) / ((bs) / (fsbs)));
printf("%jd\n", (intmax_t)(num) / (intmax_t)((bs) / (fsbs)));
return 0;
}
----
Quick fix is attached below. Thanks
Index: df.c
===================================================================
RCS file: /home/ncvs/src/bin/df/df.c,v
retrieving revision 1.53
diff -u -r1.53 df.c
--- df.c 12 Nov 2003 21:47:42 -0000 1.53
+++ df.c 10 Dec 2003 05:26:48 -0000
@@ -398,9 +398,15 @@
* Convert statfs returned file system size into BLOCKSIZE units.
* Attempts to avoid overflow for large file systems.
*/
-#define fsbtoblk(num, fsbs, bs) \
- (((fsbs) != 0 && (fsbs) < (bs)) ? \
- (num) / ((bs) / (fsbs)) : (num) * ((fsbs) / (bs)))
+static intmax_t
+fsbtoblk(int64_t num, uint64_t fsbs, u_long bs)
+{
+ if (fsbs != 0 && fsbs < bs) {
+ return (intmax_t)(num / (intmax_t)(bs / fsbs));
+ } else {
+ return (intmax_t)(num * (fsbs / bs));
+ }
+}
/*
* Print out status about a file system.
More information about the freebsd-current
mailing list