]>
Commit | Line | Data |
---|---|---|
a010b409 SI |
1 | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
2 | From: Olaf Faaland <faaland1@llnl.gov> | |
3 | Date: Fri, 11 May 2018 12:46:07 -0700 | |
4 | Subject: [PATCH] module param callbacks check for initialized spa | |
5 | ||
6 | Callbacks provided for module parameters are executed both | |
7 | after the module is loaded, when a user alters it via sysfs, e.g | |
8 | echo bar > /sys/modules/zfs/parameters/foo | |
9 | ||
10 | as well as when the module is loaded with an argument, e.g. | |
11 | modprobe zfs foo=bar | |
12 | ||
13 | In the latter case, the init functions likely have not run yet, | |
14 | including spa_init() which initializes the namespace lock so it is safe | |
15 | to use. | |
16 | ||
17 | Instead of immediately taking the namespace lock and attemping to | |
18 | iterate over initialized spa structures, check whether spa_mode_global | |
19 | is nonzero. This is set by spa_init() after it has initialized the | |
20 | namespace lock. | |
21 | ||
22 | Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> | |
23 | Reviewed-by: Tim Chase <tim@chase2k.com> | |
24 | Signed-off-by: Olaf Faaland <faaland1@llnl.gov> | |
25 | Closes #7496 | |
26 | Closes #7521 | |
27 | ||
28 | Signed-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 | ||
34 | diff --git a/module/zfs/mmp.c b/module/zfs/mmp.c | |
35 | index 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 | } | |
48 | diff --git a/module/zfs/vdev_disk.c b/module/zfs/vdev_disk.c | |
49 | index 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 | } |