bin/103682: nfsstat(1) should use %u instead of %d to display NFS stats

Hiroki Sato hrs at FreeBSD.org
Tue Sep 26 08:50:57 PDT 2006


>Number:         103682
>Category:       bin
>Synopsis:       nfsstat(1) should use %u instead of %d to display NFS stats
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Sep 26 15:50:16 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator:     Hiroki Sato
>Release:        FreeBSD 6.1-RELEASE i386
>Organization:
Tokyo University of Science
>Environment:
System: FreeBSD unknown.allbsd.org 6.1-RELEASE FreeBSD 6.1-RELEASE #0: Tue May 16 23:08:51 JST 2006     hrs at unknown.allbsd.org:/usr/obj/usr/src/sys/UNKNOWN  i386

>Description:
	Although nfsstat(1) uses %d in printf() to display the NFS stats,
	on a busy NFS server/client the stat numbers can become more than
	2147483647 (2^31 - 1, 32-bit int case) and negative numbers are
	printed.  The numbers should be interpreted as unsigned int, and
	displayed by using %u instead.

>How-To-Repeat:
	Use nfsstat(1) on a busy NFS server/client.
>Fix:
	A patch is attached.  Also, I think it is better to change members	
	in struct nfsstats/nfsrvstats from int to uint64_t or so if possible.

Index: nfsstat.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/nfsstat/nfsstat.c,v
retrieving revision 1.21
diff -u -r1.21 nfsstat.c
--- nfsstat.c	11 Jul 2004 17:37:33 -0000	1.21
+++ nfsstat.c	26 Sep 2006 14:58:49 -0000
@@ -224,7 +224,7 @@
 		printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
 			"Getattr", "Setattr", "Lookup", "Readlink", "Read",
 			"Write", "Create", "Remove");
-		printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
+		printf("%9u %9u %9u %9u %9u %9u %9u %9u\n",
 			nfsstats.rpccnt[NFSPROC_GETATTR],
 			nfsstats.rpccnt[NFSPROC_SETATTR],
 			nfsstats.rpccnt[NFSPROC_LOOKUP],
@@ -236,7 +236,7 @@
 		printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
 			"Rename", "Link", "Symlink", "Mkdir", "Rmdir",
 			"Readdir", "RdirPlus", "Access");
-		printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
+		printf("%9u %9u %9u %9u %9u %9u %9u %9u\n",
 			nfsstats.rpccnt[NFSPROC_RENAME],
 			nfsstats.rpccnt[NFSPROC_LINK],
 			nfsstats.rpccnt[NFSPROC_SYMLINK],
@@ -247,7 +247,7 @@
 			nfsstats.rpccnt[NFSPROC_ACCESS]);
 		printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
 			"Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit");
-		printf("%9d %9d %9d %9d %9d\n",
+		printf("%9u %9u %9u %9u %9u\n",
 			nfsstats.rpccnt[NFSPROC_MKNOD],
 			nfsstats.rpccnt[NFSPROC_FSSTAT],
 			nfsstats.rpccnt[NFSPROC_FSINFO],
@@ -257,7 +257,7 @@
 		printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
 			"TimedOut", "Invalid", "X Replies", "Retries", 
 			"Requests");
-		printf("%9d %9d %9d %9d %9d\n",
+		printf("%9u %9u %9u %9u %9u\n",
 			nfsstats.rpctimeouts,
 			nfsstats.rpcinvalid,
 			nfsstats.rpcunexpected,
@@ -268,10 +268,10 @@
 			"Attr Hits", "Misses", "Lkup Hits", "Misses");
 		printf(" %9.9s %9.9s %9.9s %9.9s\n",
 			"BioR Hits", "Misses", "BioW Hits", "Misses");
-		printf("%9d %9d %9d %9d",
+		printf("%9u %9u %9u %9u",
 			nfsstats.attrcache_hits, nfsstats.attrcache_misses,
 			nfsstats.lookupcache_hits, nfsstats.lookupcache_misses);
-		printf(" %9d %9d %9d %9d\n",
+		printf(" %9u %9u %9u %9u\n",
 			nfsstats.biocache_reads-nfsstats.read_bios,
 			nfsstats.read_bios,
 			nfsstats.biocache_writes-nfsstats.write_bios,
@@ -279,12 +279,12 @@
 		printf("%9.9s %9.9s %9.9s %9.9s",
 			"BioRLHits", "Misses", "BioD Hits", "Misses");
 		printf(" %9.9s %9.9s\n", "DirE Hits", "Misses");
-		printf("%9d %9d %9d %9d",
+		printf("%9u %9u %9u %9u",
 			nfsstats.biocache_readlinks-nfsstats.readlink_bios,
 			nfsstats.readlink_bios,
 			nfsstats.biocache_readdirs-nfsstats.readdir_bios,
 			nfsstats.readdir_bios);
-		printf(" %9d %9d\n",
+		printf(" %9u %9u\n",
 			nfsstats.direofcache_hits, nfsstats.direofcache_misses);
 	}
 	if (serverOnly && !nfsrvstatsp) {
@@ -296,7 +296,7 @@
 		printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
 			"Getattr", "Setattr", "Lookup", "Readlink", "Read",
 			"Write", "Create", "Remove");
-		printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
+		printf("%9u %9u %9u %9u %9u %9u %9u %9u\n",
 			nfsrvstats.srvrpccnt[NFSPROC_GETATTR],
 			nfsrvstats.srvrpccnt[NFSPROC_SETATTR],
 			nfsrvstats.srvrpccnt[NFSPROC_LOOKUP],
@@ -308,7 +308,7 @@
 		printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
 			"Rename", "Link", "Symlink", "Mkdir", "Rmdir",
 			"Readdir", "RdirPlus", "Access");
-		printf("%9d %9d %9d %9d %9d %9d %9d %9d\n",
+		printf("%9u %9u %9u %9u %9u %9u %9u %9u\n",
 			nfsrvstats.srvrpccnt[NFSPROC_RENAME],
 			nfsrvstats.srvrpccnt[NFSPROC_LINK],
 			nfsrvstats.srvrpccnt[NFSPROC_SYMLINK],
@@ -319,7 +319,7 @@
 			nfsrvstats.srvrpccnt[NFSPROC_ACCESS]);
 		printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
 			"Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit");
-		printf("%9d %9d %9d %9d %9d\n",
+		printf("%9u %9u %9u %9u %9u\n",
 			nfsrvstats.srvrpccnt[NFSPROC_MKNOD],
 			nfsrvstats.srvrpccnt[NFSPROC_FSSTAT],
 			nfsrvstats.srvrpccnt[NFSPROC_FSINFO],
@@ -332,7 +332,7 @@
 		printf("Server Cache Stats:\n");
 		printf("%9.9s %9.9s %9.9s %9.9s\n",
 			"Inprog", "Idem", "Non-idem", "Misses");
-		printf("%9d %9d %9d %9d\n",
+		printf("%9u %9u %9u %9u\n",
 			nfsrvstats.srvcache_inproghits,
 			nfsrvstats.srvcache_idemdonehits,
 			nfsrvstats.srvcache_nonidemdonehits,
@@ -340,7 +340,7 @@
 		printf("Server Write Gathering:\n");
 		printf("%9.9s %9.9s %9.9s\n",
 			"WriteOps", "WriteRPC", "Opsaved");
-		printf("%9d %9d %9d\n",
+		printf("%9u %9u %9u\n",
 			nfsrvstats.srvvop_writes,
 			nfsrvstats.srvrpccnt[NFSPROC_WRITE],
 			nfsrvstats.srvrpccnt[NFSPROC_WRITE] - 

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


More information about the freebsd-bugs mailing list