fstests: exclude exfat from tests which require metadata journaling
[xfstests-dev.git] / common / rc
index a2a28f321ad6e4d0366c4c9527085924b78347c8..2000bd9d6f79f03b99380d3aa086d5455ee29ec1 100644 (file)
--- a/common/rc
+++ b/common/rc
@@ -165,6 +165,11 @@ if [ ! -z "$REPORT_LIST" ]; then
        _assert_report_list
 fi
 
+_get_filesize()
+{
+    stat -c %s "$1"
+}
+
 _mount()
 {
     $MOUNT_PROG `_mount_ops_filter $*`
@@ -184,6 +189,12 @@ _get_mount()
 
        _mount $scratch_opts $*
        if [ $? -eq 0 ]; then
+               # mount --move operation updates the mountpoint, so remove
+               # the old one and insert the new one
+               if [[ "$*" =~ --move|-M ]]; then
+                       MOUNTED_POINT_STACK=`echo $MOUNTED_POINT_STACK | \
+                                               cut -d\  -f2-`
+               fi
                MOUNTED_POINT_STACK="$mnt_point $MOUNTED_POINT_STACK"
        else
                return 1
@@ -905,6 +916,17 @@ _free_memory_bytes()
     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()
@@ -1852,6 +1874,17 @@ _require_dm_target()
        _require_sane_bdev_flush $SCRATCH_DEV
        _require_command "$DMSETUP_PROG" dmsetup
 
+       echo $MOUNT_OPTIONS | grep -q dax
+       if [ $? -eq 0 ]; then
+               case $target in
+               stripe|linear|log-writes)
+                       ;;
+               *)
+                       _notrun "Cannot run tests with DAX on $target devices."
+                       ;;
+               esac
+       fi
+
        modprobe dm-$target >/dev/null 2>&1
 
        $DMSETUP_PROG targets 2>&1 | grep -q ^$target
@@ -1968,18 +2001,26 @@ _require_timestamp_range()
        if [ $tsmin -eq -1 -a $tsmax -eq -1 ]; then
                _notrun "filesystem $FSTYP timestamp bounds are unknown"
        fi
+
+       # expect console warning from rw scratch mount if fs limit is near
+       if [ $tsmax -le $((1<<31)) ] && \
+               ! _check_dmesg_for "filesystem being mounted at .* supports timestamps until"
+       then
+               _notrun "Kernel does not support timestamp limits"
+       fi
 }
 
 _filesystem_timestamp_range()
 {
        local device=${1:-$TEST_DEV}
+       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
+       case $fstyp in
        ext2)
                echo "$s32min $s32max"
                ;;
@@ -2000,6 +2041,13 @@ _filesystem_timestamp_range()
        btrfs)
                echo "$s64min $s64max"
                ;;
+       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"
                ;;
@@ -2186,7 +2234,7 @@ _require_xfs_io_command()
                        _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
@@ -2211,7 +2259,7 @@ _require_xfs_io_command()
        [ -n "$param" ] || return
 
        if [ -z "$param_checked" ]; then
-               $XFS_IO_PROG -c "help $command" | grep -q "^ $param --" || \
+               $XFS_IO_PROG -c "help $command" | grep -E -q "^ $param ([a-zA-Z_]+ )?--" || \
                        _notrun "xfs_io $command doesn't support $param"
        else
                # xfs_io could result in "command %c not supported" if it was
@@ -2327,7 +2375,7 @@ _require_fail_make_request()
 {
     [ -f "$DEBUGFS_MNT/fail_make_request/probability" ] \
        || _notrun "$DEBUGFS_MNT/fail_make_request \
- not found. Seems that CONFIG_FAIL_MAKE_REQUEST kernel config option not enabled"
+ not found. Seems that CONFIG_FAULT_INJECTION_DEBUG_FS kernel config option not enabled"
 }
 
 # Disable extent zeroing for ext4 on the given device
@@ -3154,7 +3202,7 @@ _require_norecovery()
 # 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
@@ -3163,43 +3211,72 @@ _require_metadata_journaling()
        fi
 
        case "$FSTYP" in
-       ext2|vfat|msdos|udf)
-               _notrun "$FSTYP does not support metadata journaling"
+       ext2|vfat|msdos|udf|exfat)
+               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()
@@ -3380,7 +3457,7 @@ _scale_fsstress_args()
         esac
         shift
     done
-    echo $args
+    printf '%s\n' "$args"
 }
 
 #
@@ -3404,7 +3481,7 @@ run_check()
        "$@" >> $seqres.full 2>&1 || _fail "failed: '$@'"
 }
 
-_require_test_symlinks()
+_require_symlinks()
 {
        local target=`mktemp -p $TEST_DIR`
        local link=`mktemp -p $TEST_DIR -u`
@@ -3416,6 +3493,18 @@ _require_test_symlinks()
        rm -f $target $link
 }
 
+_require_hardlinks()
+{
+       local target=`mktemp -p $TEST_DIR`
+       local link=`mktemp -p $TEST_DIR -u`
+       ln $target $link
+       if [ "$?" -ne 0 ]; then
+               rm -f $target
+               _notrun "No hardlink support"
+       fi
+       rm -f $target $link
+}
+
 _require_test_fcntl_advisory_locks()
 {
        [ "$FSTYP" != "cifs" ] && return 0
@@ -3424,6 +3513,14 @@ _require_test_fcntl_advisory_locks()
                _notrun "Require fcntl advisory locks support"
 }
 
+_require_test_fcntl_setlease()
+{
+       _require_test_program "locktest"
+       touch $TEST_DIR/setlease_testfile
+       $here/src/locktest -t $TEST_DIR/setlease_testfile >/dev/null 2>&1
+       [ $? -eq 22 ] && _notrun "Require fcntl setlease support"
+}
+
 _require_ofd_locks()
 {
        # Give a test run by getlk wrlck on testfile.
@@ -3524,7 +3621,7 @@ _get_available_space()
 # return device size in kb
 _get_device_size()
 {
-       grep `_short_dev $1` /proc/partitions | awk '{print $3}'
+       grep -w `_short_dev $1` /proc/partitions | awk '{print $3}'
 }
 
 # Make sure we actually have dmesg checking set up.
@@ -3592,7 +3689,9 @@ _check_dmesg()
                _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
 }
@@ -3938,7 +4037,9 @@ _get_max_lfs_filesize()
 {
        case "$(getconf LONG_BIT)" in
        "32")
-               echo $(( ($(getconf PAGE_SIZE) << ($(getconf LONG_BIT) - 1) ) - 1))
+               local ulong_max=$(getconf ULONG_MAX)
+               local page_size=$(getconf PAGE_SIZE)
+               echo $(( ulong_max * page_size ))
                ;;
        "64")
                echo 9223372036854775807
@@ -4087,6 +4188,26 @@ _check_xfs_scrub_does_unicode() {
        return 0
 }
 
+_require_negative_timestamps() {
+       case "$FSTYP" in
+       ceph)
+               _notrun "$FSTYP does not support negative timestamps"
+               ;;
+       esac
+}
+
+# Require the 'accton' userspace tool and CONFIG_BSD_PROCESS_ACCT=y.
+_require_bsd_process_accounting()
+{
+       _require_command "$ACCTON_PROG" accton
+       $ACCTON_PROG on &> $tmp.test_accton
+       cat $tmp.test_accton >> $seqres.full
+       if grep 'Function not implemented' $tmp.test_accton; then
+               _notrun "BSD process accounting support unavailable"
+       fi
+       $ACCTON_PROG off >> $seqres.full
+}
+
 init_rc
 
 ################################################################################