svn commit: r328588 - head/usr.bin/nfsstat

Emmanuel Vadot manu at FreeBSD.org
Tue Jan 30 09:59:53 UTC 2018


Author: manu
Date: Tue Jan 30 09:59:52 2018
New Revision: 328588
URL: https://svnweb.freebsd.org/changeset/base/328588

Log:
  nfsstat: Add libxo output
  
  Add libxo output support
  Merge exp41_intpr and exp_intpr function. The only difference is to print
  NFSV4.1 operations in exp41, add a third arguement to control that.
  printtitle was set to 1 and don't have a switch, add a -q options to control it.
  
  Reviewed by:	bapt
  Sponsored by:	Gandi.net
  Differential Revision:	https://reviews.freebsd.org/D14012

Modified:
  head/usr.bin/nfsstat/Makefile
  head/usr.bin/nfsstat/nfsstat.1
  head/usr.bin/nfsstat/nfsstat.c

Modified: head/usr.bin/nfsstat/Makefile
==============================================================================
--- head/usr.bin/nfsstat/Makefile	Tue Jan 30 04:50:23 2018	(r328587)
+++ head/usr.bin/nfsstat/Makefile	Tue Jan 30 09:59:52 2018	(r328588)
@@ -4,6 +4,6 @@
 PROG=	nfsstat
 CFLAGS+=-DNFS
 
-LIBADD+= devstat
+LIBADD+= devstat xo
 
 .include <bsd.prog.mk>

Modified: head/usr.bin/nfsstat/nfsstat.1
==============================================================================
--- head/usr.bin/nfsstat/nfsstat.1	Tue Jan 30 04:50:23 2018	(r328587)
+++ head/usr.bin/nfsstat/nfsstat.1	Tue Jan 30 09:59:52 2018	(r328588)
@@ -28,7 +28,7 @@
 .\"     From: @(#)nfsstat.1	8.1 (Berkeley) 6/6/93
 .\" $FreeBSD$
 .\"
-.Dd November 23, 2016
+.Dd January 22, 2018
 .Dt NFSSTAT 1
 .Os
 .Sh NAME
@@ -38,6 +38,7 @@
 statistics
 .Sh SYNOPSIS
 .Nm
+.Op Fl -libxo
 .Op Fl cdEemszW
 .Op Fl M Ar core
 .Op Fl N Ar system
@@ -124,6 +125,15 @@ activity for both the client and server at
 second intervals.
 .It Fl z
 Reset statistics after displaying them.
+.It Fl q
+Do not print header
+.It Fl -libxo
+Generate output via
+.Xr libxo 3
+in a selection of different human and machine readable formats.
+See
+.Xr xo_parse_args 3
+for details on command line arguments.
 .El
 .Sh FILES
 .Bl -tag -width ".Pa /boot/kernel/kernel" -compact

Modified: head/usr.bin/nfsstat/nfsstat.c
==============================================================================
--- head/usr.bin/nfsstat/nfsstat.c	Tue Jan 30 04:50:23 2018	(r328587)
+++ head/usr.bin/nfsstat/nfsstat.c	Tue Jan 30 09:59:52 2018	(r328588)
@@ -101,6 +101,8 @@ static const char rcsid[] =
 #include <devstat.h>
 #include <err.h>
 
+#include <libxo/xo.h>
+
 static int widemode = 0;
 static int zflag = 0;
 static int printtitle = 1;
@@ -112,8 +114,7 @@ static void printhdr(int, int, int);
 static void usage(void);
 static char *sperc1(int, int);
 static char *sperc2(int, int);
-static void exp_intpr(int, int);
-static void exp41_intpr(int, int);
+static void exp_intpr(int, int, int);
 static void exp_sidewaysintpr(u_int, int, int, int);
 static void compute_new_stats(struct nfsstatsv1 *cur_stats,
     struct nfsstatsv1 *prev_stats, int curop, long double etime,
@@ -140,6 +141,8 @@ static struct stattypes statstruct[] = {
 
 #define	STAT_TYPE_TO_NFS(stat_type)	statstruct[stat_type].nfs_type
 
+#define	NFSSTAT_XO_VERSION	"1"
+
 int
 main(int argc, char **argv)
 {
@@ -156,7 +159,14 @@ main(int argc, char **argv)
 
 	interval = 0;
 	memf = nlistf = NULL;
-	while ((ch = getopt(argc, argv, "cdEesWM:mN:w:z")) != -1)
+
+	argc = xo_parse_args(argc, argv);
+	if (argc < 0)
+		exit(1);
+
+	xo_set_version(NFSSTAT_XO_VERSION);
+
+	while ((ch = getopt(argc, argv, "cdEesWM:mN:w:zq")) != -1)
 		switch(ch) {
 		case 'M':
 			memf = optarg;
@@ -211,14 +221,17 @@ main(int argc, char **argv)
 			break;
 		case 'E':
 			if (extra_output != 0)
-				errx(1, "-e and -E are mutually exclusive");
+				xo_err(1, "-e and -E are mutually exclusive");
 			extra_output = 2;
 			break;
 		case 'e':
 			if (extra_output != 0)
-				errx(1, "-e and -E are mutually exclusive");
+				xo_err(1, "-e and -E are mutually exclusive");
 			extra_output = 1;
 			break;
+		case 'q':
+			printtitle = 0;
+			break;
 		case '?':
 		default:
 			usage();
@@ -238,19 +251,21 @@ main(int argc, char **argv)
 	}
 #endif
 	if (modfind("nfscommon") < 0)
-		errx(1, "NFS client/server not loaded");
+		xo_err(1, "NFS client/server not loaded");
 
 	if (interval) {
 		exp_sidewaysintpr(interval, clientOnly, serverOnly,
 		    newStats);
 	} else {
-		if (extra_output == 2)
-			exp41_intpr(clientOnly, serverOnly);
-		else if (extra_output == 1)
-			exp_intpr(clientOnly, serverOnly);
+		xo_open_container("nfsstat");
+		if (extra_output != 0)
+			exp_intpr(clientOnly, serverOnly, extra_output - 1);
 		else
 			intpr(clientOnly, serverOnly);
+		xo_close_container("nfsstat");
 	}
+
+	xo_finish();
 	exit(0);
 }
 
@@ -271,14 +286,24 @@ intpr(int clientOnly, int serverOnly)
 	}
 	ext_nfsstats.vers = NFSSTATS_V1;
 	if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0)
-		err(1, "Can't get stats");
+		xo_err(1, "Can't get stats");
 	if (clientOnly) {
-		printf("Client Info:\n");
-		printf("Rpc Counts:\n");
-		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("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n",
+		xo_open_container("clientstats");
+
+		if (printtitle)
+			xo_emit("{T:Client Info:\n");
+
+		xo_open_container("operations");
+		xo_emit("{T:Rpc Counts:}\n");
+
+		xo_emit("{T:Getattr/%13.13s}{T:Setattr/%13.13s}"
+		    "{T:Lookup/%13.13s}{T:Readlink/%13.13s}"
+		    "{T:Read/%13.13s}{T:Write/%13.13s}"
+		  "{T:Create/%13.13s}{T:Remove/%13.13s}\n");
+		xo_emit("{:getattr/%13ju}{:setattr/%13ju}"
+		    "{:lookup/%13ju}{:readlink/%13ju}"
+		    "{:read/%13ju}{:write/%13ju}"
+		    "{:create/%13ju}{:remove/%13ju}\n",
 			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETATTR],
 			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETATTR],
 			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOOKUP],
@@ -287,125 +312,188 @@ intpr(int clientOnly, int serverOnly)
 			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITE],
 			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATE],
 			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_REMOVE]);
-		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("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n",
-			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RENAME],
-			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LINK],
-			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SYMLINK],
-			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKDIR],
-			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RMDIR],
-			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIR],
-			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS],
-			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_ACCESS]);
-		printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
-			"Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit");
-		printf("%9ju %9ju %9ju %9ju %9ju\n",
+
+		xo_emit("{T:Rename/%13.13s}{T:Link/%13.13s}"
+		    "{T:Symlink/%13.13s}{T:Mkdir/%13.13s}"
+		    "{T:Rmdir/%13.13s}{T:Readdir/%13.13s}"
+		  "{T:RdirPlus/%13.13s}{T:Access/%13.13s}\n");
+		xo_emit("{:rename/%13ju}{:link/%13ju}"
+		    "{:symlink/%13ju}{:mkdir/%13ju}"
+		    "{:rmdir/%13ju}{:readdir/%13ju}"
+		    "{:rdirplus/%13ju}{:access/%13ju}\n",
+		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RENAME],
+		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LINK],
+		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SYMLINK],
+		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKDIR],
+		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RMDIR],
+		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIR],
+		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS],
+		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_ACCESS]);
+
+		xo_emit("{T:Mknod/%13.13s}{T:Fsstat/%13.13s}"
+		    "{T:Fsinfo/%13.13s}{T:PathConf/%13.13s}"
+		    "{T:Commit/%13.13s}\n");
+		xo_emit("{:mknod/%13ju}{:fsstat/%13ju}"
+		    "{:fsinfo/%13ju}{:pathconf/%13ju}"
+		    "{:commit/%13ju}\n",
 			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKNOD],
 			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSSTAT],
 			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSINFO],
 			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PATHCONF],
 			(uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMIT]);
-		printf("Rpc Info:\n");
-		printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
-			"TimedOut", "Invalid", "X Replies", "Retries", 
-			"Requests");
-		printf("%9ju %9ju %9ju %9ju %9ju\n",
+
+		xo_close_container("operations");
+
+		xo_open_container("rpcs");
+		xo_emit("{T:Rpc Info:}\n");
+
+		xo_emit("{T:TimedOut/%13.13s}{T:Invalid/%13.13s}"
+		    "{T:X Replies/%13.13s}{T:Retries/%13.13s}"
+		    "{T:Requests/%13.13s}\n");
+		xo_emit("{:timedout/%13ju}{:invalid/%13ju}"
+		    "{:xreplies/%13ju}{:retries/%13ju}"
+		    "{:requests/%13ju}\n",
 			(uintmax_t)ext_nfsstats.rpctimeouts,
 			(uintmax_t)ext_nfsstats.rpcinvalid,
 			(uintmax_t)ext_nfsstats.rpcunexpected,
 			(uintmax_t)ext_nfsstats.rpcretries,
 			(uintmax_t)ext_nfsstats.rpcrequests);
-		printf("Cache Info:\n");
-		printf("%9.9s %9.9s %9.9s %9.9s",
-			"Attr Hits", "Misses", "Lkup Hits", "Misses");
-		printf(" %9.9s %9.9s %9.9s %9.9s\n",
-			"BioR Hits", "Misses", "BioW Hits", "Misses");
-		printf("%9ju %9ju %9ju %9ju",
-			(uintmax_t)ext_nfsstats.attrcache_hits,
-			(uintmax_t)ext_nfsstats.attrcache_misses,
-			(uintmax_t)ext_nfsstats.lookupcache_hits,
-			(uintmax_t)ext_nfsstats.lookupcache_misses);
-		printf(" %9ju %9ju %9ju %9ju\n",
-			(uintmax_t)(ext_nfsstats.biocache_reads -
-			ext_nfsstats.read_bios),
-			(uintmax_t)ext_nfsstats.read_bios,
-			(uintmax_t)(ext_nfsstats.biocache_writes -
-			ext_nfsstats.write_bios),
-			(uintmax_t)ext_nfsstats.write_bios);
-		printf("%9.9s %9.9s %9.9s %9.9s",
-			"BioRLHits", "Misses", "BioD Hits", "Misses");
-		printf(" %9.9s %9.9s %9.9s %9.9s\n", "DirE Hits", "Misses", "Accs Hits", "Misses");
-		printf("%9ju %9ju %9ju %9ju",
-			(uintmax_t)(ext_nfsstats.biocache_readlinks -
-			ext_nfsstats.readlink_bios),
-			(uintmax_t)ext_nfsstats.readlink_bios,
-			(uintmax_t)(ext_nfsstats.biocache_readdirs -
-			ext_nfsstats.readdir_bios),
-			(uintmax_t)ext_nfsstats.readdir_bios);
-		printf(" %9ju %9ju %9ju %9ju\n",
-			(uintmax_t)ext_nfsstats.direofcache_hits,
-			(uintmax_t)ext_nfsstats.direofcache_misses,
-			(uintmax_t)ext_nfsstats.accesscache_hits,
-			(uintmax_t)ext_nfsstats.accesscache_misses);
+		xo_close_container("rpcs");
+
+		xo_open_container("cache");
+		xo_emit("{T:Cache Info:}\n");
+
+		xo_emit("{T:Attr Hits/%13.13s}{T:Attr Misses/%13.13s}"
+		    "{T:Lkup Hits/%13.13s}{T:Lkup Misses/%13.13s}"
+		    "{T:BioR Hits/%13.13s}{T:BioR Misses/%13.13s}"
+		    "{T:BioW Hits/%13.13s}{T:BioW Misses/%13.13s}\n");
+		xo_emit("{:attrhits/%13ju}{:attrmisses/%13ju}"
+		    "{:lkuphits/%13ju}{:lkupmisses/%13ju}"
+		    "{:biorhits/%13ju}{:biormisses/%13ju}"
+		    "{:biowhits/%13ju}{:biowmisses/%13ju}\n",
+		    (uintmax_t)ext_nfsstats.attrcache_hits,
+		    (uintmax_t)ext_nfsstats.attrcache_misses,
+		    (uintmax_t)ext_nfsstats.lookupcache_hits,
+		    (uintmax_t)ext_nfsstats.lookupcache_misses,
+		    (uintmax_t)(ext_nfsstats.biocache_reads -
+		    ext_nfsstats.read_bios),
+		    (uintmax_t)ext_nfsstats.read_bios,
+		    (uintmax_t)(ext_nfsstats.biocache_writes -
+		    ext_nfsstats.write_bios),
+		    (uintmax_t)ext_nfsstats.write_bios);
+
+		xo_emit("{T:BioRL Hits/%13.13s}{T:BioRL Misses/%13.13s}"
+		    "{T:BioD Hits/%13.13s}{T:BioD Misses/%13.13s}"
+		    "{T:DirE Hits/%13.13s}{T:DirE Misses/%13.13s}"
+		    "{T:Accs Hits/%13.13s}{T:Accs Misses/%13.13s}\n");
+		xo_emit("{:biosrlhits/%13ju}{:biorlmisses/%13ju}"
+		    "{:biodhits/%13ju}{:biodmisses/%13ju}"
+		    "{:direhits/%13ju}{:diremisses/%13ju}"
+		    "{:accshits/%13ju}{:accsmisses/%13ju}\n",
+		    (uintmax_t)(ext_nfsstats.biocache_readlinks -
+		    ext_nfsstats.readlink_bios),
+		    (uintmax_t)ext_nfsstats.readlink_bios,
+		    (uintmax_t)(ext_nfsstats.biocache_readdirs -
+		    ext_nfsstats.readdir_bios),
+		    (uintmax_t)ext_nfsstats.readdir_bios,
+		    (uintmax_t)ext_nfsstats.direofcache_hits,
+		    (uintmax_t)ext_nfsstats.direofcache_misses,
+		    (uintmax_t)ext_nfsstats.accesscache_hits,
+		    (uintmax_t)ext_nfsstats.accesscache_misses);
+
+		xo_close_container("cache");
+
+		xo_close_container("clientstats");
 	}
 	if (serverOnly) {
-		printf("\nServer Info:\n");
-		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("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n",
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READLINK],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READ],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATE],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]);
-		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("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n",
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENAME],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LINK],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIR],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]);
-		printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
-			"Mknod", "Fsstat", "Fsinfo", "PathConf", "Commit");
-		printf("%9ju %9ju %9ju %9ju %9ju\n",
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT]);
-		printf("Server Ret-Failed\n");
-		printf("%17ju\n", (uintmax_t)ext_nfsstats.srvrpc_errs);
-		printf("Server Faults\n");
-		printf("%13ju\n", (uintmax_t)ext_nfsstats.srv_errs);
-		printf("Server Cache Stats:\n");
-		printf("%9.9s %9.9s %9.9s %9.9s\n",
-			"Inprog", "Idem", "Non-idem", "Misses");
-		printf("%9ju %9ju %9ju %9ju\n",
-			(uintmax_t)ext_nfsstats.srvcache_inproghits,
-			(uintmax_t)ext_nfsstats.srvcache_idemdonehits,
-			(uintmax_t)ext_nfsstats.srvcache_nonidemdonehits,
-			(uintmax_t)ext_nfsstats.srvcache_misses);
-		printf("Server Write Gathering:\n");
-		printf("%9.9s %9.9s %9.9s\n",
-			"WriteOps", "WriteRPC", "Opsaved");
+		xo_open_container("serverstats");
+
+		xo_emit("{T:Server Info:}\n");
+		xo_open_container("operations");
+
+		xo_emit("{T:Getattr/%13.13s}{T:Setattr/%13.13s}"
+		    "{T:Lookup/%13.13s}{T:Readlink/%13.13s}"
+		    "{T:Read/%13.13s}{T:Write/%13.13s}"
+		    "{T:Create/%13.13s}{T:Remove/%13.13s}\n");
+		xo_emit("{:getattr/%13ju}{:setattr/%13ju}"
+		    "{:lookup/%13ju}{:readlink/%13ju}"
+		    "{:read/%13ju}{:write/%13ju}"
+		    "{:create/%13ju}{:remove/%13ju}\n",
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READLINK],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READ],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATE],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]);
+
+		xo_emit("{T:Rename/%13.13s}{T:Link/%13.13s}"
+		    "{T:Symlink/%13.13s}{T:Mkdir/%13.13s}"
+		    "{T:Rmdir/%13.13s}{T:Readdir/%13.13s}"
+		    "{T:RdirPlus/%13.13s}{T:Access/%13.13s}\n");
+		xo_emit("{:rename/%13ju}{:link/%13ju}"
+		    "{:symlink/%13ju}{:mkdir/%13ju}"
+		    "{:rmdir/%13ju}{:readdir/%13ju}"
+		    "{:rdirplus/%13ju}{:access/%13ju}\n",
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENAME],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LINK],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIR],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]);
+
+		xo_emit("{T:Mknod/%13.13s}{T:Fsstat/%13.13s}"
+		    "{T:Fsinfo/%13.13s}{T:PathConf/%13.13s}"
+		    "{T:Commit/%13.13s}\n");
+		xo_emit("{:mknod/%13ju}{:fsstat/%13ju}"
+		    "{:fsinfo/%13ju}{:pathconf/%13ju}"
+		    "{:commit/%13ju}\n",
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT]);
+
+		xo_close_container("operations");
+
+		xo_open_container("server");
+		xo_emit("{T:Server Re-Failed:}\n");
+		xo_emit("{T:retfailed/%17ju}\n", (uintmax_t)ext_nfsstats.srvrpc_errs);
+
+		xo_emit("{T:Server Faults:}\n");
+		xo_emit("{T:faults/%13ju}\n", (uintmax_t)ext_nfsstats.srv_errs);
+
+		xo_emit("{T:Server Write Gathering:/%13.13s}\n");
+
+		xo_emit("{T:WriteOps/%13.13s}{T:WriteRPC/%13.13s}"
+		    "{T:Opsaved/%13.13s}\n");
+		xo_emit("{:writeops/%13ju}{:writerpc/%13ju}"
+		    "{:opsaved/%13ju}\n",
 		/*
 		 * The new client doesn't do write gathering. It was
 		 * only useful for NFSv2.
 		 */
-		printf("%9ju %9ju %9d\n",
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE],
-			(uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 0);
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE],
+		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE], 0);
+
+		xo_close_container("server");
+
+		xo_open_container("cache");
+		xo_emit("{T:Server Cache Stats:/%13.13s}\n");
+		xo_emit("{T:Inprog/%13.13s}{T:Idem/%13.13s}"
+		    "{T:Non-Idem/%13.13s}{T:Misses/%13.13s}\n");
+		xo_emit("{:inprog/%13ju}{:idem/%13ju}"
+		    "{:nonidem/%13ju}{:misses/%13ju}\n",
+			(uintmax_t)ext_nfsstats.srvcache_inproghits,
+			(uintmax_t)ext_nfsstats.srvcache_idemdonehits,
+			(uintmax_t)ext_nfsstats.srvcache_nonidemdonehits,
+			(uintmax_t)ext_nfsstats.srvcache_misses);
+		xo_close_container("cache");
+
+		xo_close_container("serverstats");
 	}
 }
 
@@ -550,270 +638,16 @@ compute_new_stats(struct nfsstatsv1 *cur_stats,
 }
 
 /*
- * Print a description of the nfs stats for the experimental client/server.
- */
-static void
-exp_intpr(int clientOnly, int serverOnly)
-{
-	int nfssvc_flag;
-
-	nfssvc_flag = NFSSVC_GETSTATS | NFSSVC_NEWSTRUCT;
-	if (zflag != 0) {
-		if (clientOnly != 0)
-			nfssvc_flag |= NFSSVC_ZEROCLTSTATS;
-		if (serverOnly != 0)
-			nfssvc_flag |= NFSSVC_ZEROSRVSTATS;
-	}
-	ext_nfsstats.vers = NFSSTATS_V1;
-	if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0)
-		err(1, "Can't get stats");
-	if (clientOnly != 0) {
-		if (printtitle) {
-			printf("Client Info:\n");
-			printf("Rpc Counts:\n");
-			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("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETATTR],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETATTR],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOOKUP],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READLINK],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READ],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITE],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATE],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_REMOVE]);
-		if (printtitle)
-			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("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RENAME],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LINK],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SYMLINK],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKDIR],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RMDIR],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIR],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_ACCESS]);
-		if (printtitle)
-			printf(
-			    "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
-			    , "Mknod", "Fsstat", "Fsinfo", "PathConf",
-			    "Commit", "SetClId", "SetClIdCf", "Lock");
-		printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKNOD],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSSTAT],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSINFO],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PATHCONF],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMIT],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCK]);
-		if (printtitle)
-			printf("%9.9s %9.9s %9.9s %9.9s\n",
-			    "LockT", "LockU", "Open", "OpenCfr");
-		printf("%9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKT],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKU],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPEN],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]);
-		if (printtitle)
-			printf(
-			    "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
-			    , "OpenOwner", "Opens", "LockOwner",
-			    "Locks", "Delegs", "LocalOwn",
-			    "LocalOpen", "LocalLOwn");
-		printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.clopenowners,
-		    (uintmax_t)ext_nfsstats.clopens,
-		    (uintmax_t)ext_nfsstats.cllockowners,
-		    (uintmax_t)ext_nfsstats.cllocks,
-		    (uintmax_t)ext_nfsstats.cldelegates,
-		    (uintmax_t)ext_nfsstats.cllocalopenowners,
-		    (uintmax_t)ext_nfsstats.cllocalopens,
-		    (uintmax_t)ext_nfsstats.cllocallockowners);
-		if (printtitle)
-			printf("%9.9s\n", "LocalLock");
-		printf("%9ju\n", (uintmax_t)ext_nfsstats.cllocallocks);
-		if (printtitle) {
-			printf("Rpc Info:\n");
-			printf("%9.9s %9.9s %9.9s %9.9s %9.9s\n",
-			    "TimedOut", "Invalid", "X Replies", "Retries",
-			    "Requests");
-		}
-		printf("%9ju %9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.rpctimeouts,
-		    (uintmax_t)ext_nfsstats.rpcinvalid,
-		    (uintmax_t)ext_nfsstats.rpcunexpected,
-		    (uintmax_t)ext_nfsstats.rpcretries,
-		    (uintmax_t)ext_nfsstats.rpcrequests);
-		if (printtitle) {
-			printf("Cache Info:\n");
-			printf("%9.9s %9.9s %9.9s %9.9s",
-			    "Attr Hits", "Misses", "Lkup Hits", "Misses");
-			printf(" %9.9s %9.9s %9.9s %9.9s\n",
-			    "BioR Hits", "Misses", "BioW Hits", "Misses");
-		}
-		printf("%9ju %9ju %9ju %9ju",
-		    (uintmax_t)ext_nfsstats.attrcache_hits,
-		    (uintmax_t)ext_nfsstats.attrcache_misses,
-		    (uintmax_t)ext_nfsstats.lookupcache_hits,
-		    (uintmax_t)ext_nfsstats.lookupcache_misses);
-		printf(" %9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)(ext_nfsstats.biocache_reads -
-		    ext_nfsstats.read_bios),
-		    (uintmax_t)ext_nfsstats.read_bios,
-		    (uintmax_t)(ext_nfsstats.biocache_writes -
-		    ext_nfsstats.write_bios),
-		    (uintmax_t)ext_nfsstats.write_bios);
-		if (printtitle) {
-			printf("%9.9s %9.9s %9.9s %9.9s",
-			    "BioRLHits", "Misses", "BioD Hits", "Misses");
-			printf(" %9.9s %9.9s\n", "DirE Hits", "Misses");
-		}
-		printf("%9ju %9ju %9ju %9ju",
-		    (uintmax_t)(ext_nfsstats.biocache_readlinks -
-		    ext_nfsstats.readlink_bios),
-		    (uintmax_t)ext_nfsstats.readlink_bios,
-		    (uintmax_t)(ext_nfsstats.biocache_readdirs -
-		    ext_nfsstats.readdir_bios),
-		    (uintmax_t)ext_nfsstats.readdir_bios);
-		printf(" %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.direofcache_hits,
-		    (uintmax_t)ext_nfsstats.direofcache_misses);
-	}
-	if (serverOnly != 0) {
-		if (printtitle) {
-			printf("\nServer Info:\n");
-			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("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETATTR],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETATTR],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUP],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READLINK],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READ],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_WRITE],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_V3CREATE],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_REMOVE]);
-		if (printtitle)
-			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("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENAME],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LINK],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SYMLINK],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKDIR],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RMDIR],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIR],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_READDIRPLUS],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_ACCESS]);
-		if (printtitle)
-			printf(
-			    "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
-			    , "Mknod", "Fsstat", "Fsinfo", "PathConf",
-			    "Commit", "LookupP", "SetClId", "SetClIdCf");
-		printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_MKNOD],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSSTAT],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_FSINFO],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PATHCONF],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_COMMIT],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOOKUPP],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTID],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SETCLIENTIDCFRM]);
-		if (printtitle)
-			printf(
-			    "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
-			    , "Open", "OpenAttr", "OpenDwnGr", "OpenCfrm",
-			    "DelePurge", "DeleRet", "GetFH", "Lock");
-		printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPEN],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENATTR],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENDOWNGRADE],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_OPENCONFIRM],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DELEGPURGE],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_DELEGRETURN],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_GETFH],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCK]);
-		if (printtitle)
-			printf(
-			    "%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n"
-			    , "LockT", "LockU", "Close", "Verify", "NVerify",
-			    "PutFH", "PutPubFH", "PutRootFH");
-		printf("%9ju %9ju %9ju %9ju %9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCKT],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_LOCKU],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CLOSE],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_VERIFY],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_NVERIFY],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTFH],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTPUBFH],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_PUTROOTFH]);
-		if (printtitle)
-			printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
-			    "Renew", "RestoreFH", "SaveFH", "Secinfo",
-			    "RelLckOwn", "V4Create");
-		printf("%9ju %9ju %9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RENEW],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RESTOREFH],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SAVEFH],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_SECINFO],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_RELEASELCKOWN],
-		    (uintmax_t)ext_nfsstats.srvrpccnt[NFSV4OP_CREATE]);
-		if (printtitle) {
-			printf("Server:\n");
-			printf("%9.9s %9.9s %9.9s\n",
-			    "Retfailed", "Faults", "Clients");
-		}
-		printf("%9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.srv_errs,
-		    (uintmax_t)ext_nfsstats.srvrpc_errs,
-		    (uintmax_t)ext_nfsstats.srvclients);
-		if (printtitle)
-			printf("%9.9s %9.9s %9.9s %9.9s %9.9s \n",
-			    "OpenOwner", "Opens", "LockOwner",
-			    "Locks", "Delegs");
-		printf("%9ju %9ju %9ju %9ju %9ju \n",
-		    (uintmax_t)ext_nfsstats.srvopenowners,
-		    (uintmax_t)ext_nfsstats.srvopens,
-		    (uintmax_t)ext_nfsstats.srvlockowners,
-		    (uintmax_t)ext_nfsstats.srvlocks,
-		    (uintmax_t)ext_nfsstats.srvdelegates);
-		if (printtitle) {
-			printf("Server Cache Stats:\n");
-			printf("%9.9s %9.9s %9.9s %9.9s %9.9s %9.9s\n",
-			    "Inprog", "Idem", "Non-idem", "Misses", 
-			    "CacheSize", "TCPPeak");
-		}
-		printf("%9ju %9ju %9ju %9ju %9ju %9ju\n",
-		    (uintmax_t)ext_nfsstats.srvcache_inproghits,
-		    (uintmax_t)ext_nfsstats.srvcache_idemdonehits,
-		    (uintmax_t)ext_nfsstats.srvcache_nonidemdonehits,
-		    (uintmax_t)ext_nfsstats.srvcache_misses,
-		    (uintmax_t)ext_nfsstats.srvcache_size,
-		    (uintmax_t)ext_nfsstats.srvcache_tcppeak);
-	}
-}
-
-/*
  * Print a description of the nfs stats for the client/server,
  * including NFSv4.1.
  */
 static void
-exp41_intpr(int clientOnly, int serverOnly)
+exp_intpr(int clientOnly, int serverOnly, int nfs41)
 {
 	int nfssvc_flag;
 
+	xo_open_container("nfsv4");
+
 	nfssvc_flag = NFSSVC_GETSTATS | NFSSVC_NEWSTRUCT;
 	if (zflag != 0) {
 		if (clientOnly != 0)
@@ -823,349 +657,387 @@ exp41_intpr(int clientOnly, int serverOnly)
 	}
 	ext_nfsstats.vers = NFSSTATS_V1;
 	if (nfssvc(nfssvc_flag, &ext_nfsstats) < 0)
-		err(1, "Can't get stats");
+		xo_err(1, "Can't get stats");
 	if (clientOnly != 0) {
+		xo_open_container("clientstats");
+
+		xo_open_container("operations");
 		if (printtitle) {
-			printf("Client Info:\n");
-			printf("RPC Counts:\n");
-			printf(
-			    "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n",
-			    "Getattr", "Setattr", "Lookup", "Readlink", "Read",
-			    "Write");
+			xo_emit("{T:Client Info:}\n");
+			xo_emit("{T:RPC Counts:}\n");
 		}
-		printf("%12ju %12ju %12ju %12ju %12ju %12ju\n",
+		xo_emit("{T:Getattr/%13.13s}{T:Setattr/%13.13s}"
+		    "{T:Lookup/%13.13s}{T:Readlink/%13.13s}"
+		    "{T:Read/%13.13s}{T:Write/%13.13s}\n");
+		xo_emit("{:getattr/%13ju}{:setattr/%13ju}{:lookup/%13ju}"
+		    "{:readlink/%13ju}{:read/%13ju}{:write/%13ju}\n",
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETATTR],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETATTR],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOOKUP],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READLINK],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READ],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITE]);
-		if (printtitle)
-			printf(
-			    "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n",
-			    "Create", "Remove", "Rename", "Link", "Symlink",
-			    "Mkdir");
-		printf("%12ju %12ju %12ju %12ju %12ju %12ju\n",
+		xo_emit("{T:Create/%13.13s}{T:Remove/%13.13s}"
+		    "{T:Rename/%13.13s}{T:Link/%13.13s}"
+		    "{T:Symlink/%13.13s}{T:Mkdir/%13.13s}\n");
+		xo_emit("{:create/%13ju}{:remove/%13ju}{:rename/%13ju}"
+		  "{:link/%13ju}{:symlink/%13ju}{:mkdir/%13ju}\n",
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATE],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_REMOVE],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RENAME],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LINK],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SYMLINK],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKDIR]);
-		if (printtitle)
-			printf(
-			    "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n",
-			    "Rmdir", "Readdir", "RdirPlus", "Access", "Mknod",
-			    "Fsstat");
-		printf("%12ju %12ju %12ju %12ju %12ju %12ju\n",
+		xo_emit("{T:Rmdir/%13.13s}{T:Readdir/%13.13s}"
+		    "{T:RdirPlus/%13.13s}{T:Access/%13.13s}"
+		    "{T:Mknod/%13.13s}{T:Fsstat/%13.13s}\n");
+		xo_emit("{:rmdir/%13ju}{:readdir/%13ju}{:rdirplus/%13ju}"
+		    "{:access/%13ju}{:mknod/%13ju}{:fsstat/%13ju}\n",
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RMDIR],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIR],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDIRPLUS],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_ACCESS],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_MKNOD],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSSTAT]);
-		if (printtitle)
-			printf(
-			    "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n",
-			    "Fsinfo", "PathConf", "Commit", "SetClId",
-			    "SetClIdCf", "Lock");
-		printf("%12ju %12ju %12ju %12ju %12ju %12ju\n",
+		xo_emit("{T:FSinfo/%13.13s}{T:pathConf/%13.13s}"
+		    "{T:Commit/%13.13s}{T:SetClId/%13.13s}"
+		    "{T:SetClIdCf/%13.13s}{T:Lock/%13.13s}\n");
+		xo_emit("{:fsinfo/%13ju}{:pathconf/%13ju}{:commit/%13ju}"
+		    "{:setclientid/%13ju}{:setclientidcf/%13ju}{:lock/%13ju}\n",
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FSINFO],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PATHCONF],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMIT],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTID],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETCLIENTIDCFRM],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCK]);
-		if (printtitle)
-			printf(
-			    "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n",
-			    "LockT", "LockU", "Open", "OpenCfr", "OpenDownGr",
-			    "Close");
-		printf("%12ju %12ju %12ju %12ju %12ju %12ju\n",
+		xo_emit("{T:LockT/%13.13s}{T:LockU/%13.13s}"
+		    "{T:Open/%13.13s}{T:OpenCfr/%13.13s}\n");
+		xo_emit("{:lockt/%13ju}{:locku/%13ju}"
+		    "{:open/%13ju}{:opencfr/%13ju}\n",
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKT],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LOCKU],
 		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPEN],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENDOWNGRADE],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CLOSE]);
-		if (printtitle)
-			printf(
-			    "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n",
-			    "RelLckOwn", "FreeStateID", "PutRootFH", "DelegRet",
-			    "GetACL", "SetACL");
-		printf("%12ju %12ju %12ju %12ju %12ju %12ju\n",
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RELEASELCKOWN],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FREESTATEID],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PUTROOTFH],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DELEGRETURN],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETACL],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETACL]);
-		if (printtitle)
-			printf(
-			    "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n",
-			    "ExchangeID", "CreateSess", "DestroySess",
-			    "DestroyClId", "LayoutGet", "GetDevInfo");
-		printf("%12ju %12ju %12ju %12ju %12ju %12ju\n",
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_EXCHANGEID],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATESESSION],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DESTROYSESSION],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DESTROYCLIENT],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTGET],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETDEVICEINFO]);
-		if (printtitle)
-			printf(
-			    "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n",
-			    "LayoutCommit", "LayoutReturn", "ReclaimCompl",
-			    "ReadDataS", "WriteDataS", "CommitDataS");
-		printf("%12ju %12ju %12ju %12ju %12ju %12ju\n",
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTCOMMIT],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTRETURN],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RECLAIMCOMPL],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDS],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITEDS],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMITDS]);
-		if (printtitle)
-			printf(
-			    "%12.12s %12.12s\n",
-			    "OpenLayout", "CreateLayout");
-		printf("%12ju %12ju\n",
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENLAYGET],
-		    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATELAYGET]);
-		if (printtitle)
-			printf(
-			    "%12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n",
-			    "OpenOwner", "Opens", "LockOwner", "Locks",
-			    "Delegs", "LocalOwn");
-		printf("%12ju %12ju %12ju %12ju %12ju %12ju\n",
+		  (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENCONFIRM]);
+
+		if (nfs41) {
+			xo_open_container("nfsv41");
+
+			xo_emit("{T:OpenDownGr/%13.13s}{T:Close/%13.13s}\n");
+			xo_emit("{:opendowngr/%13ju}{:close/%13ju}\n",
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENDOWNGRADE],
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CLOSE]);
+
+			xo_emit("{T:RelLckOwn/%13.13s}{T:FreeStateID/%13.13s}"
+			    "{T:PutRootFH/%13.13s}{T:DelegRet/%13.13s}"
+			    "{T:GetAcl/%13.13s}{T:SetAcl/%13.13s}\n");
+			xo_emit("{:rellckown/%13ju}{:freestateid/%13ju}"
+			    "{:getacl/%13ju}{:delegret/%13ju}"
+			    "{:getacl/%13ju}{:setacl/%13ju}\n",
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RELEASELCKOWN],
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_FREESTATEID],
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_PUTROOTFH],
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DELEGRETURN],
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETACL],
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_SETACL]);
+
+			xo_emit("{T:ExchangeId/%13.13s}{T:CreateSess/%13.13s}"
+			    "{T:DestroySess/%13.13s}{T:DestroyClId/%13.13s}"
+			    "{T:LayoutGet/%13.13s}{T:GetDevInfo/%13.13s}\n");
+			xo_emit("{:exchangeid/%13ju}{:createsess/%13ju}"
+			    "{:destroysess/%13ju}{:destroyclid/%13ju}"
+			    "{:layoutget/%13ju}{:getdevinfo/%13ju}\n",
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_EXCHANGEID],
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATESESSION],
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DESTROYSESSION],
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_DESTROYCLIENT],
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTGET],
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_GETDEVICEINFO]);
+
+			xo_emit("{T:LayoutCommit/%13.13s}{T:LayoutReturn/%13.13s}"
+			    "{T:ReclaimCompl/%13.13s}{T:ReadDataS/%13.13s}"
+			    "{T:WriteDataS/%13.13s}{T:CommitDataS/%13.13s}\n");
+			xo_emit("{:layoutcomit/%13ju}{:layoutreturn/%13ju}"
+			    "{:reclaimcompl/%13ju}{:readdatas/%13ju}"
+			    "{:writedatas/%13ju}{:commitdatas/%13ju}\n",
+			  (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTCOMMIT],
+			  (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_LAYOUTRETURN],
+			  (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_RECLAIMCOMPL],
+			  (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_READDS],
+			  (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_WRITEDS],
+			  (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_COMMITDS]);
+
+			xo_emit("{T:OpenLayout/%13.13s}{T:CreateLayout/%13.13s}\n");
+			xo_emit("{:openlayout/%13ju}{:createlayout/%13ju}\n",
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_OPENLAYGET],
+			    (uintmax_t)ext_nfsstats.rpccnt[NFSPROC_CREATELAYGET]);
+
+			xo_close_container("nfsv41");
+		}
+		xo_close_container("operations");
+
+		xo_open_container("client");
+		xo_emit("{T:OpenOwner/%13.13s}{T:Opens/%13.13s}"
+		    "{T:LockOwner/%13.13s}{T:Locks/%13.13s}"
+		    "{T:Delegs/%13.13s}{T:LocalOwn/%13.13s}\n");
+		xo_emit("{:openowner/%13ju}{:opens/%13ju}"
+		    "{:lockowner/%13ju}{:locks/%13ju}"
+		    "{:delegs/%13ju}{:localown/%13ju}\n",
 		    (uintmax_t)ext_nfsstats.clopenowners,
 		    (uintmax_t)ext_nfsstats.clopens,
 		    (uintmax_t)ext_nfsstats.cllockowners,
 		    (uintmax_t)ext_nfsstats.cllocks,
 		    (uintmax_t)ext_nfsstats.cldelegates,
 		    (uintmax_t)ext_nfsstats.cllocalopenowners);
-		if (printtitle)
-			printf("%12.12s %12.12s %12.12s\n",
-			    "LocalOpen", "LocalLOwn", "LocalLock");
-		printf("%12ju %12ju %12ju\n",
+
+		xo_emit("{T:LocalOpen/%13.13s}{T:LocalLown/%13.13s}"
+		    "{T:LocalLock\n");
+		xo_emit("{:localopen/%13ju}{:locallown/%13ju}"
+		    "{:locallock/%13ju}\n",
 		    (uintmax_t)ext_nfsstats.cllocalopens,
 		    (uintmax_t)ext_nfsstats.cllocallockowners,
 		    (uintmax_t)ext_nfsstats.cllocallocks);
-		if (printtitle) {
-			printf("Rpc Info:\n");
-			printf("%12.12s %12.12s %12.12s %12.12s %12.12s\n",
-			    "TimedOut", "Invalid", "X Replies", "Retries",
-			    "Requests");
-		}
-		printf("%12ju %12ju %12ju %12ju %12ju\n",
+		xo_close_container("client");
+
+		xo_open_container("rpc");
+		if (printtitle)
+			xo_emit("{T:Rpc Info:}\n");
+		xo_emit("{T:TimedOut/%13.13s}{T:Invalid/%13.13s}"
+		    "{T:X Replies/%13.13s}{T:Retries/%13.13s}"
+		    "{T:Requests/%13.13s}\n");
+		xo_emit("{:timedout/%13ju}{:invalid/%13ju}"
+		    "{:xreplies/%13ju}{:retries/%13ju}"
+		    "{:requests/%13ju}\n",
 		    (uintmax_t)ext_nfsstats.rpctimeouts,
 		    (uintmax_t)ext_nfsstats.rpcinvalid,
 		    (uintmax_t)ext_nfsstats.rpcunexpected,
 		    (uintmax_t)ext_nfsstats.rpcretries,
 		    (uintmax_t)ext_nfsstats.rpcrequests);
-		if (printtitle) {
-			printf("Cache Info:\n");
-			printf("%12.12s %12.12s %12.12s %12.12s\n",
-			    "Attr Hits", "Misses", "Lkup Hits", "Misses");
-		}
-		printf("%12ju %12ju %12ju %12ju\n",
+		xo_close_container("rpc");
+
+		xo_open_container("cache");
+		if (printtitle)

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-head mailing list