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,42 +87,26 @@
         { "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)
+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));
         }
 }
 
@@ -186,33 +170,10 @@
         { "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 },
@@ -247,34 +208,10 @@
         { "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 },
@@ -341,33 +278,10 @@
         { "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 },
@@ -398,34 +312,10 @@
         { "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 },
@@ -528,33 +418,10 @@
         { "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 },
@@ -575,43 +442,10 @@
         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)
 {
@@ -618,35 +452,24 @@
         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);
 }
 
 /*
@@ -656,33 +479,76 @@
 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));
+}
+
+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));
+
 }