]>
Commit | Line | Data |
---|---|---|
c8f9061f BB |
1 | #!/bin/sh |
2 | # | |
3 | # A simple script to load/unload the ZFS module stack. | |
c9c0d073 | 4 | # |
c9c0d073 | 5 | |
c8f9061f | 6 | BASE_DIR=$(dirname "$0") |
c9c0d073 | 7 | SCRIPT_COMMON=common.sh |
c8f9061f BB |
8 | if [ -f "${BASE_DIR}/${SCRIPT_COMMON}" ]; then |
9 | . "${BASE_DIR}/${SCRIPT_COMMON}" | |
c9c0d073 | 10 | else |
c8f9061f | 11 | echo "Missing helper script ${SCRIPT_COMMON}" && exit 1 |
c9c0d073 BB |
12 | fi |
13 | ||
14 | PROG=zfs.sh | |
c8f9061f BB |
15 | VERBOSE="no" |
16 | UNLOAD="no" | |
17 | ||
18 | ZED_PIDFILE=${ZED_PIDFILE:-/var/run/zed.pid} | |
19 | LDMOD=${LDMOD:-/sbin/modprobe} | |
20 | ||
21 | KMOD_ZLIB_DEFLATE=${KMOD_ZLIB_DEFLATE:-zlib_deflate} | |
22 | KMOD_ZLIB_INFLATE=${KMOD_ZLIB_INFLATE:-zlib_inflate} | |
23 | KMOD_SPL=${KMOD_SPL:-spl} | |
24 | KMOD_SPLAT=${KMOD_SPLAT:-splat} | |
25 | KMOD_ZAVL=${KMOD_ZAVL:-zavl} | |
26 | KMOD_ZNVPAIR=${KMOD_ZNVPAIR:-znvpair} | |
27 | KMOD_ZUNICODE=${KMOD_ZUNICODE:-zunicode} | |
28 | KMOD_ZCOMMON=${KMOD_ZCOMMON:-zcommon} | |
d99a0153 | 29 | KMOD_ZLUA=${KMOD_ZLUA:-zlua} |
c8f9061f BB |
30 | KMOD_ICP=${KMOD_ICP:-icp} |
31 | KMOD_ZFS=${KMOD_ZFS:-zfs} | |
32 | ||
c9c0d073 BB |
33 | |
34 | usage() { | |
35 | cat << EOF | |
36 | USAGE: | |
37 | $0 [hvud] [module-options] | |
38 | ||
39 | DESCRIPTION: | |
40 | Load/unload the ZFS module stack. | |
41 | ||
42 | OPTIONS: | |
43 | -h Show this message | |
44 | -v Verbose | |
45 | -u Unload modules | |
c9c0d073 BB |
46 | EOF |
47 | } | |
48 | ||
c552fbc5 | 49 | while getopts 'hvu' OPTION; do |
c9c0d073 BB |
50 | case $OPTION in |
51 | h) | |
52 | usage | |
53 | exit 1 | |
54 | ;; | |
55 | v) | |
c8f9061f | 56 | VERBOSE="yes" |
c9c0d073 BB |
57 | ;; |
58 | u) | |
c8f9061f | 59 | UNLOAD="yes" |
c9c0d073 | 60 | ;; |
c9c0d073 BB |
61 | ?) |
62 | usage | |
63 | exit | |
64 | ;; | |
65 | esac | |
66 | done | |
67 | ||
c8f9061f BB |
68 | kill_zed() { |
69 | if [ -f "$ZED_PIDFILE" ]; then | |
70 | PID=$(cat "$ZED_PIDFILE") | |
71 | kill "$PID" | |
72 | fi | |
73 | } | |
74 | ||
75 | check_modules() { | |
ea49beba GDN |
76 | LOADED_MODULES="" |
77 | MISSING_MODULES="" | |
c8f9061f BB |
78 | |
79 | for KMOD in $KMOD_SPL $KMOD_SPLAT $KMOD_ZAVL $KMOD_ZNVPAIR \ | |
d99a0153 | 80 | $KMOD_ZUNICODE $KMOD_ZCOMMON $KMOD_ZLUA $KMOD_ICP $KMOD_ZFS; do |
c8f9061f BB |
81 | NAME=$(basename "$KMOD" .ko) |
82 | ||
3da3488e | 83 | if lsmod | grep -E -q "^${NAME}"; then |
c8f9061f BB |
84 | LOADED_MODULES="$LOADED_MODULES\t$NAME\n" |
85 | fi | |
86 | ||
87 | if ! modinfo "$KMOD" >/dev/null 2>&1; then | |
88 | MISSING_MODULES="$MISSING_MODULES\t${KMOD}\n" | |
89 | fi | |
90 | done | |
91 | ||
92 | if [ -n "$LOADED_MODULES" ]; then | |
93 | printf "Unload the kernel modules by running '%s -u':\n" "$PROG" | |
94 | printf "%b" "$LOADED_MODULES" | |
95 | exit 1 | |
96 | fi | |
97 | ||
98 | if [ -n "$MISSING_MODULES" ]; then | |
99 | printf "The following kernel modules can not be found:\n" | |
100 | printf "%b" "$MISSING_MODULES" | |
101 | exit 1 | |
102 | fi | |
103 | ||
104 | return 0 | |
105 | } | |
106 | ||
107 | load_module() { | |
ea49beba | 108 | KMOD=$1 |
c8f9061f BB |
109 | |
110 | FILE=$(modinfo "$KMOD" | awk '/^filename:/ {print $2}') | |
111 | VERSION=$(modinfo "$KMOD" | awk '/^version:/ {print $2}') | |
112 | ||
113 | if [ "$VERBOSE" = "yes" ]; then | |
114 | echo "Loading: $FILE ($VERSION)" | |
115 | fi | |
116 | ||
117 | $LDMOD "$KMOD" >/dev/null 2>&1 | |
3da3488e | 118 | # shellcheck disable=SC2181 |
c8f9061f BB |
119 | if [ $? -ne 0 ]; then |
120 | echo "Failed to load $KMOD" | |
121 | return 1 | |
122 | fi | |
123 | ||
124 | return 0 | |
125 | } | |
126 | ||
127 | load_modules() { | |
128 | mkdir -p /etc/zfs | |
129 | ||
133a5c65 BB |
130 | if modinfo "$KMOD_ZLIB_DEFLATE" >/dev/null 2>&1; then |
131 | modprobe "$KMOD_ZLIB_DEFLATE" >/dev/null 2>&1 | |
132 | fi | |
133 | ||
134 | if modinfo "$KMOD_ZLIB_INFLATE">/dev/null 2>&1; then | |
135 | modprobe "$KMOD_ZLIB_INFLATE" >/dev/null 2>&1 | |
136 | fi | |
c8f9061f BB |
137 | |
138 | for KMOD in $KMOD_SPL $KMOD_SPLAT $KMOD_ZAVL $KMOD_ZNVPAIR \ | |
d99a0153 | 139 | $KMOD_ZUNICODE $KMOD_ZCOMMON $KMOD_ZLUA $KMOD_ICP $KMOD_ZFS; do |
c8f9061f BB |
140 | load_module "$KMOD" || return 1 |
141 | done | |
142 | ||
143 | if [ "$VERBOSE" = "yes" ]; then | |
144 | echo "Successfully loaded ZFS module stack" | |
145 | fi | |
146 | ||
147 | return 0 | |
148 | } | |
149 | ||
150 | unload_module() { | |
ea49beba | 151 | KMOD=$1 |
c8f9061f BB |
152 | |
153 | NAME=$(basename "$KMOD" .ko) | |
154 | FILE=$(modinfo "$KMOD" | awk '/^filename:/ {print $2}') | |
155 | VERSION=$(modinfo "$KMOD" | awk '/^version:/ {print $2}') | |
156 | ||
157 | if [ "$VERBOSE" = "yes" ]; then | |
158 | echo "Unloading: $KMOD ($VERSION)" | |
159 | fi | |
160 | ||
161 | rmmod "$NAME" || echo "Failed to unload $NAME" | |
162 | ||
163 | return 0 | |
164 | } | |
165 | ||
166 | unload_modules() { | |
d99a0153 | 167 | for KMOD in $KMOD_ZFS $KMOD_ICP $KMOD_ZLUA $KMOD_ZCOMMON $KMOD_ZUNICODE \ |
c8f9061f BB |
168 | $KMOD_ZNVPAIR $KMOD_ZAVL $KMOD_SPLAT $KMOD_SPL; do |
169 | NAME=$(basename "$KMOD" .ko) | |
3da3488e | 170 | USE_COUNT=$(lsmod | grep -E "^${NAME} " | awk '{print $3}') |
c8f9061f BB |
171 | |
172 | if [ "$USE_COUNT" = "0" ] ; then | |
173 | unload_module "$KMOD" || return 1 | |
174 | fi | |
175 | done | |
176 | ||
133a5c65 BB |
177 | if modinfo "$KMOD_ZLIB_DEFLATE" >/dev/null 2>&1; then |
178 | modprobe -r "$KMOD_ZLIB_DEFLATE" >/dev/null 2>&1 | |
179 | fi | |
180 | ||
181 | if modinfo "$KMOD_ZLIB_INFLATE">/dev/null 2>&1; then | |
182 | modprobe -r "$KMOD_ZLIB_INFLATE" >/dev/null 2>&1 | |
183 | fi | |
184 | ||
c8f9061f BB |
185 | if [ "$VERBOSE" = "yes" ]; then |
186 | echo "Successfully unloaded ZFS module stack" | |
187 | fi | |
188 | ||
189 | return 0 | |
190 | } | |
191 | ||
192 | stack_clear() { | |
ea49beba GDN |
193 | STACK_MAX_SIZE=/sys/kernel/debug/tracing/stack_max_size |
194 | STACK_TRACER_ENABLED=/proc/sys/kernel/stack_tracer_enabled | |
c8f9061f BB |
195 | |
196 | if [ -e "$STACK_MAX_SIZE" ]; then | |
197 | echo 1 >"$STACK_TRACER_ENABLED" | |
198 | echo 0 >"$STACK_MAX_SIZE" | |
199 | fi | |
200 | } | |
201 | ||
202 | stack_check() { | |
ea49beba GDN |
203 | STACK_MAX_SIZE=/sys/kernel/debug/tracing/stack_max_size |
204 | STACK_TRACE=/sys/kernel/debug/tracing/stack_trace | |
205 | STACK_LIMIT=7600 | |
c8f9061f BB |
206 | |
207 | if [ -e "$STACK_MAX_SIZE" ]; then | |
208 | STACK_SIZE=$(cat "$STACK_MAX_SIZE") | |
209 | ||
210 | if [ "$STACK_SIZE" -ge "$STACK_LIMIT" ]; then | |
211 | echo | |
212 | echo "Warning: max stack size $STACK_SIZE bytes" | |
213 | cat "$STACK_TRACE" | |
214 | fi | |
215 | fi | |
216 | } | |
217 | ||
c552fbc5 | 218 | if [ "$(id -u)" != 0 ]; then |
c8f9061f BB |
219 | echo "Must run as root" |
220 | exit 1 | |
c9c0d073 BB |
221 | fi |
222 | ||
c8f9061f | 223 | if [ "$UNLOAD" = "yes" ]; then |
9e246ac3 | 224 | kill_zed |
b9f6a490 | 225 | umount -t zfs -a |
10715a01 | 226 | stack_check |
c9c0d073 BB |
227 | unload_modules |
228 | else | |
10715a01 | 229 | stack_clear |
c8f9061f BB |
230 | check_modules |
231 | load_modules "$@" | |
232 | udevadm trigger | |
233 | udevadm settle | |
c9c0d073 BB |
234 | fi |
235 | ||
236 | exit 0 |