From 133a5c6598ddc858f5b7ecedaf1364fcfe2e477f Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Mon, 21 Aug 2017 10:00:12 -0700 Subject: [PATCH] zimport.sh: Allow custom pool create options 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 Signed-off-by: Brian Behlendorf Closes #6520 --- scripts/zfs.sh | 17 +++++++- scripts/zimport.sh | 102 +++++++++++++++++++++++++++++---------------- 2 files changed, 82 insertions(+), 37 deletions(-) diff --git a/scripts/zfs.sh b/scripts/zfs.sh index 63c3a57d0..7dbb51a17 100755 --- a/scripts/zfs.sh +++ b/scripts/zfs.sh @@ -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 diff --git a/scripts/zimport.sh b/scripts/zimport.sh index 81e415805..c72a4a4e4 100755 --- a/scripts/zimport.sh +++ b/scripts/zimport.sh @@ -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 image directory -p ... Verify pools created with the listed tags -f Temporary directory to use + -o 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 -- 2.39.2