]> git.proxmox.com Git - zfsonlinux.git/blame - zfs-patches/0012-module-param-callbacks-check-for-initialized-spa.patch
bump version to 0.7.11-pve1~bpo1
[zfsonlinux.git] / zfs-patches / 0012-module-param-callbacks-check-for-initialized-spa.patch
CommitLineData
a010b409
SI
1From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2From: Olaf Faaland <faaland1@llnl.gov>
3Date: Fri, 11 May 2018 12:46:07 -0700
4Subject: [PATCH] module param callbacks check for initialized spa
5
6Callbacks provided for module parameters are executed both
7after the module is loaded, when a user alters it via sysfs, e.g
8 echo bar > /sys/modules/zfs/parameters/foo
9
10as well as when the module is loaded with an argument, e.g.
11 modprobe zfs foo=bar
12
13In the latter case, the init functions likely have not run yet,
14including spa_init() which initializes the namespace lock so it is safe
15to use.
16
17Instead of immediately taking the namespace lock and attemping to
18iterate over initialized spa structures, check whether spa_mode_global
19is nonzero. This is set by spa_init() after it has initialized the
20namespace lock.
21
22Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
23Reviewed-by: Tim Chase <tim@chase2k.com>
24Signed-off-by: Olaf Faaland <faaland1@llnl.gov>
25Closes #7496
26Closes #7521
27
28Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
29---
30 module/zfs/mmp.c | 3 ++-
31 module/zfs/vdev_disk.c | 24 +++++++++++++-----------
32 2 files changed, 15 insertions(+), 12 deletions(-)
33
34diff --git a/module/zfs/mmp.c b/module/zfs/mmp.c
35index 3b74a6b6..7523310c 100644
36--- a/module/zfs/mmp.c
37+++ b/module/zfs/mmp.c
38@@ -607,7 +607,8 @@ param_set_multihost_interval(const char *val, zfs_kernel_param_t *kp)
39 if (ret < 0)
40 return (ret);
41
42- mmp_signal_all_threads();
43+ if (spa_mode_global != 0)
44+ mmp_signal_all_threads();
45
46 return (ret);
47 }
48diff --git a/module/zfs/vdev_disk.c b/module/zfs/vdev_disk.c
49index d6212835..6761e755 100644
50--- a/module/zfs/vdev_disk.c
51+++ b/module/zfs/vdev_disk.c
52@@ -815,19 +815,21 @@ param_set_vdev_scheduler(const char *val, zfs_kernel_param_t *kp)
53 if ((p = strchr(val, '\n')) != NULL)
54 *p = '\0';
55
56- mutex_enter(&spa_namespace_lock);
57- while ((spa = spa_next(spa)) != NULL) {
58- if (spa_state(spa) != POOL_STATE_ACTIVE ||
59- !spa_writeable(spa) || spa_suspended(spa))
60- continue;
61-
62- spa_open_ref(spa, FTAG);
63- mutex_exit(&spa_namespace_lock);
64- vdev_elevator_switch(spa->spa_root_vdev, (char *)val);
65+ if (spa_mode_global != 0) {
66 mutex_enter(&spa_namespace_lock);
67- spa_close(spa, FTAG);
68+ while ((spa = spa_next(spa)) != NULL) {
69+ if (spa_state(spa) != POOL_STATE_ACTIVE ||
70+ !spa_writeable(spa) || spa_suspended(spa))
71+ continue;
72+
73+ spa_open_ref(spa, FTAG);
74+ mutex_exit(&spa_namespace_lock);
75+ vdev_elevator_switch(spa->spa_root_vdev, (char *)val);
76+ mutex_enter(&spa_namespace_lock);
77+ spa_close(spa, FTAG);
78+ }
79+ mutex_exit(&spa_namespace_lock);
80 }
81- mutex_exit(&spa_namespace_lock);
82
83 return (param_set_charp(val, kp));
84 }