summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Chase <[email protected]>2018-05-08 23:45:47 -0500
committerBrian Behlendorf <[email protected]>2018-05-08 21:45:47 -0700
commitd1043e2f6da4315f0dcbd1487b4e6b5f63bebc41 (patch)
treedba702f8236686abfe5f1b1b4cc0936b6e4e2c88
parent670d74b9cee4dd185a620510bffd4797a2e1066a (diff)
Unify behavior of deadman parameters
The zfs_deadman_failmode, zfs_deadman_ziotime_ms and zfs_deadman_synctime_ms paramaters are stored per-pool. However, only the zfs_deadman_failmode updates the per-pool state when it's change. This patch gives adds the same behavior to the other two for consistency. Also, in all 3 three cases, only update the per-pool parameters if spa_init() has actually been called in order to avoid panicking when trying to take a lock on the spa_namespace_lock mutex. Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Tim Chase <[email protected]> Closes #7499
-rw-r--r--module/zfs/spa_misc.c58
1 files changed, 52 insertions, 6 deletions
diff --git a/module/zfs/spa_misc.c b/module/zfs/spa_misc.c
index e0edba155..234e5c60d 100644
--- a/module/zfs/spa_misc.c
+++ b/module/zfs/spa_misc.c
@@ -2274,14 +2274,58 @@ param_set_deadman_failmode(const char *val, zfs_kernel_param_t *kp)
strcmp(val, "panic"))
return (SET_ERROR(-EINVAL));
- mutex_enter(&spa_namespace_lock);
- while ((spa = spa_next(spa)) != NULL)
- spa_set_deadman_failmode(spa, val);
- mutex_exit(&spa_namespace_lock);
+ if (spa_mode_global != 0) {
+ mutex_enter(&spa_namespace_lock);
+ while ((spa = spa_next(spa)) != NULL)
+ spa_set_deadman_failmode(spa, val);
+ mutex_exit(&spa_namespace_lock);
+ }
return (param_set_charp(val, kp));
}
+static int
+param_set_deadman_ziotime(const char *val, zfs_kernel_param_t *kp)
+{
+ spa_t *spa = NULL;
+ int error;
+
+ error = param_set_ulong(val, kp);
+ if (error < 0)
+ return (SET_ERROR(error));
+
+ if (spa_mode_global != 0) {
+ mutex_enter(&spa_namespace_lock);
+ while ((spa = spa_next(spa)) != NULL)
+ spa->spa_deadman_ziotime =
+ MSEC2NSEC(zfs_deadman_ziotime_ms);
+ mutex_exit(&spa_namespace_lock);
+ }
+
+ return (0);
+}
+
+static int
+param_set_deadman_synctime(const char *val, zfs_kernel_param_t *kp)
+{
+ spa_t *spa = NULL;
+ int error;
+
+ error = param_set_ulong(val, kp);
+ if (error < 0)
+ return (SET_ERROR(error));
+
+ if (spa_mode_global != 0) {
+ mutex_enter(&spa_namespace_lock);
+ while ((spa = spa_next(spa)) != NULL)
+ spa->spa_deadman_synctime =
+ MSEC2NSEC(zfs_deadman_synctime_ms);
+ mutex_exit(&spa_namespace_lock);
+ }
+
+ return (0);
+}
+
/* Namespace manipulation */
EXPORT_SYMBOL(spa_lookup);
EXPORT_SYMBOL(spa_add);
@@ -2374,11 +2418,13 @@ module_param(zfs_free_leak_on_eio, int, 0644);
MODULE_PARM_DESC(zfs_free_leak_on_eio,
"Set to ignore IO errors during free and permanently leak the space");
-module_param(zfs_deadman_synctime_ms, ulong, 0644);
+module_param_call(zfs_deadman_synctime_ms, param_set_deadman_synctime,
+ param_get_ulong, &zfs_deadman_synctime_ms, 0644);
MODULE_PARM_DESC(zfs_deadman_synctime_ms,
"Pool sync expiration time in milliseconds");
-module_param(zfs_deadman_ziotime_ms, ulong, 0644);
+module_param_call(zfs_deadman_ziotime_ms, param_set_deadman_ziotime,
+ param_get_ulong, &zfs_deadman_ziotime_ms, 0644);
MODULE_PARM_DESC(zfs_deadman_ziotime_ms,
"IO expiration time in milliseconds");