_assert_report_list
fi
+_get_filesize()
+{
+ stat -c %s "$1"
+}
+
_mount()
{
$MOUNT_PROG `_mount_ops_filter $*`
local testfile=$dir/$$.ftype
touch $testfile
# look for DT_UNKNOWN files
- local unknowns=$(src/t_dir_type $dir u | wc -l)
+ local unknowns=$($here/src/t_dir_type $dir u | wc -l)
rm $testfile
# 0 unknowns is success
return $unknowns
if [ -z $OVL_BASE_SCRATCH_DEV ]; then
_fail "_scratch_shutdown: call _require_scratch_shutdown first in test"
else
- src/godown $* $OVL_BASE_SCRATCH_MNT
+ $here/src/godown $* $OVL_BASE_SCRATCH_MNT
fi
else
- src/godown $* $SCRATCH_MNT
+ $here/src/godown $* $SCRATCH_MNT
fi
}
free -b | grep ^Mem | awk '{print $4}'
}
+_available_memory_bytes()
+{
+ nf=`free -b | grep ^Mem | awk '{print NF}'`
+ if [[ nf -lt 7 ]]; then
+ # Doesn't have available field. Fallback.
+ _free_memory_bytes
+ else
+ free -b | grep ^Mem | awk '{print $7}'
+ fi
+}
+
# Create fs of certain size on scratch device
# _scratch_mkfs_sized <size in bytes> [optional blocksize]
_scratch_mkfs_sized()
fi
if [ -b "$dev" ]; then
- src/lstat64 "$dev" | $AWK_PROG '/Device type:/ { print $9 }'
+ $here/src/lstat64 "$dev" | $AWK_PROG '/Device type:/ { print $9 }'
fi
}
fi
if [ -c "$dev" ]; then
- src/lstat64 "$dev" | $AWK_PROG '/Device type:/ { print $9 }'
+ $here/src/lstat64 "$dev" | $AWK_PROG '/Device type:/ { print $9 }'
fi
}
{
if [ -z "$1" ]
then
- AIO_TEST=src/aio-dio-regress/aiodio_sparse2
+ AIO_TEST=$here/src/aio-dio-regress/aiodio_sparse2
[ -x $AIO_TEST ] || _notrun "aio-dio utilities required"
else
- AIO_TEST=src/aio-dio-regress/$1
+ AIO_TEST=$here/src/aio-dio-regress/$1
[ -x $AIO_TEST ] || _notrun "$AIO_TEST not built"
fi
_require_aio
#
_require_test_program()
{
- local prog=src/$1
+ local prog=$here/src/$1
[ -x $prog ] || _notrun "$prog not built"
}
return $status
}
-# this test requires y2038 sysfs switch and filesystem
-# timestamp ranges support.
-_require_y2038()
+_require_timestamp_range()
{
local device=${1:-$TEST_DEV}
- local sysfsdir=/proc/sys/fs/fs-timestamp-check-on
-
- if [ ! -e $sysfsdir ]; then
- _notrun "no kernel support for y2038 sysfs switch"
- fi
local tsmin tsmax
read tsmin tsmax <<<$(_filesystem_timestamp_range $device)
_filesystem_timestamp_range()
{
local device=${1:-$TEST_DEV}
- case $FSTYP in
- ext4)
+ local fstyp=${2:-$FSTYP}
+ u32max=$(((1<<32)-1))
+ s32min=-$((1<<31))
+ s32max=$(((1<<31)-1))
+ s64max=$(((1<<63)-1))
+ s64min=$((1<<63))
+
+ case $fstyp in
+ ext2)
+ echo "$s32min $s32max"
+ ;;
+ ext3|ext4)
if [ $(dumpe2fs -h $device 2>/dev/null | grep "Inode size:" | cut -d: -f2) -gt 128 ]; then
- echo "-2147483648 15032385535"
+ printf "%d %d\n" $s32min 0x37fffffff
else
- echo "-2147483648 2147483647"
+ echo "$s32min $s32max"
fi
;;
+ jfs)
+ echo "0 $u32max"
+ ;;
xfs)
- echo "-2147483648 2147483647"
+ echo "$s32min $s32max"
;;
- jfs)
- echo "0 4294967295"
+ btrfs)
+ echo "$s64min $s64max"
;;
- f2fs)
- echo "-2147483648 2147483647"
+ overlay)
+ if [ ! -z $OVL_BASE_FSTYP -a $OVL_BASE_FSTYP != "overlay" ]; then
+ _filesystem_timestamp_range $OVL_BASE_TEST_DEV $OVL_BASE_FSTYP
+ else
+ echo "-1 -1"
+ fi
;;
*)
echo "-1 -1"
_notrun "xfs_io $command support is missing"
;;
"utimes" )
- testio=`$XFS_IO_PROG -f -c "utimes" 0 0 0 0 $testfile 2>&1`
+ testio=`$XFS_IO_PROG -f -c "utimes 0 0 0 0" $testfile 2>&1`
;;
"syncfs")
touch $testfile
# check that kernel and filesystem support direct I/O
_require_odirect()
{
- if [ $FSTYP = "ext4" ] ; then
+ if [ $FSTYP = "ext4" ] || [ $FSTYP = "f2fs" ] ; then
if echo "$MOUNT_OPTIONS" | grep -q "test_dummy_encryption"; then
- _notrun "ext4 encryption doesn't support O_DIRECT"
- elif echo "$MOUNT_OPTIONS" | grep -q "data=journal"; then
+ _notrun "$FSTYP encryption doesn't support O_DIRECT"
+ fi
+ fi
+ if [ $FSTYP = "ext4" ] ; then
+ if echo "$MOUNT_OPTIONS" | grep -q "data=journal"; then
_notrun "ext4 data journaling doesn't support O_DIRECT"
fi
fi
local features
if [ $# -eq 0 ]; then
- features="$(_get_os_name)"
+ features="$(_get_os_name),$FSTYP"
if [ -n "$MOUNT_OPTIONS" ]; then
features=$features,${MOUNT_OPTIONS##"-o "}
fi
# Does shutdown work on this fs?
_require_scratch_shutdown()
{
- [ -x src/godown ] || _notrun "src/godown executable not found"
+ [ -x $here/src/godown ] || _notrun "src/godown executable not found"
_scratch_mkfs > /dev/null 2>&1 || _notrun "_scratch_mkfs failed on $SCRATCH_DEV"
_scratch_mount
# running shutdown to avoid shutting down base fs accidently.
_notrun "This test requires a valid $OVL_BASE_SCRATCH_DEV as ovl base fs"
else
- src/godown -f $OVL_BASE_SCRATCH_MNT 2>&1 \
+ $here/src/godown -f $OVL_BASE_SCRATCH_MNT 2>&1 \
|| _notrun "Underlying filesystem does not support shutdown"
fi
else
- src/godown -f $SCRATCH_MNT 2>&1 \
+ $here/src/godown -f $SCRATCH_MNT 2>&1 \
|| _notrun "$FSTYP does not support shutdown"
fi
# It's possible that TEST_DEV and SCRATCH_DEV have different features (it'd be
# odd, but possible) so check $TEST_DEV by default, but we can optionall pass
# any dev we want.
-_require_metadata_journaling()
+_has_metadata_journaling()
{
if [ -z $1 ]; then
local dev=$TEST_DEV
case "$FSTYP" in
ext2|vfat|msdos|udf)
- _notrun "$FSTYP does not support metadata journaling"
+ echo "$FSTYP does not support metadata journaling"
+ return 1
;;
ext4)
# ext4 could be mkfs'd without a journal...
_require_dumpe2fs
- $DUMPE2FS_PROG -h $dev 2>&1 | grep -q has_journal || \
- _notrun "$FSTYP on $dev not configured with metadata journaling"
+ $DUMPE2FS_PROG -h $dev 2>&1 | grep -q has_journal || {
+ echo "$FSTYP on $dev not configured with metadata journaling"
+ return 1
+ }
# ext4 might not load a journal
- _exclude_scratch_mount_option "noload"
+ if _normalize_mount_options | grep -qw "noload"; then
+ echo "mount option \"noload\" not allowed in this test"
+ return 1
+ fi
;;
overlay)
# metadata journaling check is based on base filesystem configurations
# and because -overlay option saves those configurations to OVL_BASE_*,
# adding restore/override the configurations before/after the check.
if [ ! -z $OVL_BASE_FSTYP -a $OVL_BASE_FSTYP != "overlay" ]; then
+ local ret
+
_overlay_config_restore
- _require_metadata_journaling
+ _has_metadata_journaling
+ ret=$?
_overlay_config_override
+ return $ret
else
- _notrun "No metadata journaling support for legacy overlay setup"
+ echo "No metadata journaling support for legacy overlay setup"
+ return 1
fi
;;
*)
# by default we pass; if you need to, add your fs above!
;;
esac
+ return 0
+}
+
+_require_metadata_journaling()
+{
+ local msg=$(_has_metadata_journaling $@)
+ if [ -n "$msg" ]; then
+ _notrun "$msg"
+ fi
}
_count_extents()
{
- $XFS_IO_PROG -c "fiemap" $1 | tail -n +2 | grep -v hole | wc -l
+ $XFS_IO_PROG -r -c "fiemap" $1 | tail -n +2 | grep -v hole | wc -l
+}
+
+# Similar to _count_extents() but if any extent is shared multiples times in
+# the file (reflinked to different file offsets), it is accounted as 1 extent
+# instead of N extents.
+_count_exclusive_extents()
+{
+ $XFS_IO_PROG -r -c "fiemap" $1 | tail -n +2 | grep -v hole | \
+ cut -d ' ' -f 3 | sort | uniq | wc -l
}
_count_holes()
{
- $XFS_IO_PROG -c "fiemap" $1 | tail -n +2 | grep hole | wc -l
+ $XFS_IO_PROG -r -c "fiemap" $1 | tail -n +2 | grep hole | wc -l
}
_count_attr_extents()
_require_userns()
{
- [ -x src/nsexec ] || _notrun "src/nsexec executable not found"
- src/nsexec -U true 2>/dev/null || _notrun "userns not supported by this kernel"
+ [ -x $here/src/nsexec ] || _notrun "src/nsexec executable not found"
+ $here/src/nsexec -U true 2>/dev/null || _notrun "userns not supported by this kernel"
}
_create_loop_device()
# EINVAL will be returned.
_require_test_program "t_ofd_locks"
touch $TEST_DIR/ofd_testfile
- src/t_ofd_locks -t $TEST_DIR/ofd_testfile > /dev/null 2>&1
+ $here/src/t_ofd_locks -t $TEST_DIR/ofd_testfile > /dev/null 2>&1
[ $? -eq 22 ] && _notrun "Require OFD locks support"
}
_dump_err "_check_dmesg: something found in dmesg (see $seqres.dmesg)"
return 1
else
- rm -f $seqres.dmesg
+ if [ "$KEEP_DMESG" != "yes" ]; then
+ rm -f $seqres.dmesg
+ fi
return 0
fi
}