aboutsummaryrefslogtreecommitdiffstats
path: root/module/zfs/spa_stats.c
diff options
context:
space:
mode:
authorAndrew <[email protected]>2022-05-18 12:25:33 -0500
committerGitHub <[email protected]>2022-05-18 10:25:33 -0700
commit00ac77464ef15c56b2cffb049518b78545552a9d (patch)
tree139d413920282cdd12f2664fb133af692416f8df /module/zfs/spa_stats.c
parentc0cf6ed6792e545fd614c2a88cb53756db7e03f8 (diff)
Expose zpool guids through kstats
There are times when end-users may wish to have a fast and convenient method to get zpool guid without having to use libzfs. This commit exposes the zpool guid via kstats in similar manner to the zpool state. Reviewed-by: Alexander Motin <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Andrew Walker <[email protected]> Closes #13466
Diffstat (limited to 'module/zfs/spa_stats.c')
-rw-r--r--module/zfs/spa_stats.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/module/zfs/spa_stats.c b/module/zfs/spa_stats.c
index 2a75b37f0..f1d644bc6 100644
--- a/module/zfs/spa_stats.c
+++ b/module/zfs/spa_stats.c
@@ -819,6 +819,41 @@ spa_state_init(spa_t *spa)
kmem_strfree(name);
}
+static int
+spa_guid_data(char *buf, size_t size, void *data)
+{
+ spa_t *spa = (spa_t *)data;
+ (void) snprintf(buf, size, "%llu\n", (u_longlong_t)spa_guid(spa));
+ return (0);
+}
+
+static void
+spa_guid_init(spa_t *spa)
+{
+ spa_history_kstat_t *shk = &spa->spa_stats.guid;
+ char *name;
+ kstat_t *ksp;
+
+ mutex_init(&shk->lock, NULL, MUTEX_DEFAULT, NULL);
+
+ name = kmem_asprintf("zfs/%s", spa_name(spa));
+
+ ksp = kstat_create(name, 0, "guid", "misc",
+ KSTAT_TYPE_RAW, 0, KSTAT_FLAG_VIRTUAL);
+
+ shk->kstat = ksp;
+ if (ksp) {
+ ksp->ks_lock = &shk->lock;
+ ksp->ks_data = NULL;
+ ksp->ks_private = spa;
+ ksp->ks_flags |= KSTAT_FLAG_NO_HEADERS;
+ kstat_set_raw_ops(ksp, NULL, spa_guid_data, spa_state_addr);
+ kstat_install(ksp);
+ }
+
+ kmem_strfree(name);
+}
+
static void
spa_health_destroy(spa_t *spa)
{
@@ -830,6 +865,17 @@ spa_health_destroy(spa_t *spa)
mutex_destroy(&shk->lock);
}
+static void
+spa_guid_destroy(spa_t *spa)
+{
+ spa_history_kstat_t *shk = &spa->spa_stats.guid;
+ kstat_t *ksp = shk->kstat;
+ if (ksp)
+ kstat_delete(ksp);
+
+ mutex_destroy(&shk->lock);
+}
+
static const spa_iostats_t spa_iostats_template = {
{ "trim_extents_written", KSTAT_DATA_UINT64 },
{ "trim_bytes_written", KSTAT_DATA_UINT64 },
@@ -950,6 +996,7 @@ spa_stats_init(spa_t *spa)
spa_tx_assign_init(spa);
spa_mmp_history_init(spa);
spa_state_init(spa);
+ spa_guid_init(spa);
spa_iostats_init(spa);
}
@@ -962,6 +1009,7 @@ spa_stats_destroy(spa_t *spa)
spa_txg_history_destroy(spa);
spa_read_history_destroy(spa);
spa_mmp_history_destroy(spa);
+ spa_guid_destroy(spa);
}
ZFS_MODULE_PARAM(zfs, zfs_, read_history, INT, ZMOD_RW,