Path: blob/main/sys/contrib/openzfs/scripts/zfs.sh
48266 views
#!/bin/sh1#2# A simple script to load/unload the ZFS module stack.3#45BASE_DIR=${0%/*}6SCRIPT_COMMON=common.sh7if [ -f "${BASE_DIR}/${SCRIPT_COMMON}" ]; then8. "${BASE_DIR}/${SCRIPT_COMMON}"9else10echo "Missing helper script ${SCRIPT_COMMON}" && exit 111fi1213VERBOSE="no"14UNLOAD="no"15LOAD="yes"16STACK_TRACER="no"1718ZED_PIDFILE=${ZED_PIDFILE:-/var/run/zed.pid}19LDMOD=${LDMOD:-/sbin/modprobe}20DELMOD=${DELMOD:-/sbin/rmmod}2122KMOD_ZLIB_DEFLATE=${KMOD_ZLIB_DEFLATE:-zlib_deflate}23KMOD_ZLIB_INFLATE=${KMOD_ZLIB_INFLATE:-zlib_inflate}24KMOD_SPL=${KMOD_SPL:-spl}25KMOD_ZFS=${KMOD_ZFS:-zfs}26KMOD_FREEBSD=${KMOD_FREEBSD:-openzfs}272829usage() {30cat << EOF31USAGE:32$0 [hvudS]3334DESCRIPTION:35Load/unload the ZFS module stack.3637OPTIONS:38-h Show this message39-v Verbose40-r Reload modules41-u Unload modules42-S Enable kernel stack tracer43EOF44exit 145}4647while getopts 'hvruS' OPTION; do48case $OPTION in49v)50VERBOSE="yes"51;;52r)53UNLOAD="yes"54LOAD="yes"55;;56u)57UNLOAD="yes"58LOAD="no"59;;60S)61STACK_TRACER="yes"62;;63*)64usage65;;66esac67done68shift $(( OPTIND - 1 ))69[ $# -eq 0 ] || usage7071kill_zed() {72if [ -f "$ZED_PIDFILE" ]; then73read -r PID <"$ZED_PIDFILE"74kill "$PID"75fi76}7778check_modules_linux() {79LOADED_MODULES=""80MISSING_MODULES=""8182for KMOD in $KMOD_SPL $KMOD_ZFS; do83NAME="${KMOD##*/}"84NAME="${NAME%.ko}"8586if lsmod | grep -E -q "^${NAME}"; then87LOADED_MODULES="$LOADED_MODULES\t$NAME\n"88fi8990if ! modinfo "$KMOD" >/dev/null 2>&1; then91MISSING_MODULES="$MISSING_MODULES\t${KMOD}\n"92fi93done9495if [ -n "$LOADED_MODULES" ]; then96printf "Unload the kernel modules by running '%s -u':\n" "$0"97printf "%b" "$LOADED_MODULES"98exit 199fi100101if [ -n "$MISSING_MODULES" ]; then102printf "The following kernel modules can not be found:\n"103printf "%b" "$MISSING_MODULES"104exit 1105fi106107return 0108}109110load_module_linux() {111KMOD=$1112113FILE=$(modinfo "$KMOD" 2>&1 | awk 'NR == 1 && /zlib/ && /not found/ {print "(builtin)"; exit} /^filename:/ {print $2}')114[ "$FILE" = "(builtin)" ] && return115116if [ "$VERBOSE" = "yes" ]; then117VERSION=$(modinfo "$KMOD" | awk '/^version:/ {print $2}')118echo "Loading: $FILE ($VERSION)"119fi120121if ! $LDMOD "$KMOD" >/dev/null 2>&1; then122echo "Failed to load $KMOD"123return 1124fi125126return 0127}128129load_modules_freebsd() {130kldload "$KMOD_FREEBSD" || return 1131132if [ "$VERBOSE" = "yes" ]; then133echo "Successfully loaded ZFS module stack"134fi135136return 0137}138139load_modules_linux() {140mkdir -p /etc/zfs141142for KMOD in "$KMOD_ZLIB_DEFLATE" "$KMOD_ZLIB_INFLATE" $KMOD_SPL $KMOD_ZFS; do143load_module_linux "$KMOD" || return 1144done145146if [ "$VERBOSE" = "yes" ]; then147echo "Successfully loaded ZFS module stack"148fi149150return 0151}152153unload_modules_freebsd() {154kldunload "$KMOD_FREEBSD" || echo "Failed to unload $KMOD_FREEBSD"155156if [ "$VERBOSE" = "yes" ]; then157echo "Successfully unloaded ZFS module stack"158fi159160return 0161}162163unload_modules_linux() {164legacy_kmods="icp zzstd zlua zcommon zunicode znvpair zavl"165for KMOD in "$KMOD_ZFS" $legacy_kmods "$KMOD_SPL"; do166NAME="${KMOD##*/}"167NAME="${NAME%.ko}"168! [ -d "/sys/module/$NAME" ] || $DELMOD "$NAME" || return169done170171if [ "$VERBOSE" = "yes" ]; then172echo "Successfully unloaded ZFS module stack"173fi174}175176stack_clear_linux() {177STACK_MAX_SIZE=/sys/kernel/debug/tracing/stack_max_size178STACK_TRACER_ENABLED=/proc/sys/kernel/stack_tracer_enabled179180if [ "$STACK_TRACER" = "yes" ] && [ -e "$STACK_MAX_SIZE" ]; then181echo 1 >"$STACK_TRACER_ENABLED"182echo 0 >"$STACK_MAX_SIZE"183fi184}185186stack_check_linux() {187STACK_MAX_SIZE=/sys/kernel/debug/tracing/stack_max_size188STACK_TRACE=/sys/kernel/debug/tracing/stack_trace189STACK_LIMIT=15362190191if [ -e "$STACK_MAX_SIZE" ]; then192read -r STACK_SIZE <"$STACK_MAX_SIZE"193if [ "$STACK_SIZE" -ge "$STACK_LIMIT" ]; then194echo195echo "Warning: max stack size $STACK_SIZE bytes"196cat "$STACK_TRACE"197fi198fi199}200201if [ "$(id -u)" != 0 ]; then202echo "Must run as root"203exit 1204fi205206UNAME=$(uname)207208if [ "$UNLOAD" = "yes" ]; then209kill_zed210umount -t zfs -a211case $UNAME in212FreeBSD)213unload_modules_freebsd214;;215Linux)216stack_check_linux217unload_modules_linux218;;219*)220echo "unknown system: $UNAME" >&2221exit 1222;;223esac224fi225if [ "$LOAD" = "yes" ]; then226case $UNAME in227FreeBSD)228load_modules_freebsd229;;230Linux)231stack_clear_linux232check_modules_linux233load_modules_linux234udevadm trigger235udevadm settle236;;237*)238echo "unknown system: $UNAME" >&2239exit 1240;;241esac242fi243244exit 0245246247