mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
69eb6281a9
Previously _scratch_mount didn't check the mount status and most tests continue to run even if the mount failed (unless test checks for the mount status explicitly). This would result in running tests on the underlying filesystem (usually rootfs) and implicit test failures, and such failures can be annoying and are usually hard to debug. Now _fail test by default if _scratch_mount failed and introduce _try_scratch_mount for tests that need to check mount results themselves. Suggested-by: Andreas Gruenbacher <agruenba@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Andreas Gruenbacher <agruenba@redhat.com> Signed-off-by: Eryu Guan <eguan@redhat.com>
193 lines
4.6 KiB
Plaintext
193 lines
4.6 KiB
Plaintext
#
|
|
# overlayfs specific common functions.
|
|
#
|
|
. ./common/module
|
|
|
|
# Export overlayfs xattrs and constant value
|
|
export OVL_XATTR_OPAQUE="trusted.overlay.opaque"
|
|
export OVL_XATTR_REDIRECT="trusted.overlay.redirect"
|
|
export OVL_XATTR_IMPURE="trusted.overlay.impure"
|
|
export OVL_XATTR_ORIGIN="trusted.overlay.origin"
|
|
export OVL_XATTR_NLINK="trusted.overlay.nlink"
|
|
export OVL_XATTR_UPPER="trusted.overlay.upper"
|
|
|
|
# helper function to do the actual overlayfs mount operation
|
|
_overlay_mount_dirs()
|
|
{
|
|
local lowerdir=$1
|
|
local upperdir=$2
|
|
local workdir=$3
|
|
shift 3
|
|
|
|
$MOUNT_PROG -t overlay -o lowerdir=$lowerdir -o upperdir=$upperdir \
|
|
-o workdir=$workdir `_common_dev_mount_options $*`
|
|
}
|
|
|
|
# Mount with same options/mnt/dev of scratch mount, but optionally
|
|
# with different lower/upper/work dirs
|
|
_overlay_scratch_mount_dirs()
|
|
{
|
|
local lowerdir=$1
|
|
local upperdir=$2
|
|
local workdir=$3
|
|
shift 3
|
|
|
|
_overlay_mount_dirs $lowerdir $upperdir $workdir \
|
|
$* $OVL_BASE_SCRATCH_MNT $SCRATCH_MNT
|
|
}
|
|
|
|
_overlay_mkdirs()
|
|
{
|
|
local dir=$1
|
|
|
|
mkdir -p $dir/$OVL_UPPER
|
|
mkdir -p $dir/$OVL_LOWER
|
|
mkdir -p $dir/$OVL_WORK
|
|
mkdir -p $dir/$OVL_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()
|
|
{
|
|
local dir=$1
|
|
local mnt=$2
|
|
shift 2
|
|
|
|
_supports_filetype $dir || _notrun "upper fs needs to support d_type"
|
|
|
|
_overlay_mkdirs $dir
|
|
|
|
_overlay_mount_dirs $dir/$OVL_LOWER $dir/$OVL_UPPER $dir/$OVL_WORK \
|
|
$* $dir $mnt
|
|
}
|
|
|
|
_overlay_base_mount()
|
|
{
|
|
local devname=$1
|
|
local mntname=$2
|
|
local dev=$3
|
|
local mnt=$4
|
|
shift 4
|
|
|
|
if [ -z "$dev" -o -z "$mnt" ] || \
|
|
_check_mounted_on $devname $dev $mntname $mnt; then
|
|
# no base fs or already mounted
|
|
return 0
|
|
elif [ $? -ne 1 ]; then
|
|
# base fs mounted but not on mount point
|
|
return 1
|
|
fi
|
|
|
|
_mount $* $dev $mnt
|
|
}
|
|
|
|
_overlay_base_test_mount()
|
|
{
|
|
_overlay_base_mount OVL_BASE_TEST_DEV OVL_BASE_TEST_DIR \
|
|
"$OVL_BASE_TEST_DEV" "$OVL_BASE_TEST_DIR" \
|
|
$TEST_FS_MOUNT_OPTS $SELINUX_MOUNT_OPTIONS
|
|
}
|
|
|
|
_overlay_test_mount()
|
|
{
|
|
_overlay_base_test_mount && \
|
|
_overlay_mount $OVL_BASE_TEST_DIR $TEST_DIR $*
|
|
}
|
|
|
|
_overlay_base_scratch_mount()
|
|
{
|
|
_overlay_base_mount OVL_BASE_SCRATCH_DEV OVL_BASE_SCRATCH_MNT \
|
|
"$OVL_BASE_SCRATCH_DEV" "$OVL_BASE_SCRATCH_MNT" \
|
|
$OVL_BASE_MOUNT_OPTIONS $SELINUX_MOUNT_OPTIONS
|
|
}
|
|
|
|
_overlay_scratch_mount()
|
|
{
|
|
_overlay_base_scratch_mount && \
|
|
_overlay_mount $OVL_BASE_SCRATCH_MNT $SCRATCH_MNT $*
|
|
}
|
|
|
|
_overlay_base_unmount()
|
|
{
|
|
local dev=$1
|
|
local mnt=$2
|
|
|
|
[ -n "$dev" -a -n "$mnt" ] || return 0
|
|
|
|
$UMOUNT_PROG $mnt
|
|
}
|
|
|
|
_overlay_test_unmount()
|
|
{
|
|
$UMOUNT_PROG $TEST_DIR
|
|
_overlay_base_unmount "$OVL_BASE_TEST_DEV" "$OVL_BASE_TEST_DIR"
|
|
}
|
|
|
|
_overlay_scratch_unmount()
|
|
{
|
|
$UMOUNT_PROG $SCRATCH_MNT
|
|
_overlay_base_unmount "$OVL_BASE_SCRATCH_DEV" "$OVL_BASE_SCRATCH_MNT"
|
|
}
|
|
|
|
# Check that a specific overlayfs feature is supported
|
|
__check_scratch_overlay_feature()
|
|
{
|
|
local feature=$1
|
|
|
|
# overalyfs features (e.g. redirect_dir, index) are
|
|
# configurable from Kconfig (the build default), by module
|
|
# parameter (the system default) and per mount by mount
|
|
# option ${feature}=[on|off].
|
|
#
|
|
# If the module parameter does not exist then there is no
|
|
# point in checking the mount option.
|
|
local default=`_get_fs_module_param ${feature}`
|
|
[ "$default" = Y ] || [ "$default" = N ] || \
|
|
_notrun "feature '${feature}' not supported by ${FSTYP}"
|
|
|
|
# Check options to be sure. For example, Overlayfs will fallback to
|
|
# index=off if underlying fs does not support file handles.
|
|
# Overlayfs only displays mount option if it differs from the default.
|
|
# Overlayfs may enable the feature, but fallback to read-only mount.
|
|
((( [ "$default" = N ] && _fs_options $SCRATCH_DEV | grep -q "${feature}=on" ) || \
|
|
( [ "$default" = Y ] && ! _fs_options $SCRATCH_DEV | grep -q "${feature}=off" )) && \
|
|
touch $SCRATCH_MNT/foo 2>/dev/null ) || \
|
|
_notrun "${FSTYP} feature '${feature}' cannot be enabled on ${SCRATCH_DEV}"
|
|
}
|
|
|
|
# Require a set of overlayfs features
|
|
_require_scratch_overlay_features()
|
|
{
|
|
local features=( $* )
|
|
local opts="rw"
|
|
|
|
for feature in ${features[*]}; do
|
|
opts+=",${feature}=on"
|
|
done
|
|
|
|
_scratch_mkfs > /dev/null 2>&1
|
|
_try_scratch_mount -o $opts || \
|
|
_notrun "overlay options '$opts' cannot be enabled on ${SCRATCH_DEV}"
|
|
|
|
for feature in ${features[*]}; do
|
|
__check_scratch_overlay_feature ${feature}
|
|
done
|
|
|
|
_scratch_unmount
|
|
}
|
|
|
|
# Helper function to check underlying dirs of overlay filesystem
|
|
_overlay_fsck_dirs()
|
|
{
|
|
local lowerdir=$1
|
|
local upperdir=$2
|
|
local workdir=$3
|
|
shift 3
|
|
|
|
[[ ! -x "$FSCK_OVERLAY_PROG" ]] && return 0
|
|
|
|
$FSCK_OVERLAY_PROG -o lowerdir=$lowerdir -o upperdir=$upperdir \
|
|
-o workdir=$workdir $*
|
|
}
|