- By default the tests suite will run xfs tests:
- ./check '*/001' '*/002' '*/003'
- ./check '*/06?'
- - You can explicitly specify NFS/CIFS/UDF, otherwise the filesystem type will
- be autodetected from $TEST_DEV:
- ./check -nfs [test(s)]
- Groups of tests maybe ran by: ./check -g [group(s)]
See the 'group' file for details on groups
- - for udf tests: ./check -udf [test(s)]
- Running all the udf tests: ./check -udf -g udf
- - for running nfs tests: ./check -nfs [test(s)]
- - for running cifs/smb3 tests: ./check -cifs [test(s)]
- To randomize test order: ./check -r [test(s)]
+ - You can explicitly specify NFS/CIFS/UDF/OVERLAY, otherwise
+ the filesystem type will be autodetected from $TEST_DEV:
+ - for running nfs tests: ./check -nfs [test(s)]
+ - for running cifs/smb3 tests: ./check -cifs [test(s)]
+ - for udf tests: ./check -udf [test(s)]
+ Running all the udf tests: ./check -udf -g udf
+ - for overlay tests: ./check -overlay [test(s)]
+ The TEST and SCRATCH partitions should be pre-formatted
+ with another base fs, where the overlay dirs will be created
The check script tests the return value of each script, and
export OVL_UPPER="ovl-upper"
export OVL_LOWER="ovl-lower"
export OVL_WORK="ovl-work"
+# overlay mount point parent must be the base fs root
+export OVL_MNT="ovl-mnt"
export PWD=`pwd`
#export DEBUG=${DEBUG:=...} # arbitrary CFLAGS really.
if [ "$dev_needed" == "required" ]; then
_fatal "common/config: $name is required but not defined!"
fi
- return
+ return 0
+ fi
+
+ if [ -b "$dev" ] || ( echo $dev | grep -qE ":|//" ); then
+ # block device or a network url
+ return 0
fi
- echo $dev | grep -qE ":|//" > /dev/null 2>&1
- network_dev=$?
if [ "$FSTYP" == "overlay" ]; then
if [ ! -d "$dev" ]; then
_fatal "common/config: $name ($dev) is not a directory for overlay"
fi
- elif [ ! -b "$dev" -a "$network_dev" != "0" ]; then
+ else
_fatal "common/config: $name ($dev) is not a block device or a network filesystem"
fi
}
local name=$1
local dir=$2
- if [ ! -d "$dir" ]; then
+ if [ -d "$dir" ]; then
+ # this follows symlinks and removes all trailing "/"s
+ readlink -e "$dir"
+ return 0
+ fi
+
+ if [ "$FSTYP" != "overlay" ] || [[ "$name" == OVL_BASE_* ]]; then
_fatal "common/config: $name ($dir) is not a directory"
fi
- # this follows symlinks and removes all trailing "/"s
- readlink -e "$dir"
+ # base fs may not be mounted yet, so just check that parent dir
+ # exists (where base fs will be mounted) because we are going to
+ # mkdir the overlay mount point dir anyway
+ local base=`basename $dir`
+ local parent=`dirname $dir`
+ parent=`_canonicalize_mountpoint OVL_BASE_$name "$parent"`
+
+ # prepend the overlay mount point to canonical parent path
+ echo "$parent/$base"
+}
+
+# On check -overlay, for the non multi section config case, this
+# function is called on every test, before init_rc().
+# When SCRATCH/TEST_* vars are defined in config file, config file
+# is sourced on every test and this function overrides the vars
+# every time.
+# When SCRATCH/TEST_* vars are defined in evironment and not
+# in config file, this function is called after vars have already
+# been overriden in the previous test.
+# In that case, TEST_DEV is a directory and not a blockdev and
+# the function will return without overriding the SCRATCH/TEST_* vars.
+_overlay_config_override()
+{
+ # There are 2 options for configuring overlayfs tests:
+ #
+ # 1. (legacy) SCRATCH/TEST_DEV point to existing directories
+ # on an already mounted fs. In this case, the new
+ # OVL_BASE_SCRATCH/TEST_* vars are set to use the legacy
+ # vars values (even though they may not be mount points).
+ #
+ [ ! -d "$TEST_DEV" ] || export OVL_BASE_TEST_DIR="$TEST_DEV"
+ [ ! -d "$SCRATCH_DEV" ] || export OVL_BASE_SCRATCH_MNT="$SCRATCH_DEV"
+
+ # 2. SCRATCH/TEST_DEV point to the base fs partitions. In this case,
+ # the new OVL_BASE_SCRATCH/TEST_DEV/MNT vars are set to the values
+ # of the configured base fs and SCRATCH/TEST_DEV vars are set to the
+ # overlayfs base and mount dirs inside base fs mount.
+ [ -b "$TEST_DEV" ] || return 0
+
+ # Config file may specify base fs type, but we obay -overlay flag
+ export OVL_BASE_FSTYP="$FSTYP"
+ export FSTYP=overlay
+
+ # Store original base fs vars
+ export OVL_BASE_TEST_DEV="$TEST_DEV"
+ export OVL_BASE_TEST_DIR="$TEST_DIR"
+ export OVL_BASE_MOUNT_OPTIONS="$MOUNT_OPTIONS"
+
+ # Set TEST vars to overlay base and mount dirs inside base fs
+ export TEST_DEV="$OVL_BASE_TEST_DIR"
+ export TEST_DIR="$OVL_BASE_TEST_DIR/$OVL_MNT"
+ export MOUNT_OPTIONS="$OVERLAY_MOUNT_OPTIONS"
+
+ [ -b "$SCRATCH_DEV" ] || return 0
+
+ # Store original base fs vars
+ export OVL_BASE_SCRATCH_DEV="$SCRATCH_DEV"
+ export OVL_BASE_SCRATCH_MNT="$SCRATCH_MNT"
+
+ # Set SCRATCH vars to overlay base and mount dirs inside base fs
+ export SCRATCH_DEV="$OVL_BASE_SCRATCH_MNT"
+ export SCRATCH_MNT="$OVL_BASE_SCRATCH_MNT/$OVL_MNT"
+}
+
+_overlay_config_restore()
+{
+ export OVERLAY=true
+ [ -z "$OVL_BASE_FSTYP" ] || export FSTYP=$OVL_BASE_FSTYP
+ [ -z "$OVL_BASE_TEST_DEV" ] || export TEST_DEV=$OVL_BASE_TEST_DEV
+ [ -z "$OVL_BASE_TEST_DIR" ] || export TEST_DIR=$OVL_BASE_TEST_DIR
+ [ -z "$OVL_BASE_SCRATCH_DEV" ] || export SCRATCH_DEV=$OVL_BASE_SCRATCH_DEV
+ [ -z "$OVL_BASE_SCRATCH_MNT" ] || export SCRATCH_MNT=$OVL_BASE_SCRATCH_MNT
+ [ -z "$OVL_BASE_MOUNT_OPTIONS" ] || export MOUNT_OPTIONS=$OVL_BASE_MOUNT_OPTIONS
}
# Parse config section options. This function will parse all the configuration
return 0
fi
+ # We might have overriden FSTYP and TEST/SCRATCH vars with overlay values
+ # in the previous section, so restore them to original values stored in
+ # OVL_BASE_*.
+ # We need to do this *before* old FSTYP and MOUNT_OPTIONS are recorded
+ # and *before* SCRATCH_DEV and MOUNT_OPTIONS are unset
+ if [ "$FSTYP" == "overlay" ]; then
+ _overlay_config_restore
+ fi
+
local OLD_FSTYP=$FSTYP
local OLD_MOUNT_OPTIONS=$MOUNT_OPTIONS
local OLD_TEST_FS_MOUNT_OPTS=$TEST_FS_MOUNT_OPTS
_check_device SCRATCH_RTDEV optional $SCRATCH_RTDEV
_check_device SCRATCH_LOGDEV optional $SCRATCH_LOGDEV
fi
+
+ # Override FSTYP from config when running ./check -overlay
+ # and maybe override base fs TEST/SCRATCH_DEV with overlay base dirs.
+ # We need to do this *after* default mount options are set by base FSTYP
+ # and *after* SCRATCH_DEV is deduced from SCRATCH_DEV_POOL
+ if [ "$OVERLAY" == "true" -o "$FSTYP" == "overlay" ]; then
+ _overlay_config_override
+ fi
}
if [ -z "$CONFIG_INCLUDED" ]; then
[ -z "$MKFS_OPTIONS" ] && _mkfs_opts
[ -z "$FSCK_OPTIONS" ] && _fsck_opts
else
+ # We get here for the non multi section case, on every test that sources
+ # common/rc after re-sourcing the HOST_OPTIONS config file.
+ # Because of this re-sourcing, we need to re-canonicalize the configured
+ # mount points and re-override TEST/SCRATCH_DEV overlay vars.
+
# canonicalize the mount points
# this follows symlinks and removes all trailing "/"s
export TEST_DIR=`_canonicalize_mountpoint TEST_DIR $TEST_DIR`
export SCRATCH_MNT=`_canonicalize_mountpoint SCRATCH_MNT $SCRATCH_MNT`
+
+ # Override FSTYP from config when running ./check -overlay
+ # and maybe override base fs TEST/SCRATCH_DEV with overlay base dirs
+ if [ "$OVERLAY" == "true" -o "$FSTYP" == "overlay" ]; then
+ _overlay_config_override
+ fi
fi
# make sure this script returns success
_scratch_options mount
if [ "$FSTYP" == "overlay" ]; then
- echo `_overlay_mount_options $SCRATCH_DEV`
+ echo `_overlay_mount_options $OVL_BASE_SCRATCH_MNT`
return 0
fi
echo `_common_dev_mount_options $*` $SCRATCH_OPTIONS \
mkdir -p $dir/$OVL_UPPER
mkdir -p $dir/$OVL_LOWER
mkdir -p $dir/$OVL_WORK
+ mkdir -p $dir/$OVL_MNT
}
-# Given a dir, set up 3 subdirectories and mount on the given mnt.
+# Given a base fs dir, set up overlay directories and mount on the given mnt.
# The dir is used as the mount device so it can be seen from df or mount
_overlay_mount()
{
_overlay_test_mount()
{
- _overlay_mount $TEST_DEV $TEST_DIR $*
+ _overlay_mount $OVL_BASE_TEST_DIR $TEST_DIR $*
}
_overlay_scratch_mount()
{
- _overlay_mount $SCRATCH_DEV $SCRATCH_MNT $*
+ _overlay_mount $OVL_BASE_SCRATCH_MNT $SCRATCH_MNT $*
}
_overlay_test_unmount()
{
case $FSTYP in
overlay)
- # $SCRATCH_DEV is a valid directory in overlay case
- rm -rf $SCRATCH_DEV/*
+ # Avoid rm -rf /* if we messed up
+ [ -n "$OVL_BASE_SCRATCH_MNT" ] || return 1
+ rm -rf $OVL_BASE_SCRATCH_MNT/*
;;
*)
+ [ -n "$SCRATCH_MNT" ] || return 1
_scratch_mount
rm -rf $SCRATCH_MNT/*
_scratch_unmount
fi
;;
overlay)
- if [ -z "$SCRATCH_DEV" -o ! -d "$SCRATCH_DEV" ]; then
- _notrun "this test requires a valid \$SCRATCH_DEV as ovl base dir"
+ if [ -z "$OVL_BASE_SCRATCH_MNT" -o ! -d "$OVL_BASE_SCRATCH_MNT" ]; then
+ _notrun "this test requires a valid \$OVL_BASE_SCRATCH_MNT as ovl base dir"
fi
- if [ ! -d "$SCRATCH_MNT" ]; then
+ # if $SCRATCH_MNT is derived from $OVL_BASE_SCRATCH_MNT then
+ # don't check $SCRATCH_MNT dir here because base fs may not be mounted
+ # and we will create the mount point anyway on _overlay_mount
+ if [ "$SCRATCH_MNT" != "$OVL_BASE_SCRATCH_MNT/$OVL_MNT" -a ! -d "$SCRATCH_MNT" ]; then
_notrun "this test requires a valid \$SCRATCH_MNT"
fi
;;
fi
;;
overlay)
- if [ -z "$TEST_DEV" -o ! -d "$TEST_DEV" ]; then
- _notrun "this test requires a valid \$TEST_DEV as ovl base dir"
+ if [ -z "$OVL_BASE_TEST_DIR" -o ! -d "$OVL_BASE_TEST_DIR" ]; then
+ _notrun "this test requires a valid \$TEST_DIR as ovl base dir"
fi
if [ ! -d "$TEST_DIR" ]; then
_notrun "this test requires a valid \$TEST_DIR"