1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #include <sys/types.h> 27 #include <sys/kstat.h> 28 #include <sys/zone.h> 29 #include <sys/kmem.h> 30 #include <sys/systm.h> 31 32 #include <nfs/nfs.h> 33 #include <nfs/nfs4_kprot.h> 34 35 /* 36 * Key to retrieve per-zone data corresponding to NFS kstats consumed by 37 * nfsstat(8). 38 */ 39 zone_key_t nfsstat_zone_key; 40 41 /* 42 * Convenience routine to create a named kstat associated with zoneid, named 43 * module:0:name:"misc", using the provided template to initialize the names 44 * and values of the stats. 45 */ 46 static kstat_named_t * 47 nfsstat_zone_init_common(zoneid_t zoneid, const char *module, int vers, 48 const char *name, const kstat_named_t *template, 49 size_t template_size) 50 { 51 kstat_t *ksp; 52 kstat_named_t *ks_data; 53 54 ks_data = kmem_alloc(template_size, KM_SLEEP); 55 bcopy(template, ks_data, template_size); 56 if ((ksp = kstat_create_zone(module, vers, name, "misc", 57 KSTAT_TYPE_NAMED, template_size / sizeof (kstat_named_t), 58 KSTAT_FLAG_VIRTUAL | KSTAT_FLAG_WRITABLE, zoneid)) != NULL) { 59 ksp->ks_data = ks_data; 60 kstat_install(ksp); 61 } 62 return (ks_data); 63 } 64 65 /* 66 * Convenience routine to remove a kstat in specified zone with name 67 * module:0:name. 68 */ 69 static void 70 nfsstat_zone_fini_common(zoneid_t zoneid, const char *module, int vers, 71 const char *name) 72 { 73 kstat_delete_byname_zone(module, vers, name, zoneid); 74 } 75 76 /* 77 * Server statistics. These are defined here, rather than in the server 78 * code, so that they can be referenced before the nfssrv kmod is loaded. 79 * 80 * The "calls" counter is a Contract Private interface covered by 81 * PSARC/2001/357. Please contact contract-2001-357-01@eng.sun.com before 82 * making any changes. 83 */ 84 85 static const kstat_named_t svstat_tmpl[] = { 86 { "calls", KSTAT_DATA_UINT64 }, 87 { "badcalls", KSTAT_DATA_UINT64 }, 88 { "referrals", KSTAT_DATA_UINT64 }, 89 { "referlinks", KSTAT_DATA_UINT64 }, 90 }; 91 92 static void 93 nfsstat_zone_init_server(zoneid_t zoneid, kstat_named_t *svstatp[]) 94 { 95 int vers; 96 97 for (vers = NFS_VERSION; vers <= NFS_V4; vers++) { 98 svstatp[vers] = nfsstat_zone_init_common(zoneid, "nfs", vers, 99 "nfs_server", svstat_tmpl, sizeof (svstat_tmpl)); 100 } 101 } 102 103 static void 104 nfsstat_zone_fini_server(zoneid_t zoneid, kstat_named_t *svstatp[]) 105 { 106 int vers; 107 for (vers = NFS_VERSION; vers <= NFS_V4; vers++) { 108 nfsstat_zone_fini_common(zoneid, "nfs", vers, "nfs_server"); 109 kmem_free(svstatp[vers], sizeof (svstat_tmpl)); 110 } 111 } 112 113 /* 114 * NFSv2 client stats 115 */ 116 static const kstat_named_t rfsreqcnt_v2_tmpl[] = { 117 { "null", KSTAT_DATA_UINT64 }, 118 { "getattr", KSTAT_DATA_UINT64 }, 119 { "setattr", KSTAT_DATA_UINT64 }, 120 { "root", KSTAT_DATA_UINT64 }, 121 { "lookup", KSTAT_DATA_UINT64 }, 122 { "readlink", KSTAT_DATA_UINT64 }, 123 { "read", KSTAT_DATA_UINT64 }, 124 { "wrcache", KSTAT_DATA_UINT64 }, 125 { "write", KSTAT_DATA_UINT64 }, 126 { "create", KSTAT_DATA_UINT64 }, 127 { "remove", KSTAT_DATA_UINT64 }, 128 { "rename", KSTAT_DATA_UINT64 }, 129 { "link", KSTAT_DATA_UINT64 }, 130 { "symlink", KSTAT_DATA_UINT64 }, 131 { "mkdir", KSTAT_DATA_UINT64 }, 132 { "rmdir", KSTAT_DATA_UINT64 }, 133 { "readdir", KSTAT_DATA_UINT64 }, 134 { "statfs", KSTAT_DATA_UINT64 } 135 }; 136 137 static void 138 nfsstat_zone_init_rfsreq_v2(zoneid_t zoneid, struct nfs_version_stats *statsp) 139 { 140 statsp->rfsreqcnt_ptr = nfsstat_zone_init_common(zoneid, "nfs", 0, 141 "rfsreqcnt_v2", rfsreqcnt_v2_tmpl, sizeof (rfsreqcnt_v2_tmpl)); 142 } 143 144 static void 145 nfsstat_zone_fini_rfsreq_v2(zoneid_t zoneid, struct nfs_version_stats *statsp) 146 { 147 nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsreqcnt_v2"); 148 kmem_free(statsp->rfsreqcnt_ptr, sizeof (rfsreqcnt_v2_tmpl)); 149 } 150 151 /* 152 * NFSv2 server stats 153 */ 154 static const kstat_named_t rfsproccnt_v2_tmpl[] = { 155 { "null", KSTAT_DATA_UINT64 }, 156 { "getattr", KSTAT_DATA_UINT64 }, 157 { "setattr", KSTAT_DATA_UINT64 }, 158 { "root", KSTAT_DATA_UINT64 }, 159 { "lookup", KSTAT_DATA_UINT64 }, 160 { "readlink", KSTAT_DATA_UINT64 }, 161 { "read", KSTAT_DATA_UINT64 }, 162 { "wrcache", KSTAT_DATA_UINT64 }, 163 { "write", KSTAT_DATA_UINT64 }, 164 { "create", KSTAT_DATA_UINT64 }, 165 { "remove", KSTAT_DATA_UINT64 }, 166 { "rename", KSTAT_DATA_UINT64 }, 167 { "link", KSTAT_DATA_UINT64 }, 168 { "symlink", KSTAT_DATA_UINT64 }, 169 { "mkdir", KSTAT_DATA_UINT64 }, 170 { "rmdir", KSTAT_DATA_UINT64 }, 171 { "readdir", KSTAT_DATA_UINT64 }, 172 { "statfs", KSTAT_DATA_UINT64 } 173 }; 174 175 /* 176 * NFSv2 client ACL stats 177 */ 178 static const kstat_named_t aclreqcnt_v2_tmpl[] = { 179 { "null", KSTAT_DATA_UINT64 }, 180 { "getacl", KSTAT_DATA_UINT64 }, 181 { "setacl", KSTAT_DATA_UINT64 }, 182 { "getattr", KSTAT_DATA_UINT64 }, 183 { "access", KSTAT_DATA_UINT64 }, 184 { "getxattrdir", KSTAT_DATA_UINT64 } 185 }; 186 187 static void 188 nfsstat_zone_init_aclreq_v2(zoneid_t zoneid, struct nfs_version_stats *statsp) 189 { 190 statsp->aclreqcnt_ptr = nfsstat_zone_init_common(zoneid, "nfs_acl", 0, 191 "aclreqcnt_v2", aclreqcnt_v2_tmpl, sizeof (aclreqcnt_v2_tmpl)); 192 } 193 194 static void 195 nfsstat_zone_fini_aclreq_v2(zoneid_t zoneid, struct nfs_version_stats *statsp) 196 { 197 nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclreqcnt_v2"); 198 kmem_free(statsp->aclreqcnt_ptr, sizeof (aclreqcnt_v2_tmpl)); 199 } 200 201 /* 202 * NFSv2 server ACL stats 203 */ 204 static const kstat_named_t aclproccnt_v2_tmpl[] = { 205 { "null", KSTAT_DATA_UINT64 }, 206 { "getacl", KSTAT_DATA_UINT64 }, 207 { "setacl", KSTAT_DATA_UINT64 }, 208 { "getattr", KSTAT_DATA_UINT64 }, 209 { "access", KSTAT_DATA_UINT64 }, 210 { "getxattrdir", KSTAT_DATA_UINT64 } 211 }; 212 213 /* 214 * NFSv3 client stats 215 */ 216 static const kstat_named_t rfsreqcnt_v3_tmpl[] = { 217 { "null", KSTAT_DATA_UINT64 }, 218 { "getattr", KSTAT_DATA_UINT64 }, 219 { "setattr", KSTAT_DATA_UINT64 }, 220 { "lookup", KSTAT_DATA_UINT64 }, 221 { "access", KSTAT_DATA_UINT64 }, 222 { "readlink", KSTAT_DATA_UINT64 }, 223 { "read", KSTAT_DATA_UINT64 }, 224 { "write", KSTAT_DATA_UINT64 }, 225 { "create", KSTAT_DATA_UINT64 }, 226 { "mkdir", KSTAT_DATA_UINT64 }, 227 { "symlink", KSTAT_DATA_UINT64 }, 228 { "mknod", KSTAT_DATA_UINT64 }, 229 { "remove", KSTAT_DATA_UINT64 }, 230 { "rmdir", KSTAT_DATA_UINT64 }, 231 { "rename", KSTAT_DATA_UINT64 }, 232 { "link", KSTAT_DATA_UINT64 }, 233 { "readdir", KSTAT_DATA_UINT64 }, 234 { "readdirplus", KSTAT_DATA_UINT64 }, 235 { "fsstat", KSTAT_DATA_UINT64 }, 236 { "fsinfo", KSTAT_DATA_UINT64 }, 237 { "pathconf", KSTAT_DATA_UINT64 }, 238 { "commit", KSTAT_DATA_UINT64 } 239 }; 240 241 static void 242 nfsstat_zone_init_rfsreq_v3(zoneid_t zoneid, struct nfs_version_stats *statsp) 243 { 244 statsp->rfsreqcnt_ptr = nfsstat_zone_init_common(zoneid, "nfs", 0, 245 "rfsreqcnt_v3", rfsreqcnt_v3_tmpl, sizeof (rfsreqcnt_v3_tmpl)); 246 } 247 248 static void 249 nfsstat_zone_fini_rfsreq_v3(zoneid_t zoneid, struct nfs_version_stats *statsp) 250 { 251 nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsreqcnt_v3"); 252 kmem_free(statsp->rfsreqcnt_ptr, sizeof (rfsreqcnt_v3_tmpl)); 253 } 254 255 /* 256 * NFSv3 server stats 257 */ 258 static const kstat_named_t rfsproccnt_v3_tmpl[] = { 259 { "null", KSTAT_DATA_UINT64 }, 260 { "getattr", KSTAT_DATA_UINT64 }, 261 { "setattr", KSTAT_DATA_UINT64 }, 262 { "lookup", KSTAT_DATA_UINT64 }, 263 { "access", KSTAT_DATA_UINT64 }, 264 { "readlink", KSTAT_DATA_UINT64 }, 265 { "read", KSTAT_DATA_UINT64 }, 266 { "write", KSTAT_DATA_UINT64 }, 267 { "create", KSTAT_DATA_UINT64 }, 268 { "mkdir", KSTAT_DATA_UINT64 }, 269 { "symlink", KSTAT_DATA_UINT64 }, 270 { "mknod", KSTAT_DATA_UINT64 }, 271 { "remove", KSTAT_DATA_UINT64 }, 272 { "rmdir", KSTAT_DATA_UINT64 }, 273 { "rename", KSTAT_DATA_UINT64 }, 274 { "link", KSTAT_DATA_UINT64 }, 275 { "readdir", KSTAT_DATA_UINT64 }, 276 { "readdirplus", KSTAT_DATA_UINT64 }, 277 { "fsstat", KSTAT_DATA_UINT64 }, 278 { "fsinfo", KSTAT_DATA_UINT64 }, 279 { "pathconf", KSTAT_DATA_UINT64 }, 280 { "commit", KSTAT_DATA_UINT64 } 281 }; 282 283 /* 284 * NFSv3 client ACL stats 285 */ 286 static const kstat_named_t aclreqcnt_v3_tmpl[] = { 287 { "null", KSTAT_DATA_UINT64 }, 288 { "getacl", KSTAT_DATA_UINT64 }, 289 { "setacl", KSTAT_DATA_UINT64 }, 290 { "getxattrdir", KSTAT_DATA_UINT64 } 291 }; 292 293 static void 294 nfsstat_zone_init_aclreq_v3(zoneid_t zoneid, struct nfs_version_stats *statsp) 295 { 296 statsp->aclreqcnt_ptr = nfsstat_zone_init_common(zoneid, "nfs_acl", 0, 297 "aclreqcnt_v3", aclreqcnt_v3_tmpl, sizeof (aclreqcnt_v3_tmpl)); 298 } 299 300 static void 301 nfsstat_zone_fini_aclreq_v3(zoneid_t zoneid, struct nfs_version_stats *statsp) 302 { 303 nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclreqcnt_v3"); 304 kmem_free(statsp->aclreqcnt_ptr, sizeof (aclreqcnt_v3_tmpl)); 305 } 306 307 /* 308 * NFSv3 server ACL stats 309 */ 310 static const kstat_named_t aclproccnt_v3_tmpl[] = { 311 { "null", KSTAT_DATA_UINT64 }, 312 { "getacl", KSTAT_DATA_UINT64 }, 313 { "setacl", KSTAT_DATA_UINT64 }, 314 { "getxattrdir", KSTAT_DATA_UINT64 } 315 }; 316 317 /* 318 * NFSv4 client stats 319 */ 320 static const kstat_named_t rfsreqcnt_v4_tmpl[] = { 321 { "null", KSTAT_DATA_UINT64 }, 322 { "compound", KSTAT_DATA_UINT64 }, 323 { "reserved", KSTAT_DATA_UINT64 }, 324 { "access", KSTAT_DATA_UINT64 }, 325 { "close", KSTAT_DATA_UINT64 }, 326 { "commit", KSTAT_DATA_UINT64 }, 327 { "create", KSTAT_DATA_UINT64 }, 328 { "delegpurge", KSTAT_DATA_UINT64 }, 329 { "delegreturn", KSTAT_DATA_UINT64 }, 330 { "getattr", KSTAT_DATA_UINT64 }, 331 { "getfh", KSTAT_DATA_UINT64 }, 332 { "link", KSTAT_DATA_UINT64 }, 333 { "lock", KSTAT_DATA_UINT64 }, 334 { "lockt", KSTAT_DATA_UINT64 }, 335 { "locku", KSTAT_DATA_UINT64 }, 336 { "lookup", KSTAT_DATA_UINT64 }, 337 { "lookupp", KSTAT_DATA_UINT64 }, 338 { "nverify", KSTAT_DATA_UINT64 }, 339 { "open", KSTAT_DATA_UINT64 }, 340 { "openattr", KSTAT_DATA_UINT64 }, 341 { "open_confirm", KSTAT_DATA_UINT64 }, 342 { "open_downgrade", KSTAT_DATA_UINT64 }, 343 { "putfh", KSTAT_DATA_UINT64 }, 344 { "putpubfh", KSTAT_DATA_UINT64 }, 345 { "putrootfh", KSTAT_DATA_UINT64 }, 346 { "read", KSTAT_DATA_UINT64 }, 347 { "readdir", KSTAT_DATA_UINT64 }, 348 { "readlink", KSTAT_DATA_UINT64 }, 349 { "remove", KSTAT_DATA_UINT64 }, 350 { "rename", KSTAT_DATA_UINT64 }, 351 { "renew", KSTAT_DATA_UINT64 }, 352 { "restorefh", KSTAT_DATA_UINT64 }, 353 { "savefh", KSTAT_DATA_UINT64 }, 354 { "secinfo", KSTAT_DATA_UINT64 }, 355 { "setattr", KSTAT_DATA_UINT64 }, 356 { "setclientid", KSTAT_DATA_UINT64 }, 357 { "setclientid_confirm", KSTAT_DATA_UINT64 }, 358 { "verify", KSTAT_DATA_UINT64 }, 359 { "write", KSTAT_DATA_UINT64 } 360 }; 361 362 static void 363 nfsstat_zone_init_rfsreq_v4(zoneid_t zoneid, struct nfs_version_stats *statsp) 364 { 365 statsp->rfsreqcnt_ptr = nfsstat_zone_init_common(zoneid, "nfs", 0, 366 "rfsreqcnt_v4", rfsreqcnt_v4_tmpl, sizeof (rfsreqcnt_v4_tmpl)); 367 } 368 369 static void 370 nfsstat_zone_fini_rfsreq_v4(zoneid_t zoneid, struct nfs_version_stats *statsp) 371 { 372 nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsreqcnt_v4"); 373 kmem_free(statsp->rfsreqcnt_ptr, sizeof (rfsreqcnt_v4_tmpl)); 374 } 375 376 /* 377 * NFSv4 server stats 378 */ 379 static const kstat_named_t rfsproccnt_v4_tmpl[] = { 380 { "null", KSTAT_DATA_UINT64 }, 381 { "compound", KSTAT_DATA_UINT64 }, 382 { "reserved", KSTAT_DATA_UINT64 }, 383 { "access", KSTAT_DATA_UINT64 }, 384 { "close", KSTAT_DATA_UINT64 }, 385 { "commit", KSTAT_DATA_UINT64 }, 386 { "create", KSTAT_DATA_UINT64 }, 387 { "delegpurge", KSTAT_DATA_UINT64 }, 388 { "delegreturn", KSTAT_DATA_UINT64 }, 389 { "getattr", KSTAT_DATA_UINT64 }, 390 { "getfh", KSTAT_DATA_UINT64 }, 391 { "link", KSTAT_DATA_UINT64 }, 392 { "lock", KSTAT_DATA_UINT64 }, 393 { "lockt", KSTAT_DATA_UINT64 }, 394 { "locku", KSTAT_DATA_UINT64 }, 395 { "lookup", KSTAT_DATA_UINT64 }, 396 { "lookupp", KSTAT_DATA_UINT64 }, 397 { "nverify", KSTAT_DATA_UINT64 }, 398 { "open", KSTAT_DATA_UINT64 }, 399 { "openattr", KSTAT_DATA_UINT64 }, 400 { "open_confirm", KSTAT_DATA_UINT64 }, 401 { "open_downgrade", KSTAT_DATA_UINT64 }, 402 { "putfh", KSTAT_DATA_UINT64 }, 403 { "putpubfh", KSTAT_DATA_UINT64 }, 404 { "putrootfh", KSTAT_DATA_UINT64 }, 405 { "read", KSTAT_DATA_UINT64 }, 406 { "readdir", KSTAT_DATA_UINT64 }, 407 { "readlink", KSTAT_DATA_UINT64 }, 408 { "remove", KSTAT_DATA_UINT64 }, 409 { "rename", KSTAT_DATA_UINT64 }, 410 { "renew", KSTAT_DATA_UINT64 }, 411 { "restorefh", KSTAT_DATA_UINT64 }, 412 { "savefh", KSTAT_DATA_UINT64 }, 413 { "secinfo", KSTAT_DATA_UINT64 }, 414 { "setattr", KSTAT_DATA_UINT64 }, 415 { "setclientid", KSTAT_DATA_UINT64 }, 416 { "setclientid_confirm", KSTAT_DATA_UINT64 }, 417 { "verify", KSTAT_DATA_UINT64 }, 418 { "write", KSTAT_DATA_UINT64 }, 419 { "release_lockowner", KSTAT_DATA_UINT64 }, 420 { "illegal", KSTAT_DATA_UINT64 }, 421 }; 422 423 /* 424 * NFSv4 client ACL stats 425 */ 426 static const kstat_named_t aclreqcnt_v4_tmpl[] = { 427 { "null", KSTAT_DATA_UINT64 }, 428 { "getacl", KSTAT_DATA_UINT64 }, 429 { "setacl", KSTAT_DATA_UINT64 }, 430 }; 431 432 static void 433 nfsstat_zone_init_aclreq_v4(zoneid_t zoneid, struct nfs_version_stats *statsp) 434 { 435 statsp->aclreqcnt_ptr = nfsstat_zone_init_common(zoneid, "nfs_acl", 0, 436 "aclreqcnt_v4", aclreqcnt_v4_tmpl, sizeof (aclreqcnt_v4_tmpl)); 437 } 438 439 static void 440 nfsstat_zone_fini_aclreq_v4(zoneid_t zoneid, struct nfs_version_stats *statsp) 441 { 442 nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclreqcnt_v4"); 443 kmem_free(statsp->aclreqcnt_ptr, sizeof (aclreqcnt_v4_tmpl)); 444 } 445 446 /* 447 * Zone initializer callback to setup the kstats. 448 */ 449 void * 450 nfsstat_zone_init(zoneid_t zoneid) 451 { 452 struct nfs_stats *nfs_stats_ptr; 453 454 nfs_stats_ptr = kmem_zalloc(sizeof (*nfs_stats_ptr), KM_SLEEP); 455 456 /* 457 * Initialize v2 stats 458 */ 459 nfsstat_zone_init_rfsreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); 460 nfsstat_zone_init_aclreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); 461 /* 462 * Initialize v3 stats 463 */ 464 nfsstat_zone_init_rfsreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); 465 nfsstat_zone_init_aclreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); 466 /* 467 * Initialize v4 stats 468 */ 469 nfsstat_zone_init_rfsreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); 470 nfsstat_zone_init_aclreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); 471 472 return (nfs_stats_ptr); 473 } 474 475 /* 476 * Zone destructor callback to tear down the various kstats. 477 */ 478 void 479 nfsstat_zone_fini(zoneid_t zoneid, void *data) 480 { 481 struct nfs_stats *nfs_stats_ptr = data; 482 483 /* 484 * Free v2 stats 485 */ 486 nfsstat_zone_fini_rfsreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); 487 nfsstat_zone_fini_aclreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); 488 /* 489 * Free v3 stats 490 */ 491 nfsstat_zone_fini_rfsreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); 492 nfsstat_zone_fini_aclreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); 493 /* 494 * Free v4 stats 495 */ 496 nfsstat_zone_fini_rfsreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); 497 nfsstat_zone_fini_aclreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); 498 499 kmem_free(nfs_stats_ptr, sizeof (*nfs_stats_ptr)); 500 } 501 502 void 503 rfs_stat_zone_init(nfs_globals_t *ng) 504 { 505 zoneid_t zoneid = ng->nfs_zoneid; 506 507 /* Initialize all versions of the nfs_server */ 508 nfsstat_zone_init_server(zoneid, ng->svstat); 509 510 /* NFS proc */ 511 ng->rfsproccnt[NFS_V2] = nfsstat_zone_init_common(zoneid, "nfs", 0, 512 "rfsproccnt_v2", rfsproccnt_v2_tmpl, sizeof (rfsproccnt_v2_tmpl)); 513 514 ng->rfsproccnt[NFS_V3] = nfsstat_zone_init_common(zoneid, "nfs", 0, 515 "rfsproccnt_v3", rfsproccnt_v3_tmpl, sizeof (rfsproccnt_v3_tmpl)); 516 517 ng->rfsproccnt[NFS_V4] = nfsstat_zone_init_common(zoneid, "nfs", 0, 518 "rfsproccnt_v4", rfsproccnt_v4_tmpl, sizeof (rfsproccnt_v4_tmpl)); 519 520 /* ACL proc */ 521 ng->aclproccnt[NFS_V2] = nfsstat_zone_init_common(zoneid, "nfs_acl", 0, 522 "aclproccnt_v2", aclproccnt_v2_tmpl, sizeof (aclproccnt_v2_tmpl)); 523 524 ng->aclproccnt[NFS_V3] = nfsstat_zone_init_common(zoneid, "nfs_acl", 0, 525 "aclproccnt_v3", aclproccnt_v3_tmpl, sizeof (aclproccnt_v3_tmpl)); 526 527 } 528 529 void 530 rfs_stat_zone_fini(nfs_globals_t *ng) 531 { 532 zoneid_t zoneid = ng->nfs_zoneid; 533 534 /* Free nfs:x:nfs_server stats */ 535 nfsstat_zone_fini_server(zoneid, ng->svstat); 536 537 /* NFS */ 538 nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v2"); 539 kmem_free(ng->rfsproccnt[NFS_V2], sizeof (rfsproccnt_v2_tmpl)); 540 541 nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v3"); 542 kmem_free(ng->rfsproccnt[NFS_V3], sizeof (rfsproccnt_v3_tmpl)); 543 544 nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v4"); 545 kmem_free(ng->rfsproccnt[NFS_V4], sizeof (rfsproccnt_v4_tmpl)); 546 547 /* ACL */ 548 nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v2"); 549 kmem_free(ng->aclproccnt[NFS_V2], sizeof (aclproccnt_v2_tmpl)); 550 551 nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v3"); 552 kmem_free(ng->aclproccnt[NFS_V3], sizeof (aclproccnt_v3_tmpl)); 553 554 } 555