]> granicus.if.org Git - zfs/commitdiff
zimport.sh: Allow custom pool create options
authorBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 21 Aug 2017 17:00:12 +0000 (10:00 -0700)
committerGitHub <noreply@github.com>
Mon, 21 Aug 2017 17:00:12 +0000 (10:00 -0700)
Allow custom options to be passed to 'zpool create` when creating
a new pool.

Normally zimport.sh is intented to prevent accidentally introduced
incompatibilities so we want the default behavior.  However, when
introducing a known incompatibility with a feature flag we need a
way to disable the feature.  By adding a line like the following
to the commit message the feature can be disabled allowing the
pool to be compatibile with older versions.

TEST_ZIMPORT_CREATE_OPTIONS="-o feature@encryption=disabled"

* Additionally fix /dev/nul -> /dev/null typo and minor white space
  formating issues.

* Updated fail function to print a message and exit with 1 for use
  by the buildbot.

* Silence warnings when zlib_inflate / zlib_default modules don't
  exist.  This can happen when they're build in to the kernel.

Reviewed-by: George Melikov <mail@gmelikov.ru>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #6520

scripts/zfs.sh
scripts/zimport.sh

index 63c3a57d01bca895f99f14b1b4ebb05059bfb071..7dbb51a170945463a2d6a8f17d1496ced7a737b7 100755 (executable)
@@ -125,8 +125,13 @@ load_module() {
 load_modules() {
        mkdir -p /etc/zfs
 
-       modprobe "$KMOD_ZLIB_DEFLATE" >/dev/null
-       modprobe "$KMOD_ZLIB_INFLATE" >/dev/null
+       if modinfo "$KMOD_ZLIB_DEFLATE" >/dev/null 2>&1; then
+               modprobe "$KMOD_ZLIB_DEFLATE" >/dev/null 2>&1
+       fi
+
+       if modinfo "$KMOD_ZLIB_INFLATE">/dev/null 2>&1; then
+               modprobe "$KMOD_ZLIB_INFLATE" >/dev/null 2>&1
+       fi
 
        for KMOD in $KMOD_SPL $KMOD_SPLAT $KMOD_ZAVL $KMOD_ZNVPAIR \
            $KMOD_ZUNICODE $KMOD_ZCOMMON $KMOD_ICP $KMOD_ZFS; do
@@ -167,6 +172,14 @@ unload_modules() {
                fi
        done
 
+       if modinfo "$KMOD_ZLIB_DEFLATE" >/dev/null 2>&1; then
+               modprobe -r "$KMOD_ZLIB_DEFLATE" >/dev/null 2>&1
+       fi
+
+       if modinfo "$KMOD_ZLIB_INFLATE">/dev/null 2>&1; then
+               modprobe -r "$KMOD_ZLIB_INFLATE" >/dev/null 2>&1
+       fi
+
        if [ "$VERBOSE" = "yes" ]; then
                echo "Successfully unloaded ZFS module stack"
        fi
index 81e415805ab07a0131e18d9e2e0f5e4997c29e2f..c72a4a4e4e52fbc97230837ef22741e5b5ebf095 100755 (executable)
@@ -62,8 +62,10 @@ else
        echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
 fi
 
+PROG=zimport.sh
 SRC_TAGS="zfs-0.6.5.11 master"
 POOL_TAGS="all master"
+POOL_CREATE_OPTIONS=
 TEST_DIR=$(mktemp -u -d -p /var/tmp zimport.XXXXXXXX)
 KEEP="no"
 VERBOSE="no"
@@ -86,7 +88,8 @@ COLOR_RESET="\033[0m"
 usage() {
 cat << EOF
 USAGE:
-zimport.sh [hvl] [-r repo] [-s src-tag] [-i pool-dir] [-p pool-tag] [-f path]
+zimport.sh [hvl] [-r repo] [-s src-tag] [-i pool-dir] [-p pool-tag]
+    [-f path] [-o options]
 
 DESCRIPTION:
        ZPOOL import verification tests
@@ -101,11 +104,12 @@ OPTIONS:
        -i <pool-dir>     Pool image directory
        -p <pool-tag>...  Verify pools created with the listed tags
        -f <path>         Temporary directory to use
+       -o <options>      Additional options to pass to 'zpool create'
 
 EOF
 }
 
-while getopts 'hvckr:s:i:p:f:?' OPTION; do
+while getopts 'hvckr:s:i:p:f:o:?' OPTION; do
        case $OPTION in
        h)
                usage
@@ -135,9 +139,12 @@ while getopts 'hvckr:s:i:p:f:?' OPTION; do
        f)
                TEST_DIR="$OPTARG"
                ;;
+       o)
+               POOL_CREATE_OPTIONS="$OPTARG"
+               ;;
        ?)
                usage
-               exit
+               exit 1
                ;;
        esac
 done
@@ -205,9 +212,13 @@ fail_nonewline() {
        echo -n -e "${COLOR_RED}Fail${COLOR_RESET}\t\t"
 }
 
+#
+# Log a failure message, cleanup, and return an error.
+#
 fail() {
-       echo -e "${COLOR_RED}Fail${COLOR_RESET} ($1)"
-       exit "$1"
+       echo -e "$PROG: $1" >&2
+       $ZFS_SH -u >/dev/null 2>&1
+       exit 1
 }
 
 #
@@ -278,35 +289,44 @@ pool_create() {
                cd "$POOL_DIR_SRC"
        fi
 
-       $ZFS_SH zfs="spa_config_path=$POOL_DIR_PRISTINE" || fail 1
+       $ZFS_SH zfs="spa_config_path=$POOL_DIR_PRISTINE" || \
+           fail "Failed to load kmods"
 
        # Create a file vdev RAIDZ pool.
        truncate -s 1G \
            "$POOL_DIR_PRISTINE/vdev1" "$POOL_DIR_PRISTINE/vdev2" \
-           "$POOL_DIR_PRISTINE/vdev3" "$POOL_DIR_PRISTINE/vdev4"
-       $ZPOOL_CMD create "$POOL_TAG" raidz \
+           "$POOL_DIR_PRISTINE/vdev3" "$POOL_DIR_PRISTINE/vdev4" || \
+           fail "Failed 'truncate -s 1G ...'"
+       # shellcheck disable=SC2086
+       $ZPOOL_CMD create $POOL_CREATE_OPTIONS "$POOL_TAG" raidz \
            "$POOL_DIR_PRISTINE/vdev1" "$POOL_DIR_PRISTINE/vdev2" \
-            "$POOL_DIR_PRISTINE/vdev3" "$POOL_DIR_PRISTINE/vdev4"
+           "$POOL_DIR_PRISTINE/vdev3" "$POOL_DIR_PRISTINE/vdev4" || \
+           fail "Failed '$ZPOOL_CMD create $POOL_CREATE_OPTIONS $POOL_TAG ...'"
 
        # Create a pool/fs filesystem with some random contents.
-       $ZFS_CMD create "$POOL_TAG/fs" || fail 3
+       $ZFS_CMD create "$POOL_TAG/fs" || \
+           fail "Failed '$ZFS_CMD create $POOL_TAG/fs'"
        populate "/$POOL_TAG/fs/" 10 100
 
        # Snapshot that filesystem, clone it, remove the files/dirs,
        # replace them with new files/dirs.
-       $ZFS_CMD snap "$POOL_TAG/fs@snap" || fail 4
-       $ZFS_CMD clone "$POOL_TAG/fs@snap" "$POOL_TAG/clone" || fail 5
+       $ZFS_CMD snap "$POOL_TAG/fs@snap" || \
+           fail "Failed '$ZFS_CMD snap $POOL_TAG/fs@snap'"
+       $ZFS_CMD clone "$POOL_TAG/fs@snap" "$POOL_TAG/clone" || \
+           fail "Failed '$ZFS_CMD clone $POOL_TAG/fs@snap $POOL_TAG/clone'"
        # shellcheck disable=SC2086
-       rm -Rf /$POOL_TAG/clone/* || fail 6
+       rm -Rf /$POOL_TAG/clone/*
        populate "/$POOL_TAG/clone/" 10 100
 
        # Scrub the pool, delay slightly, then export it.  It is now
        # somewhat interesting for testing purposes.
-       $ZPOOL_CMD scrub "$POOL_TAG" || fail 7
+       $ZPOOL_CMD scrub "$POOL_TAG" || \
+           fail "Failed '$ZPOOL_CMD scrub $POOL_TAG'"
        sleep 10
-       $ZPOOL_CMD export "$POOL_TAG" || fail 8
+       $ZPOOL_CMD export "$POOL_TAG" || \
+           fail "Failed '$ZPOOL_CMD export $POOL_TAG'"
 
-       $ZFS_SH -u || fail 9
+       $ZFS_SH -u || fail "Failed to unload kmods"
 }
 
 # If the zfs-images directory doesn't exist fetch a copy from Github then
@@ -315,7 +335,8 @@ if [ ! -d "$IMAGES_DIR" ]; then
        IMAGES_DIR="$TEST_DIR/zfs-images"
        mkdir -p "$IMAGES_DIR"
        curl -sL "$IMAGES_TAR" | \
-           tar -xz -C "$IMAGES_DIR" --strip-components=1 || fail 10
+           tar -xz -C "$IMAGES_DIR" --strip-components=1 || \
+           fail "Failed to download pool images"
 fi
 
 # Given the available images in the zfs-images directory substitute the
@@ -341,6 +362,7 @@ if [ "$VERBOSE" = "yes" ]; then
        echo "SRC_TAGS=$SRC_TAGS"
        echo "POOL_TAGS=$POOL_TAGS"
        echo "PATH=$TEST_DIR"
+       echo "POOL_CREATE_OPTIONS=$POOL_CREATE_OPTIONS"
        echo
 fi
 
@@ -363,8 +385,7 @@ for TAG in $SRC_TAGS; do
                if [ -n "$ZFS_VERSION" ]; then
                        printf "%-16s" "$ZFS_VERSION"
                else
-                       echo -e "ZFS is not installed\n"
-                       fail
+                       fail "ZFS is not installed"
                fi
        else
                printf "%-16s" "$TAG"
@@ -392,16 +413,17 @@ for TAG in $SRC_TAGS; do
                fi
 
                git archive --format=tar --prefix="$SPL_TAG/ $SPL_TAG" \
-                   -o "$SRC_DIR_SPL/$SPL_TAG.tar" &>/dev/nul || \
+                   -o "$SRC_DIR_SPL/$SPL_TAG.tar" &>/dev/null || \
                    rm "$SRC_DIR_SPL/$SPL_TAG.tar"
                if [ -s "$SRC_DIR_SPL/$SPL_TAG.tar" ]; then
                        tar -xf "$SRC_DIR_SPL/$SPL_TAG.tar" -C "$SRC_DIR_SPL"
                        rm "$SRC_DIR_SPL/$SPL_TAG.tar"
                        echo -n -e "${COLOR_GREEN}Local${COLOR_RESET}\t\t"
                else
-                       mkdir -p "$SPL_DIR" || fail 1
+                       mkdir -p "$SPL_DIR" || fail "Failed to create $SPL_DIR"
                        curl -sL "$SPL_URL" | tar -xz -C "$SPL_DIR" \
-                           --strip-components=1 || fail 2
+                           --strip-components=1 || \
+                           fail "Failed to download $SPL_URL"
                        echo -n -e "${COLOR_GREEN}Remote${COLOR_RESET}\t\t"
                fi
        fi
@@ -428,16 +450,17 @@ for TAG in $SRC_TAGS; do
                fi
 
                git archive --format=tar --prefix="$ZFS_TAG/ $ZFS_TAG" \
-                   -o "$SRC_DIR_ZFS/$ZFS_TAG.tar" &>/dev/nul || \
+                   -o "$SRC_DIR_ZFS/$ZFS_TAG.tar" &>/dev/null || \
                    rm "$SRC_DIR_ZFS/$ZFS_TAG.tar"
                if [ -s "$SRC_DIR_ZFS/$ZFS_TAG.tar" ]; then
                        tar -xf "$SRC_DIR_ZFS/$ZFS_TAG.tar" -C "$SRC_DIR_ZFS"
                        rm "$SRC_DIR_ZFS/$ZFS_TAG.tar"
                        echo -n -e "${COLOR_GREEN}Local${COLOR_RESET}\t\t"
                else
-                       mkdir -p "$ZFS_DIR" || fail 1
+                       mkdir -p "$ZFS_DIR" || fail "Failed to create $ZFS_DIR"
                        curl -sL "$ZFS_URL" | tar -xz -C "$ZFS_DIR" \
-                           --strip-components=1 || fail 2
+                           --strip-components=1 || \
+                           fail "Failed to download $ZFS_URL"
                        echo -n -e "${COLOR_GREEN}Remote${COLOR_RESET}\t\t"
                fi
        fi
@@ -456,11 +479,14 @@ for TAG in $SRC_TAGS; do
        else
                cd "$SPL_DIR"
                make distclean &>/dev/null
-               ./autogen.sh >>"$CONFIG_LOG" 2>&1 || fail 1
+               ./autogen.sh >>"$CONFIG_LOG" 2>&1 || \
+                   fail "Failed SPL 'autogen.sh'"
                # shellcheck disable=SC2086
-               ./configure $CONFIG_OPTIONS >>"$CONFIG_LOG" 2>&1 || fail 2
+               ./configure $CONFIG_OPTIONS >>"$CONFIG_LOG" 2>&1 || \
+                   fail "Failed SPL 'configure $CONFIG_OPTIONS'"
                # shellcheck disable=SC2086
-               make $MAKE_OPTIONS >>"$MAKE_LOG" 2>&1 || fail 3
+               make $MAKE_OPTIONS >>"$MAKE_LOG" 2>&1 || \
+                   fail "Failed SPL 'make $MAKE_OPTIONS'"
                pass_nonewline
        fi
 done
@@ -478,12 +504,15 @@ for TAG in $SRC_TAGS; do
        else
                cd "$ZFS_DIR"
                make distclean &>/dev/null
-               ./autogen.sh >>"$CONFIG_LOG" 2>&1 || fail 1
+               ./autogen.sh >>"$CONFIG_LOG" 2>&1 || \
+                   fail "Failed ZFS 'autogen.sh'"
                # shellcheck disable=SC2086
                ./configure --with-spl="$SPL_DIR" $CONFIG_OPTIONS \
-                    >>"$CONFIG_LOG" 2>&1 || fail 2
+                   >>"$CONFIG_LOG" 2>&1 || \
+                   fail "Failed ZFS 'configure $CONFIG_OPTIONS'"
                # shellcheck disable=SC2086
-               make $MAKE_OPTIONS >>"$MAKE_LOG" 2>&1 || fail 3
+               make $MAKE_OPTIONS >>"$MAKE_LOG" 2>&1 || \
+                   fail "Failed ZFS 'make $MAKE_OPTIONS'"
                pass_nonewline
        fi
 done
@@ -503,7 +532,8 @@ for TAG in $POOL_TAGS; do
        # Use the existing compressed image if available.
        if [ -f "$POOL_BZIP" ]; then
                tar -xjf "$POOL_BZIP" -C "$POOL_DIR_PRISTINE" \
-                   --strip-components=1 || fail 1
+                   --strip-components=1 || \
+                   fail "Failed 'tar -xjf $POOL_BZIP"
        # Use the installed version to create the pool.
        elif  [ "$TAG" = "installed" ]; then
                pool_create "$TAG"
@@ -529,7 +559,8 @@ for TAG in $POOL_TAGS; do
                $ZFS_SH zfs="spa_config_path=$POOL_DIR_COPY"
 
                cp -a --sparse=always "$POOL_DIR_PRISTINE" \
-                   "$POOL_DIR_COPY" || fail 2
+                   "$POOL_DIR_COPY" || \
+                   fail "Failed to copy $POOL_DIR_PRISTINE to $POOL_DIR_COPY"
                POOL_NAME=$($ZPOOL_CMD import -d "$POOL_DIR_COPY" | \
                    awk '/pool:/ { print $2; exit 0 }')
 
@@ -539,13 +570,14 @@ for TAG in $POOL_TAGS; do
                        fail_nonewline
                        ERROR=1
                else
-                       $ZPOOL_CMD export "$POOL_NAME" || fail 3
+                       $ZPOOL_CMD export "$POOL_NAME" || \
+                           fail "Failed to export pool"
                        pass_nonewline
                fi
 
                rm -Rf "$POOL_DIR_COPY"
 
-               $ZFS_SH -u || fail 4
+               $ZFS_SH -u || fail "Failed to unload kmods"
        done
        printf "\n"
 done