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
        
*** 87,128 ****
          { "badcalls",   KSTAT_DATA_UINT64 },
          { "referrals",  KSTAT_DATA_UINT64 },
          { "referlinks", KSTAT_DATA_UINT64 },
  };
  
- /* Points to the global zone server kstat data for all nfs versions */
- kstat_named_t *global_svstat_ptr[NFS_VERSMAX + 1];
- 
  static void
  nfsstat_zone_init_server(zoneid_t zoneid, kstat_named_t *svstatp[])
  {
          int vers;
  
-         /*
-          * first two indexes of these arrays are not used, so initialize
-          * to NULL
-          */
-         svstatp[0] = NULL;
-         svstatp[1] = NULL;
-         global_svstat_ptr[0] = NULL;
-         global_svstat_ptr[0] = NULL;
- 
          for (vers = NFS_VERSION; vers <= NFS_V4; vers++) {
                  svstatp[vers] = nfsstat_zone_init_common(zoneid, "nfs", vers,
                      "nfs_server", svstat_tmpl, sizeof (svstat_tmpl));
-                 if (zoneid == GLOBAL_ZONEID)
-                         global_svstat_ptr[vers] = svstatp[vers];
          }
  }
  
  static void
! nfsstat_zone_fini_server(zoneid_t zoneid, kstat_named_t **svstatp)
  {
          int vers;
          for (vers = NFS_VERSION; vers <= NFS_V4; vers++) {
-                 if (zoneid == GLOBAL_ZONEID)
-                         global_svstat_ptr[vers] = NULL;
                  nfsstat_zone_fini_common(zoneid, "nfs", vers, "nfs_server");
                  kmem_free(svstatp[vers], sizeof (svstat_tmpl));
          }
  }
  
--- 87,112 ----
          { "badcalls",   KSTAT_DATA_UINT64 },
          { "referrals",  KSTAT_DATA_UINT64 },
          { "referlinks", KSTAT_DATA_UINT64 },
  };
  
  static void
  nfsstat_zone_init_server(zoneid_t zoneid, kstat_named_t *svstatp[])
  {
          int vers;
  
          for (vers = NFS_VERSION; vers <= NFS_V4; vers++) {
                  svstatp[vers] = nfsstat_zone_init_common(zoneid, "nfs", vers,
                      "nfs_server", svstat_tmpl, sizeof (svstat_tmpl));
          }
  }
  
  static void
! nfsstat_zone_fini_server(zoneid_t zoneid, kstat_named_t *svstatp[])
  {
          int vers;
          for (vers = NFS_VERSION; vers <= NFS_V4; vers++) {
                  nfsstat_zone_fini_common(zoneid, "nfs", vers, "nfs_server");
                  kmem_free(svstatp[vers], sizeof (svstat_tmpl));
          }
  }
  
*** 186,218 ****
          { "rmdir",      KSTAT_DATA_UINT64 },
          { "readdir",    KSTAT_DATA_UINT64 },
          { "statfs",     KSTAT_DATA_UINT64 }
  };
  
- kstat_named_t *rfsproccnt_v2_ptr;
- 
- static void
- nfsstat_zone_init_rfsproc_v2(zoneid_t zoneid, struct nfs_version_stats *statsp)
- {
-         kstat_named_t *ks_data;
- 
-         ks_data = nfsstat_zone_init_common(zoneid, "nfs", 0, "rfsproccnt_v2",
-             rfsproccnt_v2_tmpl, sizeof (rfsproccnt_v2_tmpl));
-         statsp->rfsproccnt_ptr = ks_data;
-         if (zoneid == GLOBAL_ZONEID)
-                 rfsproccnt_v2_ptr = ks_data;
- }
- 
- static void
- nfsstat_zone_fini_rfsproc_v2(zoneid_t zoneid, struct nfs_version_stats *statsp)
- {
-         if (zoneid == GLOBAL_ZONEID)
-                 rfsproccnt_v2_ptr = NULL;
-         nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v2");
-         kmem_free(statsp->rfsproccnt_ptr, sizeof (rfsproccnt_v2_tmpl));
- }
- 
  /*
   * NFSv2 client ACL stats
   */
  static const kstat_named_t aclreqcnt_v2_tmpl[] = {
          { "null",       KSTAT_DATA_UINT64 },
--- 170,179 ----
*** 247,280 ****
          { "getattr",    KSTAT_DATA_UINT64 },
          { "access",     KSTAT_DATA_UINT64 },
          { "getxattrdir",        KSTAT_DATA_UINT64 }
  };
  
- kstat_named_t *aclproccnt_v2_ptr;
- 
- static void
- nfsstat_zone_init_aclproc_v2(zoneid_t zoneid, struct nfs_version_stats *statsp)
- {
-         kstat_named_t *ks_data;
- 
-         ks_data = nfsstat_zone_init_common(zoneid, "nfs_acl", 0,
-             "aclproccnt_v2", aclproccnt_v2_tmpl,
-             sizeof (aclproccnt_v2_tmpl));
-         statsp->aclproccnt_ptr = ks_data;
-         if (zoneid == GLOBAL_ZONEID)
-                 aclproccnt_v2_ptr = ks_data;
- }
- 
- static void
- nfsstat_zone_fini_aclproc_v2(zoneid_t zoneid, struct nfs_version_stats *statsp)
- {
-         if (zoneid == GLOBAL_ZONEID)
-                 aclproccnt_v2_ptr = NULL;
-         nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v2");
-         kmem_free(statsp->aclproccnt_ptr, sizeof (aclproccnt_v2_tmpl));
- }
- 
  /*
   * NFSv3 client stats
   */
  static const kstat_named_t rfsreqcnt_v3_tmpl[] = {
          { "null",       KSTAT_DATA_UINT64 },
--- 208,217 ----
*** 341,373 ****
          { "fsinfo",     KSTAT_DATA_UINT64 },
          { "pathconf",   KSTAT_DATA_UINT64 },
          { "commit",     KSTAT_DATA_UINT64 }
  };
  
- kstat_named_t *rfsproccnt_v3_ptr;
- 
- static void
- nfsstat_zone_init_rfsproc_v3(zoneid_t zoneid, struct nfs_version_stats *statsp)
- {
-         kstat_named_t *ks_data;
- 
-         ks_data = nfsstat_zone_init_common(zoneid, "nfs", 0, "rfsproccnt_v3",
-             rfsproccnt_v3_tmpl, sizeof (rfsproccnt_v3_tmpl));
-         statsp->rfsproccnt_ptr = ks_data;
-         if (zoneid == GLOBAL_ZONEID)
-                 rfsproccnt_v3_ptr = ks_data;
- }
- 
- static void
- nfsstat_zone_fini_rfsproc_v3(zoneid_t zoneid, struct nfs_version_stats *statsp)
- {
-         if (zoneid == GLOBAL_ZONEID)
-                 rfsproccnt_v3_ptr = NULL;
-         nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v3");
-         kmem_free(statsp->rfsproccnt_ptr, sizeof (rfsproccnt_v3_tmpl));
- }
- 
  /*
   * NFSv3 client ACL stats
   */
  static const kstat_named_t aclreqcnt_v3_tmpl[] = {
          { "null",       KSTAT_DATA_UINT64 },
--- 278,287 ----
*** 398,431 ****
          { "getacl",     KSTAT_DATA_UINT64 },
          { "setacl",     KSTAT_DATA_UINT64 },
          { "getxattrdir",        KSTAT_DATA_UINT64 }
  };
  
- kstat_named_t *aclproccnt_v3_ptr;
- 
- static void
- nfsstat_zone_init_aclproc_v3(zoneid_t zoneid, struct nfs_version_stats *statsp)
- {
-         kstat_named_t *ks_data;
- 
-         ks_data = nfsstat_zone_init_common(zoneid, "nfs_acl", 0,
-             "aclproccnt_v3", aclproccnt_v3_tmpl,
-             sizeof (aclproccnt_v3_tmpl));
-         statsp->aclproccnt_ptr = ks_data;
-         if (zoneid == GLOBAL_ZONEID)
-                 aclproccnt_v3_ptr = ks_data;
- }
- 
- static void
- nfsstat_zone_fini_aclproc_v3(zoneid_t zoneid, struct nfs_version_stats *statsp)
- {
-         if (zoneid == GLOBAL_ZONEID)
-                 aclproccnt_v3_ptr = NULL;
-         nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v3");
-         kmem_free(statsp->aclproccnt_ptr, sizeof (aclproccnt_v3_tmpl));
- }
- 
  /*
   * NFSv4 client stats
   */
  static const kstat_named_t rfsreqcnt_v4_tmpl[] = {
          { "null",       KSTAT_DATA_UINT64 },
--- 312,321 ----
*** 528,560 ****
          { "write",      KSTAT_DATA_UINT64 },
          { "release_lockowner",  KSTAT_DATA_UINT64 },
          { "illegal",    KSTAT_DATA_UINT64 },
  };
  
- kstat_named_t *rfsproccnt_v4_ptr;
- 
- static void
- nfsstat_zone_init_rfsproc_v4(zoneid_t zoneid, struct nfs_version_stats *statsp)
- {
-         kstat_named_t *ks_data;
- 
-         ks_data = nfsstat_zone_init_common(zoneid, "nfs", 0, "rfsproccnt_v4",
-             rfsproccnt_v4_tmpl, sizeof (rfsproccnt_v4_tmpl));
-         statsp->rfsproccnt_ptr = ks_data;
-         if (zoneid == GLOBAL_ZONEID)
-                 rfsproccnt_v4_ptr = ks_data;
- }
- 
- static void
- nfsstat_zone_fini_rfsproc_v4(zoneid_t zoneid, struct nfs_version_stats *statsp)
- {
-         if (zoneid == GLOBAL_ZONEID)
-                 rfsproccnt_v4_ptr = NULL;
-         nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v4");
-         kmem_free(statsp->rfsproccnt_ptr, sizeof (rfsproccnt_v4_tmpl));
- }
- 
  /*
   * NFSv4 client ACL stats
   */
  static const kstat_named_t aclreqcnt_v4_tmpl[] = {
          { "null",       KSTAT_DATA_UINT64 },
--- 418,427 ----
*** 575,617 ****
          nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclreqcnt_v4");
          kmem_free(statsp->aclreqcnt_ptr, sizeof (aclreqcnt_v4_tmpl));
  }
  
  /*
-  * NFSv4 server ACL stats
-  */
- static const kstat_named_t aclproccnt_v4_tmpl[] = {
-         { "null",       KSTAT_DATA_UINT64 },
-         { "getacl",     KSTAT_DATA_UINT64 },
-         { "setacl",     KSTAT_DATA_UINT64 }
- };
- 
- kstat_named_t *aclproccnt_v4_ptr;
- 
- static void
- nfsstat_zone_init_aclproc_v4(zoneid_t zoneid, struct nfs_version_stats *statsp)
- {
-         kstat_named_t *ks_data;
- 
-         ks_data = nfsstat_zone_init_common(zoneid, "nfs_acl", 0,
-             "aclproccnt_v4", aclproccnt_v4_tmpl,
-             sizeof (aclproccnt_v4_tmpl));
-         statsp->aclproccnt_ptr = ks_data;
-         if (zoneid == GLOBAL_ZONEID)
-                 aclproccnt_v4_ptr = ks_data;
- }
- 
- static void
- nfsstat_zone_fini_aclproc_v4(zoneid_t zoneid, struct nfs_version_stats *statsp)
- {
-         if (zoneid == GLOBAL_ZONEID)
-                 aclproccnt_v4_ptr = NULL;
-         nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v4");
-         kmem_free(statsp->aclproccnt_ptr, sizeof (aclproccnt_v4_tmpl));
- }
- 
- /*
   * Zone initializer callback to setup the kstats.
   */
  void *
  nfsstat_zone_init(zoneid_t zoneid)
  {
--- 442,451 ----
*** 618,652 ****
          struct nfs_stats *nfs_stats_ptr;
  
          nfs_stats_ptr = kmem_zalloc(sizeof (*nfs_stats_ptr), KM_SLEEP);
  
          /*
-          * Initialize all versions of the nfs_server
-          */
-         nfsstat_zone_init_server(zoneid, nfs_stats_ptr->nfs_stats_svstat_ptr);
- 
-         /*
           * Initialize v2 stats
           */
          nfsstat_zone_init_rfsreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
-         nfsstat_zone_init_rfsproc_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
          nfsstat_zone_init_aclreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
-         nfsstat_zone_init_aclproc_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
          /*
           * Initialize v3 stats
           */
          nfsstat_zone_init_rfsreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
-         nfsstat_zone_init_rfsproc_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
          nfsstat_zone_init_aclreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
-         nfsstat_zone_init_aclproc_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
          /*
           * Initialize v4 stats
           */
          nfsstat_zone_init_rfsreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
-         nfsstat_zone_init_rfsproc_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
          nfsstat_zone_init_aclreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
-         nfsstat_zone_init_aclproc_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
  
          return (nfs_stats_ptr);
  }
  
  /*
--- 452,475 ----
*** 656,688 ****
  nfsstat_zone_fini(zoneid_t zoneid, void *data)
  {
          struct nfs_stats *nfs_stats_ptr = data;
  
          /*
-          * Free nfs:0:nfs_server stats
-          */
-         nfsstat_zone_fini_server(zoneid, nfs_stats_ptr->nfs_stats_svstat_ptr);
- 
-         /*
           * Free v2 stats
           */
          nfsstat_zone_fini_rfsreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
-         nfsstat_zone_fini_rfsproc_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
          nfsstat_zone_fini_aclreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
-         nfsstat_zone_fini_aclproc_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
          /*
           * Free v3 stats
           */
          nfsstat_zone_fini_rfsreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
-         nfsstat_zone_fini_rfsproc_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
          nfsstat_zone_fini_aclreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
-         nfsstat_zone_fini_aclproc_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
          /*
           * Free v4 stats
           */
          nfsstat_zone_fini_rfsreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
-         nfsstat_zone_fini_rfsproc_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
          nfsstat_zone_fini_aclreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
-         nfsstat_zone_fini_aclproc_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
  
          kmem_free(nfs_stats_ptr, sizeof (*nfs_stats_ptr));
  }
--- 479,554 ----
  nfsstat_zone_fini(zoneid_t zoneid, void *data)
  {
          struct nfs_stats *nfs_stats_ptr = data;
  
          /*
           * Free v2 stats
           */
          nfsstat_zone_fini_rfsreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
          nfsstat_zone_fini_aclreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2);
          /*
           * Free v3 stats
           */
          nfsstat_zone_fini_rfsreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
          nfsstat_zone_fini_aclreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3);
          /*
           * Free v4 stats
           */
          nfsstat_zone_fini_rfsreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
          nfsstat_zone_fini_aclreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4);
  
          kmem_free(nfs_stats_ptr, sizeof (*nfs_stats_ptr));
+ }
+ 
+ void
+ rfs_stat_zone_init(nfs_globals_t *ng)
+ {
+         zoneid_t zoneid = ng->nfs_zoneid;
+ 
+         /* Initialize all versions of the nfs_server */
+         nfsstat_zone_init_server(zoneid, ng->svstat);
+ 
+         /* NFS proc */
+         ng->rfsproccnt[NFS_V2] = nfsstat_zone_init_common(zoneid, "nfs", 0,
+             "rfsproccnt_v2", rfsproccnt_v2_tmpl, sizeof (rfsproccnt_v2_tmpl));
+ 
+         ng->rfsproccnt[NFS_V3] = nfsstat_zone_init_common(zoneid, "nfs", 0,
+             "rfsproccnt_v3", rfsproccnt_v3_tmpl, sizeof (rfsproccnt_v3_tmpl));
+ 
+         ng->rfsproccnt[NFS_V4] = nfsstat_zone_init_common(zoneid, "nfs", 0,
+             "rfsproccnt_v4", rfsproccnt_v4_tmpl, sizeof (rfsproccnt_v4_tmpl));
+ 
+         /* ACL proc */
+         ng->aclproccnt[NFS_V2] = nfsstat_zone_init_common(zoneid, "nfs_acl", 0,
+             "aclproccnt_v2", aclproccnt_v2_tmpl, sizeof (aclproccnt_v2_tmpl));
+ 
+         ng->aclproccnt[NFS_V3] = nfsstat_zone_init_common(zoneid, "nfs_acl", 0,
+             "aclproccnt_v3", aclproccnt_v3_tmpl, sizeof (aclproccnt_v3_tmpl));
+ 
+ }
+ 
+ void
+ rfs_stat_zone_fini(nfs_globals_t *ng)
+ {
+         zoneid_t zoneid = ng->nfs_zoneid;
+ 
+         /* Free nfs:x:nfs_server stats */
+         nfsstat_zone_fini_server(zoneid, ng->svstat);
+ 
+         /* NFS */
+         nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v2");
+         kmem_free(ng->rfsproccnt[NFS_V2], sizeof (rfsproccnt_v2_tmpl));
+ 
+         nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v3");
+         kmem_free(ng->rfsproccnt[NFS_V3], sizeof (rfsproccnt_v3_tmpl));
+ 
+         nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v4");
+         kmem_free(ng->rfsproccnt[NFS_V4], sizeof (rfsproccnt_v4_tmpl));
+ 
+         /* ACL */
+         nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v2");
+         kmem_free(ng->aclproccnt[NFS_V2], sizeof (aclproccnt_v2_tmpl));
+ 
+         nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v3");
+         kmem_free(ng->aclproccnt[NFS_V3], sizeof (aclproccnt_v3_tmpl));
+ 
  }