summaryrefslogtreecommitdiffstats
path: root/scripts/zfs.sh
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2017-08-15 17:26:38 -0700
committerGitHub <[email protected]>2017-08-15 17:26:38 -0700
commitc8f9061fc714696a53cf4d14a4567f0a83dbf862 (patch)
tree42e8a39488899046384f9bb5e350032f438a3ae4 /scripts/zfs.sh
parent70322be8dc160f003fa95e034462ad625b325568 (diff)
Retire legacy test infrastructure
* Removed zpios kmod, utility, headers and man page. * Removed unused scripts zpios-profile/*, zpios-test/*, zpool-config/*, smb.sh, zpios-sanity.sh, zpios-survey.sh, zpios.sh, and zpool-create.sh. * Removed zfs-script-config.sh.in. When building 'make' generates a common.sh with in-tree path information from the common.sh.in template. This file and sourced by the test scripts and used for in-tree testing, it is not included in the packages. When building packages 'make install' uses the same template to create a new common.sh which is appropriate for the packaging. * Removed unused functions/variables from scripts/common.sh.in. Only minimal path information and configuration environment variables remain. * Removed unused scripts from scripts/ directory. * Remaining shell scripts in the scripts directory updated to cleanly pass shellcheck and added to checked scripts. * Renamed tests/test-runner/cmd/ to tests/test-runner/bin/ to match install location name. * Removed last traces of the --enable-debug-dmu-tx configure options which was retired some time ago. Reviewed-by: Giuseppe Di Natale <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Closes #6509
Diffstat (limited to 'scripts/zfs.sh')
-rwxr-xr-xscripts/zfs.sh193
1 files changed, 169 insertions, 24 deletions
diff --git a/scripts/zfs.sh b/scripts/zfs.sh
index 2ffcf40da..63c3a57d0 100755
--- a/scripts/zfs.sh
+++ b/scripts/zfs.sh
@@ -1,19 +1,34 @@
-#!/bin/bash
+#!/bin/sh
+#
+# A simple script to load/unload the ZFS module stack.
#
-# A simple script to simply the loading/unloading the ZFS module stack.
-
-basedir=$(dirname "$0")
+BASE_DIR=$(dirname "$0")
SCRIPT_COMMON=common.sh
-if [ -f "${basedir}/${SCRIPT_COMMON}" ]; then
-. "${basedir}/${SCRIPT_COMMON}"
+if [ -f "${BASE_DIR}/${SCRIPT_COMMON}" ]; then
+ . "${BASE_DIR}/${SCRIPT_COMMON}"
else
-echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
+ echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
fi
-# shellcheck disable=SC2034
PROG=zfs.sh
-UNLOAD=
+VERBOSE="no"
+UNLOAD="no"
+
+ZED_PIDFILE=${ZED_PIDFILE:-/var/run/zed.pid}
+LDMOD=${LDMOD:-/sbin/modprobe}
+
+KMOD_ZLIB_DEFLATE=${KMOD_ZLIB_DEFLATE:-zlib_deflate}
+KMOD_ZLIB_INFLATE=${KMOD_ZLIB_INFLATE:-zlib_inflate}
+KMOD_SPL=${KMOD_SPL:-spl}
+KMOD_SPLAT=${KMOD_SPLAT:-splat}
+KMOD_ZAVL=${KMOD_ZAVL:-zavl}
+KMOD_ZNVPAIR=${KMOD_ZNVPAIR:-znvpair}
+KMOD_ZUNICODE=${KMOD_ZUNICODE:-zunicode}
+KMOD_ZCOMMON=${KMOD_ZCOMMON:-zcommon}
+KMOD_ICP=${KMOD_ICP:-icp}
+KMOD_ZFS=${KMOD_ZFS:-zfs}
+
usage() {
cat << EOF
@@ -27,13 +42,6 @@ OPTIONS:
-h Show this message
-v Verbose
-u Unload modules
-
-MODULE-OPTIONS:
- Must be of the from module="options", for example:
-
-$0 zfs="zfs_prefetch_disable=1"
-$0 zfs="zfs_prefetch_disable=1 zfs_mdcomp_disable=1"
-
EOF
}
@@ -44,11 +52,10 @@ while getopts 'hvu' OPTION; do
exit 1
;;
v)
- # shellcheck disable=SC2034
- VERBOSE=1
+ VERBOSE="yes"
;;
u)
- UNLOAD=1
+ UNLOAD="yes"
;;
?)
usage
@@ -57,20 +64,158 @@ while getopts 'hvu' OPTION; do
esac
done
+kill_zed() {
+ if [ -f "$ZED_PIDFILE" ]; then
+ PID=$(cat "$ZED_PIDFILE")
+ kill "$PID"
+ fi
+}
+
+check_modules() {
+ local LOADED_MODULES=""
+ local MISSING_MODULES=""
+
+ for KMOD in $KMOD_SPL $KMOD_SPLAT $KMOD_ZAVL $KMOD_ZNVPAIR \
+ $KMOD_ZUNICODE $KMOD_ZCOMMON $KMOD_ICP $KMOD_ZFS; do
+ NAME=$(basename "$KMOD" .ko)
+
+ if lsmod | egrep -q "^${NAME}"; then
+ LOADED_MODULES="$LOADED_MODULES\t$NAME\n"
+ fi
+
+ if ! modinfo "$KMOD" >/dev/null 2>&1; then
+ MISSING_MODULES="$MISSING_MODULES\t${KMOD}\n"
+ fi
+ done
+
+ if [ -n "$LOADED_MODULES" ]; then
+ printf "Unload the kernel modules by running '%s -u':\n" "$PROG"
+ printf "%b" "$LOADED_MODULES"
+ exit 1
+ fi
+
+ if [ -n "$MISSING_MODULES" ]; then
+ printf "The following kernel modules can not be found:\n"
+ printf "%b" "$MISSING_MODULES"
+ exit 1
+ fi
+
+ return 0
+}
+
+load_module() {
+ local KMOD=$1
+
+ FILE=$(modinfo "$KMOD" | awk '/^filename:/ {print $2}')
+ VERSION=$(modinfo "$KMOD" | awk '/^version:/ {print $2}')
+
+ if [ "$VERBOSE" = "yes" ]; then
+ echo "Loading: $FILE ($VERSION)"
+ fi
+
+ $LDMOD "$KMOD" >/dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ echo "Failed to load $KMOD"
+ return 1
+ fi
+
+ return 0
+}
+
+load_modules() {
+ mkdir -p /etc/zfs
+
+ modprobe "$KMOD_ZLIB_DEFLATE" >/dev/null
+ modprobe "$KMOD_ZLIB_INFLATE" >/dev/null
+
+ for KMOD in $KMOD_SPL $KMOD_SPLAT $KMOD_ZAVL $KMOD_ZNVPAIR \
+ $KMOD_ZUNICODE $KMOD_ZCOMMON $KMOD_ICP $KMOD_ZFS; do
+ load_module "$KMOD" || return 1
+ done
+
+ if [ "$VERBOSE" = "yes" ]; then
+ echo "Successfully loaded ZFS module stack"
+ fi
+
+ return 0
+}
+
+unload_module() {
+ local KMOD=$1
+
+ NAME=$(basename "$KMOD" .ko)
+ FILE=$(modinfo "$KMOD" | awk '/^filename:/ {print $2}')
+ VERSION=$(modinfo "$KMOD" | awk '/^version:/ {print $2}')
+
+ if [ "$VERBOSE" = "yes" ]; then
+ echo "Unloading: $KMOD ($VERSION)"
+ fi
+
+ rmmod "$NAME" || echo "Failed to unload $NAME"
+
+ return 0
+}
+
+unload_modules() {
+ for KMOD in $KMOD_ZFS $KMOD_ICP $KMOD_ZCOMMON $KMOD_ZUNICODE \
+ $KMOD_ZNVPAIR $KMOD_ZAVL $KMOD_SPLAT $KMOD_SPL; do
+ NAME=$(basename "$KMOD" .ko)
+ USE_COUNT=$(lsmod | egrep "^${NAME} " | awk '{print $3}')
+
+ if [ "$USE_COUNT" = "0" ] ; then
+ unload_module "$KMOD" || return 1
+ fi
+ done
+
+ if [ "$VERBOSE" = "yes" ]; then
+ echo "Successfully unloaded ZFS module stack"
+ fi
+
+ return 0
+}
+
+stack_clear() {
+ local STACK_MAX_SIZE=/sys/kernel/debug/tracing/stack_max_size
+ local STACK_TRACER_ENABLED=/proc/sys/kernel/stack_tracer_enabled
+
+ if [ -e "$STACK_MAX_SIZE" ]; then
+ echo 1 >"$STACK_TRACER_ENABLED"
+ echo 0 >"$STACK_MAX_SIZE"
+ fi
+}
+
+stack_check() {
+ local STACK_MAX_SIZE=/sys/kernel/debug/tracing/stack_max_size
+ local STACK_TRACE=/sys/kernel/debug/tracing/stack_trace
+ local STACK_LIMIT=7600
+
+ if [ -e "$STACK_MAX_SIZE" ]; then
+ STACK_SIZE=$(cat "$STACK_MAX_SIZE")
+
+ if [ "$STACK_SIZE" -ge "$STACK_LIMIT" ]; then
+ echo
+ echo "Warning: max stack size $STACK_SIZE bytes"
+ cat "$STACK_TRACE"
+ fi
+ fi
+}
+
if [ "$(id -u)" != 0 ]; then
- die "Must run as root"
+ echo "Must run as root"
+ exit 1
fi
-if [ ${UNLOAD} ]; then
+if [ "$UNLOAD" = "yes" ]; then
kill_zed
umount -t zfs -a
stack_check
unload_modules
else
stack_clear
- check_modules || die "${ERROR}"
- load_modules "$@" || die "Failed to load modules"
- wait_udev /dev/zfs 30 || die "'/dev/zfs' was not created"
+ check_modules
+ load_modules "$@"
+ udevadm trigger
+ udevadm settle
fi
exit 0