6812512 namespace collision for sockfs kstats
diff --git a/usr/src/uts/common/fs/sockfs/sockparams.c b/usr/src/uts/common/fs/sockfs/sockparams.c
index 50df715..e20870d 100644
--- a/usr/src/uts/common/fs/sockfs/sockparams.c
+++ b/usr/src/uts/common/fs/sockfs/sockparams.c
@@ -135,13 +135,6 @@
{
char name[KSTAT_STRLEN];
- kstat_named_init(&sp->sp_stats.sps_nfallback, "nfallback",
- KSTAT_DATA_UINT64);
- kstat_named_init(&sp->sp_stats.sps_nactive, "nactive",
- KSTAT_DATA_UINT64);
- kstat_named_init(&sp->sp_stats.sps_ncreate, "ncreate",
- KSTAT_DATA_UINT64);
-
(void) snprintf(name, KSTAT_STRLEN, "socket_%d_%d_%d", sp->sp_family,
sp->sp_type, sp->sp_protocol);
@@ -227,14 +220,18 @@
sp->sp_refcnt = 0;
sp->sp_flags = flags;
+ kstat_named_init(&sp->sp_stats.sps_nfallback, "nfallback",
+ KSTAT_DATA_UINT64);
+ kstat_named_init(&sp->sp_stats.sps_nactive, "nactive",
+ KSTAT_DATA_UINT64);
+ kstat_named_init(&sp->sp_stats.sps_ncreate, "ncreate",
+ KSTAT_DATA_UINT64);
+
/*
- * We do not create kstats for ephemeral entries, but we do keep
- * track how many we have created.
+ * Track how many ephemeral entries we have created.
*/
if (sp->sp_flags & SOCKPARAMS_EPHEMERAL)
sp_g_stats.spgs_ephem_nalloc.value.ui64++;
- else
- sockparams_kstat_init(sp);
if (modname != NULL) {
sp->sp_smod_name = modname;
@@ -265,10 +262,8 @@
kmem_free(modname, strlen(modname) + 1);
if (devpathlen != 0)
kmem_free(devpath, devpathlen);
- if (sp != NULL) {
- sockparams_kstat_fini(sp);
+ if (sp != NULL)
kmem_free(sp, sizeof (*sp));
- }
return (NULL);
}
@@ -669,9 +664,24 @@
devpath, devpathlen, 0, KM_SLEEP, &error);
if (sp != NULL) {
+ /*
+ * The sockparams entry becomes globally visible once
+ * we call sockparams_add(). So we add a reference so
+ * we do not have to worry about the entry being
+ * immediately deleted.
+ */
+ SOCKPARAMS_INC_REF(sp);
error = sockparams_add(sp);
- if (error != 0)
+ if (error != 0) {
+ SOCKPARAMS_DEC_REF(sp);
sockparams_destroy(sp);
+ } else {
+ /*
+ * Unique sockparams entry, so init the kstats.
+ */
+ sockparams_kstat_init(sp);
+ SOCKPARAMS_DEC_REF(sp);
+ }
}
}