From a3640486fffc592806c16f5149170ed659c94c2c Mon Sep 17 00:00:00 2001 From: Ryan Moeller Date: Thu, 19 Dec 2019 12:31:16 -0500 Subject: Update zfs.sh work on FreeBSD Extend the zfs.sh script to load and unload zfs kmods on FreeBSD. Reviewed-by: Brian Behlendorf Reviewed-by: Kjeld Schouten Signed-off-by: Ryan Moeller Closes #9746 --- scripts/zfs.sh | 69 ++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 16 deletions(-) (limited to 'scripts/zfs.sh') diff --git a/scripts/zfs.sh b/scripts/zfs.sh index 015b3ba9d..e1cfdc5e1 100755 --- a/scripts/zfs.sh +++ b/scripts/zfs.sh @@ -29,6 +29,7 @@ KMOD_ZCOMMON=${KMOD_ZCOMMON:-zcommon} KMOD_ZLUA=${KMOD_ZLUA:-zlua} KMOD_ICP=${KMOD_ICP:-icp} KMOD_ZFS=${KMOD_ZFS:-zfs} +KMOD_FREEBSD=${KMOD_FREEBSD:-openzfs} usage() { @@ -76,7 +77,7 @@ kill_zed() { fi } -check_modules() { +check_modules_linux() { LOADED_MODULES="" MISSING_MODULES="" @@ -108,7 +109,7 @@ check_modules() { return 0 } -load_module() { +load_module_linux() { KMOD=$1 FILE=$(modinfo "$KMOD" | awk '/^filename:/ {print $2}') @@ -128,7 +129,17 @@ load_module() { return 0 } -load_modules() { +load_modules_freebsd() { + kldload "$KMOD_FREEBSD" || return 1 + + if [ "$VERBOSE" = "yes" ]; then + echo "Successfully loaded ZFS module stack" + fi + + return 0 +} + +load_modules_linux() { mkdir -p /etc/zfs if modinfo "$KMOD_ZLIB_DEFLATE" >/dev/null 2>&1; then @@ -141,7 +152,7 @@ load_modules() { for KMOD in $KMOD_SPL $KMOD_ZAVL $KMOD_ZNVPAIR \ $KMOD_ZUNICODE $KMOD_ZCOMMON $KMOD_ZLUA $KMOD_ICP $KMOD_ZFS; do - load_module "$KMOD" || return 1 + load_module_linux "$KMOD" || return 1 done if [ "$VERBOSE" = "yes" ]; then @@ -151,7 +162,7 @@ load_modules() { return 0 } -unload_module() { +unload_module_linux() { KMOD=$1 NAME=$(basename "$KMOD" .ko) @@ -167,14 +178,24 @@ unload_module() { return 0 } -unload_modules() { +unload_modules_freebsd() { + kldunload "$KMOD_FREEBSD" || echo "Failed to unload $KMOD_FREEBSD" + + if [ "$VERBOSE" = "yes" ]; then + echo "Successfully unloaded ZFS module stack" + fi + + return 0 +} + +unload_modules_linux() { for KMOD in $KMOD_ZFS $KMOD_ICP $KMOD_ZLUA $KMOD_ZCOMMON $KMOD_ZUNICODE \ $KMOD_ZNVPAIR $KMOD_ZAVL $KMOD_SPL; do NAME=$(basename "$KMOD" .ko) USE_COUNT=$(lsmod | grep -E "^${NAME} " | awk '{print $3}') if [ "$USE_COUNT" = "0" ] ; then - unload_module "$KMOD" || return 1 + unload_module_linux "$KMOD" || return 1 fi done @@ -193,7 +214,7 @@ unload_modules() { return 0 } -stack_clear() { +stack_clear_linux() { STACK_MAX_SIZE=/sys/kernel/debug/tracing/stack_max_size STACK_TRACER_ENABLED=/proc/sys/kernel/stack_tracer_enabled @@ -203,7 +224,7 @@ stack_clear() { fi } -stack_check() { +stack_check_linux() { STACK_MAX_SIZE=/sys/kernel/debug/tracing/stack_max_size STACK_TRACE=/sys/kernel/debug/tracing/stack_trace STACK_LIMIT=15362 @@ -224,17 +245,33 @@ if [ "$(id -u)" != 0 ]; then exit 1 fi +UNAME=$(uname -s) + if [ "$UNLOAD" = "yes" ]; then kill_zed umount -t zfs -a - stack_check - unload_modules + case $UNAME in + FreeBSD) + unload_modules_freebsd + ;; + Linux) + stack_check_linux + unload_modules_linux + ;; + esac else - stack_clear - check_modules - load_modules "$@" - udevadm trigger - udevadm settle + case $UNAME in + FreeBSD) + load_modules_freebsd + ;; + Linux) + stack_clear_linux + check_modules_linux + load_modules_linux "$@" + udevadm trigger + udevadm settle + ;; + esac fi exit 0 -- cgit v1.2.3