common: add helper to count number of exclusive extents in a file
[xfstests-dev.git] / common / rc
index bbebadd2d82288f03acb99dab106700ac8607fc6..3c4121780ebf14c10dc652e775676dd51b0b8250 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 $*`
@@ -1959,16 +1964,9 @@ _run_aiodio()
     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)
@@ -1980,23 +1978,32 @@ _require_y2038()
 _filesystem_timestamp_range()
 {
        local device=${1:-$TEST_DEV}
+       u32max=$(((1<<32)-1))
+       s32min=-$((1<<31))
+       s32max=$(((1<<31)-1))
+       s64max=$(((1<<63)-1))
+       s64min=$((1<<63))
+
        case $FSTYP in
-       ext4)
+       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
                ;;
 
-       xfs)
-               echo "-2147483648 2147483647"
-               ;;
        jfs)
-               echo "0 4294967295"
+               echo "0 $u32max"
                ;;
-       f2fs)
-               echo "-2147483648 2147483647"
+       xfs)
+               echo "$s32min $s32max"
+               ;;
+       btrfs)
+               echo "$s64min $s64max"
                ;;
        *)
                echo "-1 -1"
@@ -2184,7 +2191,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
@@ -2222,10 +2229,13 @@ _require_xfs_io_command()
 # 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
@@ -3189,12 +3199,21 @@ _require_metadata_journaling()
 
 _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()