Print this page
11083 support NFS server in zone
Portions contributed by: Dan Kruchinin <dan.kruchinin@nexenta.com>
Portions contributed by: Stepan Zastupov <stepan.zastupov@gmail.com>
Portions contributed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
Portions contributed by: Mike Zeller <mike@mikezeller.net>
Portions contributed by: Dan McDonald <danmcd@joyent.com>
Portions contributed by: Gordon Ross <gordon.w.ross@gmail.com>
Portions contributed by: Vitaliy Gusev <gusev.vitaliy@gmail.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Jason King <jbk@joyent.com>
Reviewed by: C Fraire <cfraire@me.com>
Change-Id: I22f289d357503f9b48a0bc2482cc4328a6d43d16

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/nfs/nfs_stats.c
          +++ new/usr/src/uts/common/fs/nfs/nfs_stats.c
↓ open down ↓ 37 lines elided ↑ open up ↑
  38   38   */
  39   39  zone_key_t nfsstat_zone_key;
  40   40  
  41   41  /*
  42   42   * Convenience routine to create a named kstat associated with zoneid, named
  43   43   * module:0:name:"misc", using the provided template to initialize the names
  44   44   * and values of the stats.
  45   45   */
  46   46  static kstat_named_t *
  47   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)
       48 +    const char *name, const kstat_named_t *template,
       49 +    size_t template_size)
  50   50  {
  51   51          kstat_t *ksp;
  52   52          kstat_named_t *ks_data;
  53   53  
  54   54          ks_data = kmem_alloc(template_size, KM_SLEEP);
  55   55          bcopy(template, ks_data, template_size);
  56   56          if ((ksp = kstat_create_zone(module, vers, name, "misc",
  57   57              KSTAT_TYPE_NAMED, template_size / sizeof (kstat_named_t),
  58   58              KSTAT_FLAG_VIRTUAL | KSTAT_FLAG_WRITABLE, zoneid)) != NULL) {
  59   59                  ksp->ks_data = ks_data;
↓ open down ↓ 1 lines elided ↑ open up ↑
  61   61          }
  62   62          return (ks_data);
  63   63  }
  64   64  
  65   65  /*
  66   66   * Convenience routine to remove a kstat in specified zone with name
  67   67   * module:0:name.
  68   68   */
  69   69  static void
  70   70  nfsstat_zone_fini_common(zoneid_t zoneid, const char *module, int vers,
  71      -                            const char *name)
       71 +    const char *name)
  72   72  {
  73   73          kstat_delete_byname_zone(module, vers, name, zoneid);
  74   74  }
  75   75  
  76   76  /*
  77   77   * Server statistics.  These are defined here, rather than in the server
  78   78   * code, so that they can be referenced before the nfssrv kmod is loaded.
  79   79   *
  80   80   * The "calls" counter is a Contract Private interface covered by
  81   81   * PSARC/2001/357.  Please contact contract-2001-357-01@eng.sun.com before
  82   82   * making any changes.
  83   83   */
  84   84  
  85   85  static const kstat_named_t svstat_tmpl[] = {
  86   86          { "calls",      KSTAT_DATA_UINT64 },
  87   87          { "badcalls",   KSTAT_DATA_UINT64 },
  88   88          { "referrals",  KSTAT_DATA_UINT64 },
  89   89          { "referlinks", KSTAT_DATA_UINT64 },
  90   90  };
  91   91  
  92      -/* Points to the global zone server kstat data for all nfs versions */
  93      -kstat_named_t *global_svstat_ptr[NFS_VERSMAX + 1];
  94      -
  95   92  static void
  96   93  nfsstat_zone_init_server(zoneid_t zoneid, kstat_named_t *svstatp[])
  97   94  {
  98   95          int vers;
  99   96  
 100      -        /*
 101      -         * first two indexes of these arrays are not used, so initialize
 102      -         * to NULL
 103      -         */
 104      -        svstatp[0] = NULL;
 105      -        svstatp[1] = NULL;
 106      -        global_svstat_ptr[0] = NULL;
 107      -        global_svstat_ptr[0] = NULL;
 108      -
 109   97          for (vers = NFS_VERSION; vers <= NFS_V4; vers++) {
 110   98                  svstatp[vers] = nfsstat_zone_init_common(zoneid, "nfs", vers,
 111   99                      "nfs_server", svstat_tmpl, sizeof (svstat_tmpl));
 112      -                if (zoneid == GLOBAL_ZONEID)
 113      -                        global_svstat_ptr[vers] = svstatp[vers];
 114  100          }
 115  101  }
 116  102  
 117  103  static void
 118      -nfsstat_zone_fini_server(zoneid_t zoneid, kstat_named_t **svstatp)
      104 +nfsstat_zone_fini_server(zoneid_t zoneid, kstat_named_t *svstatp[])
 119  105  {
 120  106          int vers;
 121  107          for (vers = NFS_VERSION; vers <= NFS_V4; vers++) {
 122      -                if (zoneid == GLOBAL_ZONEID)
 123      -                        global_svstat_ptr[vers] = NULL;
 124  108                  nfsstat_zone_fini_common(zoneid, "nfs", vers, "nfs_server");
 125  109                  kmem_free(svstatp[vers], sizeof (svstat_tmpl));
 126  110          }
 127  111  }
 128  112  
 129  113  /*
 130  114   * NFSv2 client stats
 131  115   */
 132  116  static const kstat_named_t rfsreqcnt_v2_tmpl[] = {
 133  117          { "null",       KSTAT_DATA_UINT64 },
↓ open down ↓ 47 lines elided ↑ open up ↑
 181  165          { "remove",     KSTAT_DATA_UINT64 },
 182  166          { "rename",     KSTAT_DATA_UINT64 },
 183  167          { "link",       KSTAT_DATA_UINT64 },
 184  168          { "symlink",    KSTAT_DATA_UINT64 },
 185  169          { "mkdir",      KSTAT_DATA_UINT64 },
 186  170          { "rmdir",      KSTAT_DATA_UINT64 },
 187  171          { "readdir",    KSTAT_DATA_UINT64 },
 188  172          { "statfs",     KSTAT_DATA_UINT64 }
 189  173  };
 190  174  
 191      -kstat_named_t *rfsproccnt_v2_ptr;
 192      -
 193      -static void
 194      -nfsstat_zone_init_rfsproc_v2(zoneid_t zoneid, struct nfs_version_stats *statsp)
 195      -{
 196      -        kstat_named_t *ks_data;
 197      -
 198      -        ks_data = nfsstat_zone_init_common(zoneid, "nfs", 0, "rfsproccnt_v2",
 199      -            rfsproccnt_v2_tmpl, sizeof (rfsproccnt_v2_tmpl));
 200      -        statsp->rfsproccnt_ptr = ks_data;
 201      -        if (zoneid == GLOBAL_ZONEID)
 202      -                rfsproccnt_v2_ptr = ks_data;
 203      -}
 204      -
 205      -static void
 206      -nfsstat_zone_fini_rfsproc_v2(zoneid_t zoneid, struct nfs_version_stats *statsp)
 207      -{
 208      -        if (zoneid == GLOBAL_ZONEID)
 209      -                rfsproccnt_v2_ptr = NULL;
 210      -        nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v2");
 211      -        kmem_free(statsp->rfsproccnt_ptr, sizeof (rfsproccnt_v2_tmpl));
 212      -}
 213      -
 214  175  /*
 215  176   * NFSv2 client ACL stats
 216  177   */
 217  178  static const kstat_named_t aclreqcnt_v2_tmpl[] = {
 218  179          { "null",       KSTAT_DATA_UINT64 },
 219  180          { "getacl",     KSTAT_DATA_UINT64 },
 220  181          { "setacl",     KSTAT_DATA_UINT64 },
 221  182          { "getattr",    KSTAT_DATA_UINT64 },
 222  183          { "access",     KSTAT_DATA_UINT64 },
 223  184          { "getxattrdir",        KSTAT_DATA_UINT64 }
↓ open down ↓ 18 lines elided ↑ open up ↑
 242  203   */
 243  204  static const kstat_named_t aclproccnt_v2_tmpl[] = {
 244  205          { "null",       KSTAT_DATA_UINT64 },
 245  206          { "getacl",     KSTAT_DATA_UINT64 },
 246  207          { "setacl",     KSTAT_DATA_UINT64 },
 247  208          { "getattr",    KSTAT_DATA_UINT64 },
 248  209          { "access",     KSTAT_DATA_UINT64 },
 249  210          { "getxattrdir",        KSTAT_DATA_UINT64 }
 250  211  };
 251  212  
 252      -kstat_named_t *aclproccnt_v2_ptr;
 253      -
 254      -static void
 255      -nfsstat_zone_init_aclproc_v2(zoneid_t zoneid, struct nfs_version_stats *statsp)
 256      -{
 257      -        kstat_named_t *ks_data;
 258      -
 259      -        ks_data = nfsstat_zone_init_common(zoneid, "nfs_acl", 0,
 260      -            "aclproccnt_v2", aclproccnt_v2_tmpl,
 261      -            sizeof (aclproccnt_v2_tmpl));
 262      -        statsp->aclproccnt_ptr = ks_data;
 263      -        if (zoneid == GLOBAL_ZONEID)
 264      -                aclproccnt_v2_ptr = ks_data;
 265      -}
 266      -
 267      -static void
 268      -nfsstat_zone_fini_aclproc_v2(zoneid_t zoneid, struct nfs_version_stats *statsp)
 269      -{
 270      -        if (zoneid == GLOBAL_ZONEID)
 271      -                aclproccnt_v2_ptr = NULL;
 272      -        nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v2");
 273      -        kmem_free(statsp->aclproccnt_ptr, sizeof (aclproccnt_v2_tmpl));
 274      -}
 275      -
 276  213  /*
 277  214   * NFSv3 client stats
 278  215   */
 279  216  static const kstat_named_t rfsreqcnt_v3_tmpl[] = {
 280  217          { "null",       KSTAT_DATA_UINT64 },
 281  218          { "getattr",    KSTAT_DATA_UINT64 },
 282  219          { "setattr",    KSTAT_DATA_UINT64 },
 283  220          { "lookup",     KSTAT_DATA_UINT64 },
 284  221          { "access",     KSTAT_DATA_UINT64 },
 285  222          { "readlink",   KSTAT_DATA_UINT64 },
↓ open down ↓ 50 lines elided ↑ open up ↑
 336  273          { "rename",     KSTAT_DATA_UINT64 },
 337  274          { "link",       KSTAT_DATA_UINT64 },
 338  275          { "readdir",    KSTAT_DATA_UINT64 },
 339  276          { "readdirplus", KSTAT_DATA_UINT64 },
 340  277          { "fsstat",     KSTAT_DATA_UINT64 },
 341  278          { "fsinfo",     KSTAT_DATA_UINT64 },
 342  279          { "pathconf",   KSTAT_DATA_UINT64 },
 343  280          { "commit",     KSTAT_DATA_UINT64 }
 344  281  };
 345  282  
 346      -kstat_named_t *rfsproccnt_v3_ptr;
 347      -
 348      -static void
 349      -nfsstat_zone_init_rfsproc_v3(zoneid_t zoneid, struct nfs_version_stats *statsp)
 350      -{
 351      -        kstat_named_t *ks_data;
 352      -
 353      -        ks_data = nfsstat_zone_init_common(zoneid, "nfs", 0, "rfsproccnt_v3",
 354      -            rfsproccnt_v3_tmpl, sizeof (rfsproccnt_v3_tmpl));
 355      -        statsp->rfsproccnt_ptr = ks_data;
 356      -        if (zoneid == GLOBAL_ZONEID)
 357      -                rfsproccnt_v3_ptr = ks_data;
 358      -}
 359      -
 360      -static void
 361      -nfsstat_zone_fini_rfsproc_v3(zoneid_t zoneid, struct nfs_version_stats *statsp)
 362      -{
 363      -        if (zoneid == GLOBAL_ZONEID)
 364      -                rfsproccnt_v3_ptr = NULL;
 365      -        nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v3");
 366      -        kmem_free(statsp->rfsproccnt_ptr, sizeof (rfsproccnt_v3_tmpl));
 367      -}
 368      -
 369  283  /*
 370  284   * NFSv3 client ACL stats
 371  285   */
 372  286  static const kstat_named_t aclreqcnt_v3_tmpl[] = {
 373  287          { "null",       KSTAT_DATA_UINT64 },
 374  288          { "getacl",     KSTAT_DATA_UINT64 },
 375  289          { "setacl",     KSTAT_DATA_UINT64 },
 376  290          { "getxattrdir",        KSTAT_DATA_UINT64 }
 377  291  };
 378  292  
↓ open down ↓ 14 lines elided ↑ open up ↑
 393  307  /*
 394  308   * NFSv3 server ACL stats
 395  309   */
 396  310  static const kstat_named_t aclproccnt_v3_tmpl[] = {
 397  311          { "null",       KSTAT_DATA_UINT64 },
 398  312          { "getacl",     KSTAT_DATA_UINT64 },
 399  313          { "setacl",     KSTAT_DATA_UINT64 },
 400  314          { "getxattrdir",        KSTAT_DATA_UINT64 }
 401  315  };
 402  316  
 403      -kstat_named_t *aclproccnt_v3_ptr;
 404      -
 405      -static void
 406      -nfsstat_zone_init_aclproc_v3(zoneid_t zoneid, struct nfs_version_stats *statsp)
 407      -{
 408      -        kstat_named_t *ks_data;
 409      -
 410      -        ks_data = nfsstat_zone_init_common(zoneid, "nfs_acl", 0,
 411      -            "aclproccnt_v3", aclproccnt_v3_tmpl,
 412      -            sizeof (aclproccnt_v3_tmpl));
 413      -        statsp->aclproccnt_ptr = ks_data;
 414      -        if (zoneid == GLOBAL_ZONEID)
 415      -                aclproccnt_v3_ptr = ks_data;
 416      -}
 417      -
 418      -static void
 419      -nfsstat_zone_fini_aclproc_v3(zoneid_t zoneid, struct nfs_version_stats *statsp)
 420      -{
 421      -        if (zoneid == GLOBAL_ZONEID)
 422      -                aclproccnt_v3_ptr = NULL;
 423      -        nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v3");
 424      -        kmem_free(statsp->aclproccnt_ptr, sizeof (aclproccnt_v3_tmpl));
 425      -}
 426      -
 427  317  /*
 428  318   * NFSv4 client stats
 429  319   */
 430  320  static const kstat_named_t rfsreqcnt_v4_tmpl[] = {
 431  321          { "null",       KSTAT_DATA_UINT64 },
 432  322          { "compound",   KSTAT_DATA_UINT64 },
 433  323          { "reserved",   KSTAT_DATA_UINT64 },
 434  324          { "access",     KSTAT_DATA_UINT64 },
 435  325          { "close",      KSTAT_DATA_UINT64 },
 436  326          { "commit",     KSTAT_DATA_UINT64 },
↓ open down ↓ 86 lines elided ↑ open up ↑
 523  413          { "secinfo",    KSTAT_DATA_UINT64 },
 524  414          { "setattr",    KSTAT_DATA_UINT64 },
 525  415          { "setclientid",        KSTAT_DATA_UINT64 },
 526  416          { "setclientid_confirm",        KSTAT_DATA_UINT64 },
 527  417          { "verify",     KSTAT_DATA_UINT64 },
 528  418          { "write",      KSTAT_DATA_UINT64 },
 529  419          { "release_lockowner",  KSTAT_DATA_UINT64 },
 530  420          { "illegal",    KSTAT_DATA_UINT64 },
 531  421  };
 532  422  
 533      -kstat_named_t *rfsproccnt_v4_ptr;
 534      -
 535      -static void
 536      -nfsstat_zone_init_rfsproc_v4(zoneid_t zoneid, struct nfs_version_stats *statsp)
 537      -{
 538      -        kstat_named_t *ks_data;
 539      -
 540      -        ks_data = nfsstat_zone_init_common(zoneid, "nfs", 0, "rfsproccnt_v4",
 541      -            rfsproccnt_v4_tmpl, sizeof (rfsproccnt_v4_tmpl));
 542      -        statsp->rfsproccnt_ptr = ks_data;
 543      -        if (zoneid == GLOBAL_ZONEID)
 544      -                rfsproccnt_v4_ptr = ks_data;
 545      -}
 546      -
 547      -static void
 548      -nfsstat_zone_fini_rfsproc_v4(zoneid_t zoneid, struct nfs_version_stats *statsp)
 549      -{
 550      -        if (zoneid == GLOBAL_ZONEID)
 551      -                rfsproccnt_v4_ptr = NULL;
 552      -        nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v4");
 553      -        kmem_free(statsp->rfsproccnt_ptr, sizeof (rfsproccnt_v4_tmpl));
 554      -}
 555      -
 556  423  /*
 557  424   * NFSv4 client ACL stats
 558  425   */
 559  426  static const kstat_named_t aclreqcnt_v4_tmpl[] = {
 560  427          { "null",       KSTAT_DATA_UINT64 },
 561  428          { "getacl",     KSTAT_DATA_UINT64 },
 562  429          { "setacl",     KSTAT_DATA_UINT64 },
 563  430  };
 564  431  
 565  432  static void
↓ open down ↓ 4 lines elided ↑ open up ↑
 570  437  }
 571  438  
 572  439  static void
 573  440  nfsstat_zone_fini_aclreq_v4(zoneid_t zoneid, struct nfs_version_stats *statsp)
 574  441  {
 575  442          nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclreqcnt_v4");
 576  443          kmem_free(statsp->aclreqcnt_ptr, sizeof (aclreqcnt_v4_tmpl));
 577  444  }
 578  445  
 579  446  /*
 580      - * NFSv4 server ACL stats
 581      - */
 582      -static const kstat_named_t aclproccnt_v4_tmpl[] = {
 583      -        { "null",       KSTAT_DATA_UINT64 },
 584      -        { "getacl",     KSTAT_DATA_UINT64 },
 585      -        { "setacl",     KSTAT_DATA_UINT64 }
 586      -};
 587      -
 588      -kstat_named_t *aclproccnt_v4_ptr;
 589      -
 590      -static void
 591      -nfsstat_zone_init_aclproc_v4(zoneid_t zoneid, struct nfs_version_stats *statsp)
 592      -{
 593      -        kstat_named_t *ks_data;
 594      -
 595      -        ks_data = nfsstat_zone_init_common(zoneid, "nfs_acl", 0,
 596      -            "aclproccnt_v4", aclproccnt_v4_tmpl,
 597      -            sizeof (aclproccnt_v4_tmpl));
 598      -        statsp->aclproccnt_ptr = ks_data;
 599      -        if (zoneid == GLOBAL_ZONEID)
 600      -                aclproccnt_v4_ptr = ks_data;
 601      -}
 602      -
 603      -static void
 604      -nfsstat_zone_fini_aclproc_v4(zoneid_t zoneid, struct nfs_version_stats *statsp)
 605      -{
 606      -        if (zoneid == GLOBAL_ZONEID)
 607      -                aclproccnt_v4_ptr = NULL;
 608      -        nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v4");
 609      -        kmem_free(statsp->aclproccnt_ptr, sizeof (aclproccnt_v4_tmpl));
 610      -}
 611      -
 612      -/*
 613  447   * Zone initializer callback to setup the kstats.
 614  448   */
 615  449  void *
 616  450  nfsstat_zone_init(zoneid_t zoneid)
 617  451  {
 618  452          struct nfs_stats *nfs_stats_ptr;
 619  453  
 620  454          nfs_stats_ptr = kmem_zalloc(sizeof (*nfs_stats_ptr), KM_SLEEP);
 621  455  
 622  456          /*
 623      -         * Initialize all versions of the nfs_server
 624      -         */
 625      -        nfsstat_zone_init_server(zoneid, nfs_stats_ptr->nfs_stats_svstat_ptr);
 626      -
 627      -        /*
 628  457           * Initialize v2 stats
 629  458           */
 630  459          nfsstat_zone_init_rfsreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
 631      -        nfsstat_zone_init_rfsproc_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
 632  460          nfsstat_zone_init_aclreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
 633      -        nfsstat_zone_init_aclproc_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
 634  461          /*
 635  462           * Initialize v3 stats
 636  463           */
 637  464          nfsstat_zone_init_rfsreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
 638      -        nfsstat_zone_init_rfsproc_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
 639  465          nfsstat_zone_init_aclreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
 640      -        nfsstat_zone_init_aclproc_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
 641  466          /*
 642  467           * Initialize v4 stats
 643  468           */
 644  469          nfsstat_zone_init_rfsreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
 645      -        nfsstat_zone_init_rfsproc_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
 646  470          nfsstat_zone_init_aclreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
 647      -        nfsstat_zone_init_aclproc_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
 648  471  
 649  472          return (nfs_stats_ptr);
 650  473  }
 651  474  
 652  475  /*
 653  476   * Zone destructor callback to tear down the various kstats.
 654  477   */
 655  478  void
 656  479  nfsstat_zone_fini(zoneid_t zoneid, void *data)
 657  480  {
 658  481          struct nfs_stats *nfs_stats_ptr = data;
 659  482  
 660  483          /*
 661      -         * Free nfs:0:nfs_server stats
 662      -         */
 663      -        nfsstat_zone_fini_server(zoneid, nfs_stats_ptr->nfs_stats_svstat_ptr);
 664      -
 665      -        /*
 666  484           * Free v2 stats
 667  485           */
 668  486          nfsstat_zone_fini_rfsreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
 669      -        nfsstat_zone_fini_rfsproc_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
 670  487          nfsstat_zone_fini_aclreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
 671      -        nfsstat_zone_fini_aclproc_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
 672  488          /*
 673  489           * Free v3 stats
 674  490           */
 675  491          nfsstat_zone_fini_rfsreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
 676      -        nfsstat_zone_fini_rfsproc_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
 677  492          nfsstat_zone_fini_aclreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
 678      -        nfsstat_zone_fini_aclproc_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
 679  493          /*
 680  494           * Free v4 stats
 681  495           */
 682  496          nfsstat_zone_fini_rfsreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
 683      -        nfsstat_zone_fini_rfsproc_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
 684  497          nfsstat_zone_fini_aclreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
 685      -        nfsstat_zone_fini_aclproc_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
 686  498  
 687  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 +
 688  554  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX