1 /* $OpenBSD: nfs.c,v 1.8 2019/06/28 13:35:04 deraadt Exp $ */ 2 3 /* 4 * Copyright (c) 2009 Jasper Lievisse Adriaanse <jasper@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 * 18 */ 19 20 #include <sys/types.h> 21 #include <sys/mount.h> 22 #include <sys/signal.h> 23 #include <sys/sysctl.h> 24 #include <sys/types.h> 25 #include <nfs/rpcv2.h> 26 #include <nfs/nfsproto.h> 27 #include <nfs/nfs.h> 28 29 #include <err.h> 30 #include <errno.h> 31 #include <stdio.h> 32 #include <stdlib.h> 33 #include <string.h> 34 35 #include "systat.h" 36 37 int check_nfs(void); 38 int select_client(void); 39 int select_server(void); 40 int read_nfs(void); 41 void print_client(void); 42 void print_server(void); 43 44 struct nfsstats nfsstats; 45 int num_client = 0; 46 int num_server = 0; 47 48 field_def fields_nfs[] = { 49 /* Client */ 50 {"RPC COUNTS", 10, 12, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, 51 {"", 12, 14, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, 52 {"RPC INFO", 14, 12, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, 53 {"", 12, 14, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, 54 {"CACHE INFO", 10, 12, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0}, 55 {"", 12, 14, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, 56 57 /* Server */ 58 {"RPC COUNTS", 10, 12, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, 59 {"", 12, 14, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, 60 {"CACHE STATS", 14, 12, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, 61 {"", 12, 14, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, 62 {"WRITES", 10, 12, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0}, 63 {"", 10, 12, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, 64 }; 65 66 /* _V suffixed fields indicate a value column. */ 67 /* Client */ 68 #define FLD_NFS_C_RPC_COUNTS FIELD_ADDR(fields_nfs,0) 69 #define FLD_NFS_C_RPC_COUNTS_V FIELD_ADDR(fields_nfs,1) 70 #define FLD_NFS_C_RPC_INFO FIELD_ADDR(fields_nfs,2) 71 #define FLD_NFS_C_RPC_INFO_V FIELD_ADDR(fields_nfs,3) 72 #define FLD_NFS_C_CACHE_INFO FIELD_ADDR(fields_nfs,4) 73 #define FLD_NFS_C_CACHE_V FIELD_ADDR(fields_nfs,5) 74 75 /* Server */ 76 #define FLD_NFS_S_RPC_COUNTS FIELD_ADDR(fields_nfs,6) 77 #define FLD_NFS_S_RPC_COUNTS_V FIELD_ADDR(fields_nfs,7) 78 #define FLD_NFS_S_CACHE_STATS FIELD_ADDR(fields_nfs,8) 79 #define FLD_NFS_S_CACHE_STATS_V FIELD_ADDR(fields_nfs,9) 80 #define FLD_NFS_S_WRITES FIELD_ADDR(fields_nfs,10) 81 #define FLD_NFS_S_WRITES_V FIELD_ADDR(fields_nfs,11) 82 83 /* Define views */ 84 field_def *view_nfs_0[] = { 85 FLD_NFS_C_RPC_COUNTS, FLD_NFS_C_RPC_COUNTS_V, FLD_NFS_C_RPC_INFO, 86 FLD_NFS_C_RPC_INFO_V, FLD_NFS_C_CACHE_INFO, FLD_NFS_C_CACHE_V ,NULL 87 }; 88 89 field_def *view_nfs_1[] = { 90 FLD_NFS_S_RPC_COUNTS, FLD_NFS_S_RPC_COUNTS_V, FLD_NFS_S_CACHE_STATS, 91 FLD_NFS_S_CACHE_STATS_V, FLD_NFS_S_WRITES, FLD_NFS_S_WRITES_V, NULL 92 }; 93 94 /* Define view managers */ 95 struct view_manager nfs_client_mgr = { 96 "Client", select_client, read_nfs, NULL, print_header, 97 print_client, keyboard_callback, NULL, NULL 98 }; 99 100 struct view_manager nfs_server_mgr = { 101 "Server", select_server, read_nfs, NULL, print_header, 102 print_server, keyboard_callback, NULL, NULL 103 }; 104 105 field_view views_nfs[] = { 106 {view_nfs_0, "nfsclient", '8', &nfs_client_mgr}, 107 {view_nfs_1, "nfsserver", '9', &nfs_server_mgr}, 108 {NULL, NULL, 0, NULL} 109 }; 110 111 int 112 select_client(void) 113 { 114 num_disp = num_client; 115 return(0); 116 } 117 118 int 119 select_server(void) 120 { 121 num_disp = num_server; 122 return(0); 123 } 124 125 int 126 initnfs(void) 127 { 128 field_view *v; 129 130 for (v = views_nfs; v->name != NULL; v++) 131 add_view(v); 132 133 read_nfs(); 134 135 return(0); 136 } 137 138 /* 139 * We get all the information in one go and don't care about 140 * server or client fields (those will be '0' if not applicable). 141 */ 142 int 143 read_nfs(void) 144 { 145 struct nfsstats *p = &nfsstats; 146 int mib[3]; 147 size_t len = sizeof(*p); 148 149 mib[0] = CTL_VFS; 150 mib[1] = 2; /* NETDEV */ 151 mib[2] = NFS_NFSSTATS; 152 153 if (sysctl(mib, 3, p, &len, NULL, 0) == -1) 154 return(-1); 155 else 156 return(0); 157 } 158 159 160 /* 161 * As we want a view with multiple columns, mixed with labels and values, 162 * we can't use the regular dance and have to use our own (looong) dance 163 * to build the layout. 164 */ 165 void 166 print_client(void) 167 { 168 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Getattr"); 169 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 170 nfsstats.rpccnt[NFSPROC_GETATTR]); 171 print_fld_str(FLD_NFS_C_RPC_INFO, "TimedOut"); 172 print_fld_ssize(FLD_NFS_C_RPC_INFO_V, nfsstats.rpctimeouts); 173 print_fld_str(FLD_NFS_C_CACHE_INFO, "Attr Hits "); 174 print_fld_ssize(FLD_NFS_C_CACHE_V, nfsstats.attrcache_hits); 175 end_line(); 176 177 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Setattr"); 178 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 179 nfsstats.rpccnt[NFSPROC_SETATTR]); 180 print_fld_str(FLD_NFS_C_RPC_INFO, "Invalid"); 181 print_fld_ssize(FLD_NFS_C_RPC_INFO_V, nfsstats.rpcinvalid); 182 print_fld_str(FLD_NFS_C_CACHE_INFO, "Attr Misses"); 183 print_fld_ssize(FLD_NFS_C_CACHE_V, nfsstats.attrcache_misses); 184 end_line(); 185 186 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Lookup"); 187 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 188 nfsstats.rpccnt[NFSPROC_LOOKUP]); 189 print_fld_str(FLD_NFS_C_RPC_INFO, "X Replies"); 190 print_fld_ssize(FLD_NFS_C_RPC_INFO_V, nfsstats.rpcunexpected); 191 print_fld_str(FLD_NFS_C_CACHE_INFO, "Lkup Hits "); 192 print_fld_ssize(FLD_NFS_C_CACHE_V, nfsstats.lookupcache_hits); 193 end_line(); 194 195 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Readlink"); 196 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 197 nfsstats.rpccnt[NFSPROC_READLINK]); 198 print_fld_str(FLD_NFS_C_RPC_INFO, "Retries"); 199 print_fld_ssize(FLD_NFS_C_RPC_INFO_V, nfsstats.rpcretries); 200 print_fld_str(FLD_NFS_C_CACHE_INFO, "Lkup Misses "); 201 print_fld_ssize(FLD_NFS_C_CACHE_V, nfsstats.lookupcache_misses); 202 end_line(); 203 204 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Read"); 205 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 206 nfsstats.rpccnt[NFSPROC_READ]); 207 print_fld_str(FLD_NFS_C_RPC_INFO, "Requests"); 208 print_fld_ssize(FLD_NFS_C_RPC_INFO_V, nfsstats.rpcrequests); 209 print_fld_str(FLD_NFS_C_CACHE_INFO, "BioR Hits "); 210 print_fld_ssize(FLD_NFS_C_CACHE_V, 211 nfsstats.biocache_reads-nfsstats.read_bios); 212 end_line(); 213 214 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Write"); 215 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, nfsstats.rpccnt[NFSPROC_WRITE]); 216 print_fld_str(FLD_NFS_C_RPC_INFO, "FrcSync"); 217 print_fld_ssize(FLD_NFS_C_RPC_INFO_V, nfsstats.forcedsync); 218 print_fld_str(FLD_NFS_C_CACHE_INFO, "BioR Misses"); 219 print_fld_ssize(FLD_NFS_C_CACHE_V, nfsstats.read_bios); 220 end_line(); 221 222 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Create"); 223 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 224 nfsstats.rpccnt[NFSPROC_CREATE]); 225 print_fld_str(FLD_NFS_C_CACHE_INFO, "BioW Hits "); 226 print_fld_ssize(FLD_NFS_C_CACHE_V, 227 nfsstats.biocache_writes-nfsstats.write_bios); 228 end_line(); 229 230 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Remove"); 231 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 232 nfsstats.rpccnt[NFSPROC_REMOVE]); 233 print_fld_str(FLD_NFS_C_CACHE_INFO, "BioW Misses"); 234 print_fld_ssize(FLD_NFS_C_CACHE_V, nfsstats.write_bios); 235 end_line(); 236 237 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Rename"); 238 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 239 nfsstats.rpccnt[NFSPROC_RENAME]); 240 print_fld_str(FLD_NFS_C_CACHE_INFO, "BioRL Hits "); 241 print_fld_ssize(FLD_NFS_C_CACHE_V, 242 nfsstats.biocache_readlinks-nfsstats.readlink_bios); 243 end_line(); 244 245 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Link"); 246 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, nfsstats.rpccnt[NFSPROC_LINK]); 247 print_fld_str(FLD_NFS_C_CACHE_INFO, "BioRL Misses"); 248 print_fld_ssize(FLD_NFS_C_CACHE_V, nfsstats.readlink_bios); 249 end_line(); 250 251 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Symlink"); 252 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 253 nfsstats.rpccnt[NFSPROC_SYMLINK]); 254 print_fld_str(FLD_NFS_C_CACHE_INFO, "BioD Hits "); 255 print_fld_ssize(FLD_NFS_C_CACHE_V, 256 nfsstats.biocache_readdirs-nfsstats.readdir_bios); 257 end_line(); 258 259 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Mkdir"); 260 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, nfsstats.rpccnt[NFSPROC_MKDIR]); 261 print_fld_str(FLD_NFS_C_CACHE_INFO, "BioD Misses"); 262 print_fld_ssize(FLD_NFS_C_CACHE_V, nfsstats.readdir_bios); 263 end_line(); 264 265 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Rmdir"); 266 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, nfsstats.rpccnt[NFSPROC_RMDIR]); 267 print_fld_str(FLD_NFS_C_CACHE_INFO, "DirE Hits "); 268 print_fld_ssize(FLD_NFS_C_CACHE_V, nfsstats.direofcache_hits); 269 end_line(); 270 271 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Readdir"); 272 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 273 nfsstats.rpccnt[NFSPROC_READDIR]); 274 print_fld_str(FLD_NFS_C_CACHE_INFO, "DirE Misses"); 275 print_fld_ssize(FLD_NFS_C_CACHE_V, nfsstats.direofcache_misses); 276 end_line(); 277 278 print_fld_str(FLD_NFS_C_RPC_COUNTS, "RdirPlus"); 279 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 280 nfsstats.rpccnt[NFSPROC_READDIRPLUS]); 281 end_line(); 282 283 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Access"); 284 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 285 nfsstats.rpccnt[NFSPROC_ACCESS]); 286 end_line(); 287 288 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Mknod"); 289 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, nfsstats.rpccnt[NFSPROC_MKNOD]); 290 end_line(); 291 292 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Fsstat"); 293 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 294 nfsstats.rpccnt[NFSPROC_FSSTAT]); 295 end_line(); 296 297 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Fsinfo"); 298 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 299 nfsstats.rpccnt[NFSPROC_FSINFO]); 300 end_line(); 301 302 print_fld_str(FLD_NFS_C_RPC_COUNTS, "PathConf"); 303 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 304 nfsstats.rpccnt[NFSPROC_PATHCONF]); 305 end_line(); 306 307 print_fld_str(FLD_NFS_C_RPC_COUNTS, "Commit"); 308 print_fld_ssize(FLD_NFS_C_RPC_COUNTS_V, 309 nfsstats.rpccnt[NFSPROC_COMMIT]); 310 end_line(); 311 } 312 313 void 314 print_server(void) 315 { 316 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Getattr"); 317 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 318 nfsstats.srvrpccnt[NFSPROC_GETATTR]); 319 print_fld_str(FLD_NFS_S_CACHE_STATS, "Inprog"); 320 print_fld_ssize(FLD_NFS_S_CACHE_STATS_V, nfsstats.srvcache_inproghits); 321 print_fld_str(FLD_NFS_S_WRITES, "WriteOps"); 322 print_fld_ssize(FLD_NFS_S_WRITES_V, nfsstats.srvvop_writes); 323 end_line(); 324 325 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Setattr"); 326 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 327 nfsstats.srvrpccnt[NFSPROC_SETATTR]); 328 print_fld_str(FLD_NFS_S_CACHE_STATS, "Idem"); 329 print_fld_ssize(FLD_NFS_S_CACHE_STATS_V, 330 nfsstats.srvcache_idemdonehits); 331 print_fld_str(FLD_NFS_S_WRITES, "WriteRPC"); 332 print_fld_ssize(FLD_NFS_S_WRITES_V, nfsstats.srvrpccnt[NFSPROC_WRITE]); 333 end_line(); 334 335 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Lookup"); 336 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 337 nfsstats.srvrpccnt[NFSPROC_LOOKUP]); 338 print_fld_str(FLD_NFS_S_CACHE_STATS, "Non-idem"); 339 print_fld_ssize(FLD_NFS_S_CACHE_STATS_V, 340 nfsstats.srvcache_nonidemdonehits); 341 print_fld_str(FLD_NFS_S_WRITES, "Opsaved"); 342 print_fld_ssize(FLD_NFS_S_WRITES_V, 343 nfsstats.srvrpccnt[NFSPROC_WRITE] - nfsstats.srvvop_writes); 344 end_line(); 345 346 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Readlink"); 347 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 348 nfsstats.srvrpccnt[NFSPROC_READLINK]); 349 print_fld_str(FLD_NFS_S_CACHE_STATS, "Misses"); 350 print_fld_ssize(FLD_NFS_S_CACHE_STATS_V, nfsstats.srvcache_misses); 351 end_line(); 352 353 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Read"); 354 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 355 nfsstats.srvrpccnt[NFSPROC_READ]); 356 end_line(); 357 358 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Write"); 359 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 360 nfsstats.srvrpccnt[NFSPROC_WRITE]); 361 end_line(); 362 363 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Create"); 364 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 365 nfsstats.srvrpccnt[NFSPROC_CREATE]); 366 end_line(); 367 368 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Remove"); 369 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 370 nfsstats.srvrpccnt[NFSPROC_REMOVE]); 371 end_line(); 372 373 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Rename"); 374 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 375 nfsstats.srvrpccnt[NFSPROC_RENAME]); 376 end_line(); 377 378 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Link"); 379 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 380 nfsstats.srvrpccnt[NFSPROC_LINK]); 381 end_line(); 382 383 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Symlink"); 384 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 385 nfsstats.srvrpccnt[NFSPROC_SYMLINK]); 386 end_line(); 387 388 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Mkdir"); 389 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 390 nfsstats.srvrpccnt[NFSPROC_MKDIR]); 391 end_line(); 392 393 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Rmdir"); 394 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 395 nfsstats.srvrpccnt[NFSPROC_RMDIR]); 396 end_line(); 397 398 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Readdir"); 399 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 400 nfsstats.srvrpccnt[NFSPROC_READDIR]); 401 end_line(); 402 403 print_fld_str(FLD_NFS_S_RPC_COUNTS, "RdirPlus"); 404 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 405 nfsstats.srvrpccnt[NFSPROC_READDIRPLUS]); 406 end_line(); 407 408 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Access"); 409 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 410 nfsstats.srvrpccnt[NFSPROC_ACCESS]); 411 end_line(); 412 413 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Mknod"); 414 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 415 nfsstats.srvrpccnt[NFSPROC_MKNOD]); 416 end_line(); 417 418 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Fsstat"); 419 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 420 nfsstats.srvrpccnt[NFSPROC_FSSTAT]); 421 end_line(); 422 423 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Fsinfo"); 424 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 425 nfsstats.srvrpccnt[NFSPROC_FSINFO]); 426 end_line(); 427 428 print_fld_str(FLD_NFS_S_RPC_COUNTS, "PathConf"); 429 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 430 nfsstats.srvrpccnt[NFSPROC_PATHCONF]); 431 end_line(); 432 433 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Commit"); 434 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, 435 nfsstats.srvrpccnt[NFSPROC_COMMIT]); 436 end_line(); 437 438 /* This creates an empty space on screen to separate the two blocks */ 439 print_fld_str(FLD_NFS_S_RPC_COUNTS, ""); 440 end_line(); 441 442 print_fld_str(FLD_NFS_S_RPC_COUNTS, "Ret-Failed"); 443 print_fld_ssize(FLD_NFS_S_RPC_COUNTS_V, nfsstats.srvrpc_errs); 444 print_fld_str(FLD_NFS_S_CACHE_STATS, "Faults"); 445 print_fld_ssize(FLD_NFS_S_CACHE_STATS_V, nfsstats.srv_errs); 446 end_line(); 447 } 448