]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/nfsstat/nfsstat.c
nfsstat: add has_stats()
[nfs-utils.git] / utils / nfsstat / nfsstat.c
index 4b45c46b7734e6d8dca0b576cb186513ffca63eb..7e822a7a1efeeccb920c699e327e4ea371175c5c 100644 (file)
@@ -29,6 +29,7 @@ static unsigned int   svcv3info[24];  /* NFSv3 call counts ([0] == 22) */
 static unsigned int    cltv3info[24];  /* NFSv3 call counts ([0] == 22) */
 static unsigned int    svcv4info[4];   /* NFSv4 call counts ([0] == 2) */
 static unsigned int    cltv4info[34];  /* NFSv4 call counts ([0] == 32) */
+static unsigned int    svcv4opinfo[42];/* NFSv4 call counts ([0] == 40) */
 static unsigned int    svcnetinfo[5];  /* 0  # of received packets
                                         * 1  UDP packets
                                         * 2  TCP packets
@@ -99,6 +100,16 @@ static const char * nfscltv4name[32] = {
        "statfs",    "readlink",  "readdir", "server_caps", "delegreturn",
 };
 
+static const char *     nfssvrv4opname[40] = {
+        "op0-unused",   "op1-unused", "op2-future",  "access",     "close",       "commit",
+        "create",       "delegpurge", "delegreturn", "getattr",    "getfh",       "link",
+        "lock",         "lockt",      "locku",       "lookup",     "lookup_root", "nverify",
+        "open",         "openattr",   "open_conf",   "open_dgrd",  "putfh",       "putpubfh",
+        "putrootfh",    "read",       "readdir",     "readlink",   "remove",      "rename",
+        "renew",        "restorefh",  "savefh",      "secinfo",    "setattr",     "setcltid",
+        "setcltidconf", "verify",     "write",       "rellockowner"
+};
+
 typedef struct statinfo {
        char            *tag;
        int             nrvals;
@@ -115,6 +126,7 @@ static statinfo             svcinfo[] = {
        { "proc2",      STRUCTSIZE(svcv2info),  svcv2info  },
        { "proc3",      STRUCTSIZE(svcv3info),  svcv3info  },
        { "proc4",      STRUCTSIZE(svcv4info),  svcv4info  },
+       { "proc4ops",   STRUCTSIZE(svcv4opinfo),svcv4opinfo},
        { NULL,         0,                      NULL       }
 };
 
@@ -137,6 +149,8 @@ static statinfo             *get_stat_info(const char *, struct statinfo *);
 
 static int             mounts(const char *);
 
+static int             has_stats(const unsigned int *);
+
 #define PRNT_CALLS     0x0001
 #define PRNT_RPC       0x0002
 #define PRNT_NET       0x0004
@@ -371,21 +385,26 @@ main(int argc, char **argv)
                        printf("\n");
                }
                if (opt_prt & PRNT_CALLS) {
-                       if ((opt_prt & PRNT_V2) || ((opt_prt & PRNT_AUTO) && svcv2info[0] && svcv2info[svcv2info[0]+1] != svcv2info[0]))
+                       if ((opt_prt & PRNT_V2) || ((opt_prt & PRNT_AUTO) && has_stats(svcv2info)))
                                print_callstats(
                                "Server nfs v2:\n",
                                    nfsv2name, svcv2info + 1, sizeof(nfsv2name)/sizeof(char *)
                                );
-                       if ((opt_prt & PRNT_V3) || ((opt_prt & PRNT_AUTO) && svcv3info[0] && svcv3info[svcv3info[0]+1] != svcv3info[0]))
+                       if ((opt_prt & PRNT_V3) || ((opt_prt & PRNT_AUTO) && has_stats(svcv3info)))
                                print_callstats(
                                "Server nfs v3:\n",
                                nfsv3name, svcv3info + 1, sizeof(nfsv3name)/sizeof(char *)
                                );
-                       if ((opt_prt & PRNT_V4) || ((opt_prt & PRNT_AUTO) && svcv4info[0] && svcv4info[svcv4info[0]+1] != svcv4info[0]))
+                       if ((opt_prt & PRNT_V4) || ((opt_prt & PRNT_AUTO) && has_stats(svcv4info))) {
                                print_callstats(
                                "Server nfs v4:\n",
                                nfssvrv4name, svcv4info + 1, sizeof(nfssvrv4name)/sizeof(char *)
                                );
+                               print_callstats(
+                               "Server nfs v4 operations:\n",
+                               nfssvrv4opname, svcv4opinfo + 1, sizeof(nfssvrv4opname)/sizeof(char *)
+                               );
+                       }
                }
        }
 
@@ -407,17 +426,17 @@ main(int argc, char **argv)
                        printf("\n");
                }
                if (opt_prt & PRNT_CALLS) {
-                       if ((opt_prt & PRNT_V2) || ((opt_prt & PRNT_AUTO) && cltv2info[0] && cltv2info[cltv2info[0]+1] != cltv2info[0]))
+                       if ((opt_prt & PRNT_V2) || ((opt_prt & PRNT_AUTO) && has_stats(cltv2info)))
                                print_callstats(
                                "Client nfs v2:\n",
                                nfsv2name, cltv2info + 1,  sizeof(nfsv2name)/sizeof(char *)
                                );
-                       if ((opt_prt & PRNT_V3) || ((opt_prt & PRNT_AUTO) && cltv3info[0] && cltv3info[cltv3info[0]+1] != cltv3info[0]))
+                       if ((opt_prt & PRNT_V3) || ((opt_prt & PRNT_AUTO) && has_stats(cltv3info)))
                                print_callstats(
                                "Client nfs v3:\n",
                                nfsv3name, cltv3info + 1, sizeof(nfsv3name)/sizeof(char *)
                                );
-                       if ((opt_prt & PRNT_V4) || ((opt_prt & PRNT_AUTO) && cltv4info[0] && cltv4info[cltv4info[0]+1] != cltv4info[0]))
+                       if ((opt_prt & PRNT_V4) || ((opt_prt & PRNT_AUTO) && has_stats(cltv4info)))
                                print_callstats(
                                "Client nfs v4:\n",
                                nfscltv4name, cltv4info + 1,  sizeof(nfscltv4name)/sizeof(char *)
@@ -570,3 +589,9 @@ mounts(const char *name)
        fclose(fp);
        return 1;
 }
+
+static int
+has_stats(const unsigned int *info)
+{
+       return (info[0] && info[info[0] + 1] != info[0]);
+}