--- old/usr/src/uts/common/fs/nfs/nfs_stats.c	Sat Jan 18 15:07:21 2020
+++ new/usr/src/uts/common/fs/nfs/nfs_stats.c	Sat Jan 18 15:07:21 2020
@@ -45,8 +45,8 @@
  */
 static kstat_named_t *
 nfsstat_zone_init_common(zoneid_t zoneid, const char *module, int vers,
-			    const char *name, const kstat_named_t *template,
-			    size_t template_size)
+    const char *name, const kstat_named_t *template,
+    size_t template_size)
 {
 	kstat_t *ksp;
 	kstat_named_t *ks_data;
@@ -68,7 +68,7 @@
  */
 static void
 nfsstat_zone_fini_common(zoneid_t zoneid, const char *module, int vers,
-			    const char *name)
+    const char *name)
 {
 	kstat_delete_byname_zone(module, vers, name, zoneid);
 }
@@ -89,38 +89,22 @@
 	{ "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));
 	}
@@ -188,29 +172,6 @@
 	{ "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
  */
@@ -249,30 +210,6 @@
 	{ "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
  */
@@ -343,29 +280,6 @@
 	{ "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
  */
@@ -400,30 +314,6 @@
 	{ "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
  */
@@ -530,29 +420,6 @@
 	{ "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
  */
@@ -577,39 +444,6 @@
 }
 
 /*
- * 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 *
@@ -620,31 +454,20 @@
 	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);
 }
@@ -658,31 +481,74 @@
 	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));
+
 }
