Skip to content

Commit

Permalink
Expose zpool guids through kstats
Browse files Browse the repository at this point in the history
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.

Signed-off-by: Andrew Walker <awalker@ixsystems.com>
  • Loading branch information
anodos325 committed May 17, 2022
1 parent de82164 commit 4cac186
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/sys/spa.h
Expand Up @@ -898,6 +898,7 @@ typedef struct spa_stats {
spa_history_kstat_t tx_assign_histogram;
spa_history_list_t mmp_history;
spa_history_kstat_t state; /* pool state */
spa_history_kstat_t guid; /* pool guid */
spa_history_kstat_t iostats;
} spa_stats_t;

Expand Down
48 changes: 48 additions & 0 deletions module/zfs/spa_stats.c
Expand Up @@ -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)
{
Expand All @@ -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 },
Expand Down Expand Up @@ -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);
}

Expand All @@ -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,
Expand Down

0 comments on commit 4cac186

Please sign in to comment.