The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/openzfs/scripts/zfs.sh

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 8218687b373da006ee84160a08c8ea8c


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.