summaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
Diffstat (limited to 'module')
-rw-r--r--module/zfs/spa.c7
-rw-r--r--module/zfs/spa_misc.c2
2 files changed, 8 insertions, 1 deletions
diff --git a/module/zfs/spa.c b/module/zfs/spa.c
index 8bee15094..998ec3e54 100644
--- a/module/zfs/spa.c
+++ b/module/zfs/spa.c
@@ -3264,10 +3264,13 @@ spa_feature_stats_from_cache(spa_t *spa, nvlist_t *features)
static void
spa_add_feature_stats(spa_t *spa, nvlist_t *config)
{
- nvlist_t *features = spa->spa_feat_stats;
+ nvlist_t *features;
ASSERT(spa_config_held(spa, SCL_CONFIG, RW_READER));
+ mutex_enter(&spa->spa_feat_stats_lock);
+ features = spa->spa_feat_stats;
+
if (features != NULL) {
spa_feature_stats_from_cache(spa, features);
} else {
@@ -3278,6 +3281,8 @@ spa_add_feature_stats(spa_t *spa, nvlist_t *config)
VERIFY0(nvlist_add_nvlist(config, ZPOOL_CONFIG_FEATURE_STATS,
features));
+
+ mutex_exit(&spa->spa_feat_stats_lock);
}
int
diff --git a/module/zfs/spa_misc.c b/module/zfs/spa_misc.c
index ec0c01959..7a96ea18b 100644
--- a/module/zfs/spa_misc.c
+++ b/module/zfs/spa_misc.c
@@ -531,6 +531,7 @@ spa_add(const char *name, nvlist_t *config, const char *altroot)
mutex_init(&spa->spa_scrub_lock, NULL, MUTEX_DEFAULT, NULL);
mutex_init(&spa->spa_suspend_lock, NULL, MUTEX_DEFAULT, NULL);
mutex_init(&spa->spa_vdev_top_lock, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&spa->spa_feat_stats_lock, NULL, MUTEX_DEFAULT, NULL);
cv_init(&spa->spa_async_cv, NULL, CV_DEFAULT, NULL);
cv_init(&spa->spa_proc_cv, NULL, CV_DEFAULT, NULL);
@@ -668,6 +669,7 @@ spa_remove(spa_t *spa)
mutex_destroy(&spa->spa_scrub_lock);
mutex_destroy(&spa->spa_suspend_lock);
mutex_destroy(&spa->spa_vdev_top_lock);
+ mutex_destroy(&spa->spa_feat_stats_lock);
kmem_free(spa, sizeof (spa_t));
}