From 0e5efe5ab4942c9583d58d7d31ad88df2cc93eff Mon Sep 17 00:00:00 2001
From: Brian Behlendorf <behlendorf1@llnl.gov>
Date: Thu, 8 Jan 2009 16:19:38 -0800
Subject: [PATCH] Update helper scripts

---
 scripts/check.sh      |   4 +-
 scripts/load-zfs.sh   |  55 ------------
 scripts/unload-zfs.sh |  53 ------------
 scripts/zfs.sh        | 197 ++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 199 insertions(+), 110 deletions(-)
 delete mode 100755 scripts/load-zfs.sh
 delete mode 100755 scripts/unload-zfs.sh
 create mode 100755 scripts/zfs.sh

diff --git a/scripts/check.sh b/scripts/check.sh
index bf93ee564e..e4b0e8e06f 100755
--- a/scripts/check.sh
+++ b/scripts/check.sh
@@ -11,7 +11,7 @@ if [ $(id -u) != 0 ]; then
 	die "Must run as root"
 fi
 
-./load-zfs.sh || die ""
-./unload-zfs.sh || die ""
+./zfs.sh -v  || die ""
+./zfs.sh -vu || die ""
 
 exit 0
diff --git a/scripts/load-zfs.sh b/scripts/load-zfs.sh
deleted file mode 100755
index 94a8ac2cda..0000000000
--- a/scripts/load-zfs.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-
-prog=load-zfs.sh
-. ../.script-config
-
-spl_options=$1
-zpool_options=$2
-
-spl_module=${SPLBUILD}/modules/spl/spl.ko
-zlib_module=/lib/modules/${KERNELSRCVER}/kernel/lib/zlib_deflate/zlib_deflate.ko
-zavl_module=${ZFSBUILD}/lib/libavl/zavl.ko
-znvpair_module=${ZFSBUILD}/lib/libnvpair/znvpair.ko
-zcommon_module=${ZFSBUILD}/lib/libzcommon/zcommon.ko
-zpool_module=${ZFSBUILD}/lib/libzpool/zpool.ko
-zctl_module=${ZFSBUILD}/lib/libdmu-ctl/zctl.ko
-zpios_module=${ZFSBUILD}/lib/libzpios/zpios.ko
-
-die() {
-	echo "${prog}: $1" >&2
-	exit 1
-}
-
-load_module() {
-	echo "Loading $1"
-	/sbin/insmod $* || die "Failed to load $1"
-}
-
-if [ $(id -u) != 0 ]; then
-	die "Must run as root"
-fi
-
-if /sbin/lsmod | egrep -q "^spl|^zavl|^znvpair|^zcommon|^zlib_deflate|^zpool"; then
-	die "Must start with modules unloaded"
-fi
-
-if [ ! -f ${zavl_module} ] ||
-   [ ! -f ${znvpair_module} ] ||
-   [ ! -f ${zcommon_module} ] ||
-   [ ! -f ${zpool_module} ]; then
-	die "Source tree must be built, run 'make'"
-fi
-
-load_module ${spl_module} ${spl_options}
-load_module ${zlib_module}
-load_module ${zavl_module}
-load_module ${znvpair_module}
-load_module ${zcommon_module}
-load_module ${zpool_module} ${zpool_options}
-load_module ${zctl_module}
-load_module ${zpios_module}
-
-sleep 1
-echo "Successfully loaded ZFS module stack"
-
-exit 0
diff --git a/scripts/unload-zfs.sh b/scripts/unload-zfs.sh
deleted file mode 100755
index 58ed137e1a..0000000000
--- a/scripts/unload-zfs.sh
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/bin/bash
-
-prog=unload-zfs.sh
-. ../.script-config
-
-spl_module=${SPLBUILD}/modules/spl/spl.ko
-zlib_module=/lib/modules/${KERNELSRCVER}/kernel/lib/zlib_deflate/zlib_deflate.ko
-zavl_module=${ZFSBUILD}/lib/libavl/zavl.ko
-znvpair_module=${ZFSBUILD}/lib/libnvpair/znvpair.ko
-zcommon_module=${ZFSBUILD}/lib/libzcommon/zcommon.ko
-zpool_module=${ZFSBUILD}/lib/libzpool/zpool.ko
-zctl_module=${ZFSBUILD}/lib/libdmu-ctl/zctl.ko
-zpios_module=${ZFSBUILD}/lib/libzpios/zpios.ko
-
-die() {
-	echo "${prog}: $1" >&2
-	exit 1
-}
-
-unload_module() {
-	echo "Unloading $1"
-	/sbin/rmmod $1 || die "Failed to unload $1"
-}
-
-if [ $(id -u) != 0 ]; then
-	die "Must run as root"
-fi
-
-unload_module ${zpios_module}
-unload_module ${zctl_module}
-unload_module ${zpool_module}
-unload_module ${zcommon_module}
-unload_module ${znvpair_module}
-unload_module ${zavl_module}
-unload_module ${zlib_module}
-
-# Set DUMP=1 to generate debug logs on unload
-if [ -n "${DUMP}" ]; then
-	sysctl -w kernel.spl.debug.dump=1
-	# This is racy, I don't like it, but for a helper script it will do.
-	SPL_LOG=`dmesg | tail -n 1 | cut -f5 -d' '`
-	${SPLBUILD}/cmd/spl ${SPL_LOG} >${SPL_LOG}.log
-	echo
-	echo "Dumped debug log: ${SPL_LOG}.log"
-	tail -n1 ${SPL_LOG}.log
-	echo
-fi
-
-unload_module ${spl_module}
-
-echo "Successfully unloaded ZFS module stack"
-
-exit 0
diff --git a/scripts/zfs.sh b/scripts/zfs.sh
new file mode 100755
index 0000000000..80e86f8bc1
--- /dev/null
+++ b/scripts/zfs.sh
@@ -0,0 +1,197 @@
+#!/bin/bash
+
+prog=load-zfs.sh
+. ../.script-config
+
+KMOD=/lib/modules/${KERNELSRCVER}/kernel
+kernel_modules=(				\
+	$KMOD/lib/zlib_deflate/zlib_deflate.ko	\
+)
+
+spl_modules=(					\
+	${SPLBUILD}/modules/spl/spl.ko		\
+)
+
+zfs_modules=(					\
+	${MODDIR}/avl/zavl.ko			\
+	${MODDIR}/nvpair/znvpair.ko		\
+	${MODDIR}/unicode/zunicode.ko		\
+	${MODDIR}/zcommon/zcommon.ko		\
+	${MODDIR}/zfs/zpool.ko			\
+)
+
+test_modules=(					\
+	${MODDIR}/zpios/zpios.ko		\
+)
+
+modules=(					\
+	${kernel_modules[*]}			\
+	${spl_modules[*]}			\
+	${zfs_modules[*]}			\
+	${test_modules[*]}			\
+)
+
+die() {
+	echo -e "${prog}: $1" >&2
+	exit 1
+}
+
+usage() {
+cat << EOF
+usage: $0 [hvu] [module-options]
+
+OPTIONS:
+   -h      Show this message
+   -v      Verbose
+   -u      Unload modules
+   -d      Save debug log on unload
+
+MODULE-OPTIONS: Must be of the frm module="options", for example:
+
+$0 zpool="zfs_prefetch_disable=1"
+$0 zpool="zfs_prefetch_disable=1 zfs_mdcomp_disable=1"
+$0 spl="spl_debug_mask=0"
+
+EOF
+}
+
+check_modules() {
+	loaded_modules=()
+	missing_modules=()
+
+	for module in ${modules[*]}; do
+		name=`basename $module .ko`
+
+		if /sbin/lsmod | egrep -q "^${name}"; then
+			loaded_modules=(${name} ${loaded_modules[*]})
+		fi
+
+		if [ ! -f $module ]; then
+			missing_modules=("\t${module}\n" ${missing_modules[*]})
+		fi
+	done
+
+	if [ ${#loaded_modules[*]} -gt 0 ]; then
+		error="The following modules must be unloaded, manually run:\n"
+		die "${error}'/sbin/rmmod ${loaded_modules[*]}'"
+	fi
+
+	if [ ${#missing_modules[*]} -gt 0 ]; then
+		error="The following modules can not be found,"
+		error="${error} ensure your source trees are built:\n"
+		die "${error}${missing_modules[*]}"
+	fi
+}
+
+spl_dump_log() {
+        sysctl -w kernel.spl.debug.dump=1 &>/dev/null
+	name=`dmesg | tail -n 1 | cut -f5 -d' '`
+        ${SPLBUILD}/cmd/spl ${name} >${name}.log
+	echo
+        echo "Dumped debug log: ${name}.log"
+        tail -n1 ${name}.log
+	echo
+}
+
+load_module() {
+	name=`basename $module .ko`
+
+	if [ ${verbose} ]; then
+		echo "Loading $name ($@)"
+	fi
+
+	/sbin/insmod $* || die "Failed to load $1"
+}
+
+load_modules() {
+
+	for module in ${modules[*]}; do
+		name=`basename $module .ko`
+		value=
+
+		for opt in "$@"; do
+			opt_name=`echo $opt | cut -f1 -d'='`
+			
+			if [ ${name} = ${opt_name} ]; then
+				value=`echo $opt | cut -f2- -d'='`
+			fi
+		done
+
+		load_module ${module} ${value}
+	done
+
+	if [ ${verbose} ]; then
+		echo "Successfully loaded ZFS module stack"
+	fi
+}
+
+unload_module() {
+	name=`basename $module .ko`
+
+	if [ ${verbose} ]; then
+		echo "Unloading $name ($@)"
+	fi
+
+	/sbin/rmmod $name || die "Failed to unload $name"
+}
+
+unload_modules() {
+	modules_reverse=( $(echo ${modules[@]} |
+		awk '{for (i=NF;i>=1;i--) printf $i" "} END{print ""}') )
+
+	for module in ${modules_reverse[*]}; do
+		name=`basename $module .ko`
+
+		if /sbin/lsmod | egrep -q "^${name}"; then
+
+			if [ "${dump_log}" -a ${name} = "spl" ]; then
+				spl_dump_log
+			fi
+
+			unload_module ${module}
+		fi
+	done
+
+	if [ ${verbose} ]; then
+		echo "Successfully unloaded ZFS module stack"
+	fi
+}
+
+if [ $(id -u) != 0 ]; then
+	die "Must run as root"
+fi
+
+verbose=
+unload=
+dump_log=
+
+while getopts 'hvud' OPTION; do
+	case $OPTION in
+	h)
+		usage
+		exit 1
+		;;
+	v)
+		verbose=1
+		;;
+	u)
+		unload=1
+		;;
+	d)
+		dump_log=1
+		;;
+	?)
+		usage
+		exit
+		;;
+	esac
+done
+
+if [ ${unload} ]; then
+	unload_modules
+else
+	check_modules
+	load_modules "$@"
+fi
+
+exit 0