Allow longer SPA names in stats

The pool name can be 256 chars long. Today, in /proc/spl/kstat/zfs/
the name is limited to < 32 characters. This change is to allows
bigger pool names.

Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Reviewed-by: loli10K <ezomori.nozomu@gmail.com>
Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: gaurkuma <gauravk.18@gmail.com>
Closes #6481
This commit is contained in:
gaurkuma 2017-08-11 08:56:24 -07:00 committed by Brian Behlendorf
parent c25b8f99f8
commit 761b8ec6bf
3 changed files with 22 additions and 16 deletions

View File

@ -59,7 +59,7 @@ typedef int kid_t; /* unique kstat id */
* kcid = ioctl(kd, KSTAT_IOC_WRITE, kstat_t *); * kcid = ioctl(kd, KSTAT_IOC_WRITE, kstat_t *);
*/ */
#define KSTAT_STRLEN 31 /* 30 chars + NULL; must be 16 * n - 1 */ #define KSTAT_STRLEN 255 /* 254 chars + NULL; must be 16 * n - 1 */
/* /*
* The generic kstat header * The generic kstat header

View File

@ -111,7 +111,7 @@ int
crypto_register_provider(crypto_provider_info_t *info, crypto_register_provider(crypto_provider_info_t *info,
crypto_kcf_provider_handle_t *handle) crypto_kcf_provider_handle_t *handle)
{ {
char ks_name[KSTAT_STRLEN]; char *ks_name;
kcf_provider_desc_t *prov_desc = NULL; kcf_provider_desc_t *prov_desc = NULL;
int ret = CRYPTO_ARGUMENTS_BAD; int ret = CRYPTO_ARGUMENTS_BAD;
@ -238,12 +238,12 @@ crypto_register_provider(crypto_provider_info_t *info,
* This kstat is deleted, when the provider unregisters. * This kstat is deleted, when the provider unregisters.
*/ */
if (prov_desc->pd_prov_type == CRYPTO_SW_PROVIDER) { if (prov_desc->pd_prov_type == CRYPTO_SW_PROVIDER) {
(void) snprintf(ks_name, KSTAT_STRLEN, "%s_%s", ks_name = kmem_asprintf("%s_%s",
"NONAME", "provider_stats"); "NONAME", "provider_stats");
} else { } else {
(void) snprintf(ks_name, KSTAT_STRLEN, "%s_%d_%u_%s", ks_name = kmem_asprintf("%s_%d_%u_%s",
"NONAME", 0, "NONAME", 0, prov_desc->pd_prov_id,
prov_desc->pd_prov_id, "provider_stats"); "provider_stats");
} }
prov_desc->pd_kstat = kstat_create("kcf", 0, ks_name, "crypto", prov_desc->pd_kstat = kstat_create("kcf", 0, ks_name, "crypto",
@ -261,6 +261,7 @@ crypto_register_provider(crypto_provider_info_t *info,
prov_desc->pd_kstat->ks_update = kcf_prov_kstat_update; prov_desc->pd_kstat->ks_update = kcf_prov_kstat_update;
kstat_install(prov_desc->pd_kstat); kstat_install(prov_desc->pd_kstat);
} }
strfree(ks_name);
} }
if (prov_desc->pd_prov_type == CRYPTO_HW_PROVIDER) if (prov_desc->pd_prov_type == CRYPTO_HW_PROVIDER)

View File

@ -142,7 +142,7 @@ static void
spa_read_history_init(spa_t *spa) spa_read_history_init(spa_t *spa)
{ {
spa_stats_history_t *ssh = &spa->spa_stats.read_history; spa_stats_history_t *ssh = &spa->spa_stats.read_history;
char name[KSTAT_STRLEN]; char *name;
kstat_t *ksp; kstat_t *ksp;
mutex_init(&ssh->lock, NULL, MUTEX_DEFAULT, NULL); mutex_init(&ssh->lock, NULL, MUTEX_DEFAULT, NULL);
@ -153,7 +153,7 @@ spa_read_history_init(spa_t *spa)
ssh->size = 0; ssh->size = 0;
ssh->private = NULL; ssh->private = NULL;
(void) snprintf(name, KSTAT_STRLEN, "zfs/%s", spa_name(spa)); name = kmem_asprintf("zfs/%s", spa_name(spa));
ksp = kstat_create(name, 0, "reads", "misc", ksp = kstat_create(name, 0, "reads", "misc",
KSTAT_TYPE_RAW, 0, KSTAT_FLAG_VIRTUAL); KSTAT_TYPE_RAW, 0, KSTAT_FLAG_VIRTUAL);
@ -168,6 +168,7 @@ spa_read_history_init(spa_t *spa)
spa_read_history_data, spa_read_history_addr); spa_read_history_data, spa_read_history_addr);
kstat_install(ksp); kstat_install(ksp);
} }
strfree(name);
} }
static void static void
@ -365,7 +366,7 @@ static void
spa_txg_history_init(spa_t *spa) spa_txg_history_init(spa_t *spa)
{ {
spa_stats_history_t *ssh = &spa->spa_stats.txg_history; spa_stats_history_t *ssh = &spa->spa_stats.txg_history;
char name[KSTAT_STRLEN]; char *name;
kstat_t *ksp; kstat_t *ksp;
mutex_init(&ssh->lock, NULL, MUTEX_DEFAULT, NULL); mutex_init(&ssh->lock, NULL, MUTEX_DEFAULT, NULL);
@ -376,7 +377,7 @@ spa_txg_history_init(spa_t *spa)
ssh->size = 0; ssh->size = 0;
ssh->private = NULL; ssh->private = NULL;
(void) snprintf(name, KSTAT_STRLEN, "zfs/%s", spa_name(spa)); name = kmem_asprintf("zfs/%s", spa_name(spa));
ksp = kstat_create(name, 0, "txgs", "misc", ksp = kstat_create(name, 0, "txgs", "misc",
KSTAT_TYPE_RAW, 0, KSTAT_FLAG_VIRTUAL); KSTAT_TYPE_RAW, 0, KSTAT_FLAG_VIRTUAL);
@ -391,6 +392,7 @@ spa_txg_history_init(spa_t *spa)
spa_txg_history_data, spa_txg_history_addr); spa_txg_history_data, spa_txg_history_addr);
kstat_install(ksp); kstat_install(ksp);
} }
strfree(name);
} }
static void static void
@ -598,7 +600,7 @@ static void
spa_tx_assign_init(spa_t *spa) spa_tx_assign_init(spa_t *spa)
{ {
spa_stats_history_t *ssh = &spa->spa_stats.tx_assign_histogram; spa_stats_history_t *ssh = &spa->spa_stats.tx_assign_histogram;
char name[KSTAT_STRLEN]; char *name;
kstat_named_t *ks; kstat_named_t *ks;
kstat_t *ksp; kstat_t *ksp;
int i; int i;
@ -609,7 +611,7 @@ spa_tx_assign_init(spa_t *spa)
ssh->size = ssh->count * sizeof (kstat_named_t); ssh->size = ssh->count * sizeof (kstat_named_t);
ssh->private = kmem_alloc(ssh->size, KM_SLEEP); ssh->private = kmem_alloc(ssh->size, KM_SLEEP);
(void) snprintf(name, KSTAT_STRLEN, "zfs/%s", spa_name(spa)); name = kmem_asprintf("zfs/%s", spa_name(spa));
for (i = 0; i < ssh->count; i++) { for (i = 0; i < ssh->count; i++) {
ks = &((kstat_named_t *)ssh->private)[i]; ks = &((kstat_named_t *)ssh->private)[i];
@ -632,6 +634,7 @@ spa_tx_assign_init(spa_t *spa)
ksp->ks_update = spa_tx_assign_update; ksp->ks_update = spa_tx_assign_update;
kstat_install(ksp); kstat_install(ksp);
} }
strfree(name);
} }
static void static void
@ -678,12 +681,12 @@ static void
spa_io_history_init(spa_t *spa) spa_io_history_init(spa_t *spa)
{ {
spa_stats_history_t *ssh = &spa->spa_stats.io_history; spa_stats_history_t *ssh = &spa->spa_stats.io_history;
char name[KSTAT_STRLEN]; char *name;
kstat_t *ksp; kstat_t *ksp;
mutex_init(&ssh->lock, NULL, MUTEX_DEFAULT, NULL); mutex_init(&ssh->lock, NULL, MUTEX_DEFAULT, NULL);
(void) snprintf(name, KSTAT_STRLEN, "zfs/%s", spa_name(spa)); name = kmem_asprintf("zfs/%s", spa_name(spa));
ksp = kstat_create(name, 0, "io", "disk", KSTAT_TYPE_IO, 1, 0); ksp = kstat_create(name, 0, "io", "disk", KSTAT_TYPE_IO, 1, 0);
ssh->kstat = ksp; ssh->kstat = ksp;
@ -694,6 +697,7 @@ spa_io_history_init(spa_t *spa)
ksp->ks_update = spa_io_history_update; ksp->ks_update = spa_io_history_update;
kstat_install(ksp); kstat_install(ksp);
} }
strfree(name);
} }
static void static void
@ -806,7 +810,7 @@ static void
spa_mmp_history_init(spa_t *spa) spa_mmp_history_init(spa_t *spa)
{ {
spa_stats_history_t *ssh = &spa->spa_stats.mmp_history; spa_stats_history_t *ssh = &spa->spa_stats.mmp_history;
char name[KSTAT_STRLEN]; char *name;
kstat_t *ksp; kstat_t *ksp;
mutex_init(&ssh->lock, NULL, MUTEX_DEFAULT, NULL); mutex_init(&ssh->lock, NULL, MUTEX_DEFAULT, NULL);
@ -817,7 +821,7 @@ spa_mmp_history_init(spa_t *spa)
ssh->size = 0; ssh->size = 0;
ssh->private = NULL; ssh->private = NULL;
(void) snprintf(name, KSTAT_STRLEN, "zfs/%s", spa_name(spa)); name = kmem_asprintf("zfs/%s", spa_name(spa));
ksp = kstat_create(name, 0, "multihost", "misc", ksp = kstat_create(name, 0, "multihost", "misc",
KSTAT_TYPE_RAW, 0, KSTAT_FLAG_VIRTUAL); KSTAT_TYPE_RAW, 0, KSTAT_FLAG_VIRTUAL);
@ -832,6 +836,7 @@ spa_mmp_history_init(spa_t *spa)
spa_mmp_history_data, spa_mmp_history_addr); spa_mmp_history_data, spa_mmp_history_addr);
kstat_install(ksp); kstat_install(ksp);
} }
strfree(name);
} }
static void static void