diff --git a/include/sys/spa.h b/include/sys/spa.h index e460dc2dd3..780119e9af 100644 --- a/include/sys/spa.h +++ b/include/sys/spa.h @@ -1182,6 +1182,7 @@ extern void spa_wake_waiters(spa_t *spa); int param_set_deadman_ziotime(const char *val, zfs_kernel_param_t *kp); int param_set_deadman_synctime(const char *val, zfs_kernel_param_t *kp); int param_set_slop_shift(const char *buf, zfs_kernel_param_t *kp); +int param_set_deadman_failmode(const char *val, zfs_kernel_param_t *kp); #ifdef ZFS_DEBUG #define dprintf_bp(bp, fmt, ...) do { \ diff --git a/include/sys/spa_impl.h b/include/sys/spa_impl.h index 5a581214d0..9ee04eb259 100644 --- a/include/sys/spa_impl.h +++ b/include/sys/spa_impl.h @@ -433,6 +433,7 @@ struct spa { }; extern char *spa_config_path; +extern char *zfs_deadman_failmode; extern int spa_slop_shift; extern void spa_taskq_dispatch_ent(spa_t *spa, zio_type_t t, zio_taskq_type_t q, task_func_t *func, void *arg, uint_t flags, taskq_ent_t *ent); @@ -443,7 +444,7 @@ extern void spa_load_l2cache(spa_t *spa); extern sysevent_t *spa_event_create(spa_t *spa, vdev_t *vd, nvlist_t *hist_nvl, const char *name); extern void spa_event_post(sysevent_t *ev); - +extern int param_set_deadman_failmode_common(const char *val); #ifdef __cplusplus } diff --git a/module/os/linux/zfs/spa_misc_os.c b/module/os/linux/zfs/spa_misc_os.c index 97d91f9822..33ff6c082b 100644 --- a/module/os/linux/zfs/spa_misc_os.c +++ b/module/os/linux/zfs/spa_misc_os.c @@ -42,6 +42,19 @@ #include #include "zfs_prop.h" + +int +param_set_deadman_failmode(const char *val, zfs_kernel_param_t *kp) +{ + int error; + + error = -param_set_deadman_failmode_common(val); + if (error == 0) + error = param_set_charp(val, kp); + + return (error); +} + int param_set_deadman_ziotime(const char *val, zfs_kernel_param_t *kp) { diff --git a/module/zfs/spa_misc.c b/module/zfs/spa_misc.c index d49c92e209..fe086d7b32 100644 --- a/module/zfs/spa_misc.c +++ b/module/zfs/spa_misc.c @@ -2708,21 +2708,21 @@ spa_suspend_async_destroy(spa_t *spa) #if defined(_KERNEL) -static int -param_set_deadman_failmode(const char *val, zfs_kernel_param_t *kp) +int +param_set_deadman_failmode_common(const char *val) { spa_t *spa = NULL; char *p; if (val == NULL) - return (SET_ERROR(-EINVAL)); + return (SET_ERROR(EINVAL)); if ((p = strchr(val, '\n')) != NULL) *p = '\0'; if (strcmp(val, "wait") != 0 && strcmp(val, "continue") != 0 && strcmp(val, "panic")) - return (SET_ERROR(-EINVAL)); + return (SET_ERROR(EINVAL)); if (spa_mode_global != SPA_MODE_UNINIT) { mutex_enter(&spa_namespace_lock); @@ -2731,7 +2731,7 @@ param_set_deadman_failmode(const char *val, zfs_kernel_param_t *kp) mutex_exit(&spa_namespace_lock); } - return (param_set_charp(val, kp)); + return (0); } #endif @@ -2847,13 +2847,11 @@ ZFS_MODULE_PARAM(zfs, zfs_, ddt_data_is_special, INT, ZMOD_RW, ZFS_MODULE_PARAM(zfs, zfs_, user_indirect_is_special, INT, ZMOD_RW, "Place user data indirect blocks into the special class"); -#ifdef _KERNEL -module_param_call(zfs_deadman_failmode, param_set_deadman_failmode, - param_get_charp, &zfs_deadman_failmode, 0644); -MODULE_PARM_DESC(zfs_deadman_failmode, "Failmode for deadman timer"); -#endif - /* BEGIN CSTYLED */ +ZFS_MODULE_PARAM_CALL(zfs_deadman, zfs_deadman_, failmode, + param_set_deadman_failmode, param_get_charp, ZMOD_RW, + "Failmode for deadman timer"); + ZFS_MODULE_PARAM_CALL(zfs_deadman, zfs_deadman_, synctime_ms, param_set_deadman_synctime, param_get_ulong, ZMOD_RW, "Pool sync expiration time in milliseconds");