svn commit: r365860 - stable/12/sys/cddl/compat/opensolaris/kern

Allan Jude allanjude at FreeBSD.org
Thu Sep 17 21:51:06 UTC 2020


Author: allanjude
Date: Thu Sep 17 21:51:05 2020
New Revision: 365860
URL: https://svnweb.freebsd.org/changeset/base/365860

Log:
  Update naming of per-dataset counters introduced in r365689
  
  Upstream OpenZFS is changing the structure of the sysctl mibs to avoid
  having a / in the element name. Chase this change here to avoid introducing
  a new sysctl that will change named between 12.2 and 13.0
  
  MFC-with:	365689
  Relnotes:	yes (fix example)
  Sponsored by:	Klara Inc.

Modified:
  stable/12/sys/cddl/compat/opensolaris/kern/opensolaris_kstat.c

Modified: stable/12/sys/cddl/compat/opensolaris/kern/opensolaris_kstat.c
==============================================================================
--- stable/12/sys/cddl/compat/opensolaris/kern/opensolaris_kstat.c	Thu Sep 17 21:24:11 2020	(r365859)
+++ stable/12/sys/cddl/compat/opensolaris/kern/opensolaris_kstat.c	Thu Sep 17 21:51:05 2020	(r365860)
@@ -55,6 +55,7 @@ kstat_create(char *module, int instance, char *name, c
 {
 	struct sysctl_oid *root;
 	kstat_t *ksp;
+	char *pool;
 
 	KASSERT(instance == 0, ("instance=%d", instance));
 	KASSERT(type == KSTAT_TYPE_NAMED, ("type=%hhu", type));
@@ -70,9 +71,18 @@ kstat_create(char *module, int instance, char *name, c
 	ksp->ks_update = kstat_default_update;
 
 	/*
+	 * Some kstats use a module name like "zfs/poolname" to distinguish a
+	 * set of kstats belonging to a specific pool.  Split on '/' to add an
+	 * extra node for the pool name if needed.
+	 */
+	pool = strchr(module, '/');
+	if (pool != NULL)
+		*pool++ = '\0';
+
+	/*
 	 * Create sysctl tree for those statistics:
 	 *
-	 *	kstat.<module>.<class>.<name>.
+	 *	kstat.<module>[.<pool>].<class>.<name>
 	 */
 	sysctl_ctx_init(&ksp->ks_sysctl_ctx);
 	root = SYSCTL_ADD_NODE(&ksp->ks_sysctl_ctx,
@@ -84,11 +94,26 @@ kstat_create(char *module, int instance, char *name, c
 		free(ksp, M_KSTAT);
 		return (NULL);
 	}
+	if (pool != NULL) {
+		root = SYSCTL_ADD_NODE(&ksp->ks_sysctl_ctx,
+		    SYSCTL_CHILDREN(root), OID_AUTO, pool, CTLFLAG_RW, 0, "");
+		if (root == NULL) {
+			printf("%s: Cannot create kstat.%s.%s tree!\n",
+			    __func__, module, pool);
+			sysctl_ctx_free(&ksp->ks_sysctl_ctx);
+			free(ksp, M_KSTAT);
+			return (NULL);
+		}
+	}
 	root = SYSCTL_ADD_NODE(&ksp->ks_sysctl_ctx, SYSCTL_CHILDREN(root),
 	    OID_AUTO, class, CTLFLAG_RW, 0, "");
 	if (root == NULL) {
-		printf("%s: Cannot create kstat.%s.%s tree!\n", __func__,
-		    module, class);
+		if (pool != NULL)
+			printf("%s: Cannot create kstat.%s.%s.%s tree!\n",
+			    __func__, module, pool, class);
+		else
+			printf("%s: Cannot create kstat.%s.%s tree!\n",
+			    __func__, module, class);
 		sysctl_ctx_free(&ksp->ks_sysctl_ctx);
 		free(ksp, M_KSTAT);
 		return (NULL);
@@ -96,8 +121,13 @@ kstat_create(char *module, int instance, char *name, c
 	root = SYSCTL_ADD_NODE(&ksp->ks_sysctl_ctx, SYSCTL_CHILDREN(root),
 	    OID_AUTO, name, CTLFLAG_RW, 0, "");
 	if (root == NULL) {
-		printf("%s: Cannot create kstat.%s.%s.%s tree!\n", __func__,
-		    module, class, name);
+		if (pool != NULL)
+			printf("%s: Cannot create kstat.%s.%s.%s.%s "
+			    "tree!\n", __func__, module, pool, class,
+			    name);
+		else
+			printf("%s: Cannot create kstat.%s.%s.%s "
+			    "tree!\n", __func__, module, class, name);
 		sysctl_ctx_free(&ksp->ks_sysctl_ctx);
 		free(ksp, M_KSTAT);
 		return (NULL);


More information about the svn-src-all mailing list