expand 252 with more corner case tests
authorAllison Henderson <achender@vnet.ibm.com>
Mon, 6 Jun 2011 23:33:50 +0000 (16:33 -0700)
committerChristoph Hellwig <hch@lst.de>
Fri, 17 Jun 2011 12:14:57 +0000 (14:14 +0200)
This patch adds additional punch hole tests to 252
that were used to test ext4 punch hole. The _test_generic_punch
routine has been modified to accept two new flags:

-k To keep the test file between tests.
   This will test the handling of existing holes

-d To not sync the file between tests.
   This will test the handling of delayed extents

Four new corner cases have also been added to the routine:
14. data -> hole @ EOF
15. data -> hole @ 0
16. data -> cache cold ->hole
17. data -> hole in single block file

Signed-off-by: Allison Henderson <achender@us.ibm.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
252
252.out
common.punch

diff --git a/252 b/252
index dfdf3f89d72ba35a4d0c8db8e52e626464ad7cf9..5efa243ce4196dea8ec532c08c3199d32ac5e31c 100755 (executable)
--- a/252
+++ b/252
@@ -52,6 +52,16 @@ _require_xfs_io_fiemap
 
 testfile=$TEST_DIR/252.$$
 
+# Standard punch hole tests
 _test_generic_punch falloc fpunch fpunch fiemap _filter_fiemap $testfile -F
 
+# Delayed allocation punch hole tests
+_test_generic_punch -d falloc fpunch fpunch fiemap _filter_fiemap $testfile -F
+
+# Multi hole punch tests
+_test_generic_punch -k falloc fpunch fpunch fiemap _filter_fiemap $testfile -F
+
+# Delayed allocation multi punch hole tests
+_test_generic_punch -d -k falloc fpunch fpunch fiemap _filter_fiemap $testfile -F
+
 status=0 ; exit
diff --git a/252.out b/252.out
index cd8e4b490c631b50c1e1d2a49c306d8c161d65af..930c9245fc2353befb0a1d07fe7c658320b896d8 100644 (file)
--- a/252.out
+++ b/252.out
@@ -45,3 +45,195 @@ QA output created by 252
 0: [0..7]: data
 1: [8..31]: hole
 2: [32..39]: data
+       14. data -> hole @ EOF
+0: [0..23]: data
+1: [24..39]: hole
+       15. data -> hole @ 0
+0: [0..15]: hole
+1: [16..39]: data
+       16. data -> cache cold ->hole
+0: [0..15]: hole
+1: [16..39]: data
+       17. data -> hole in single block file
+0: [0..7]: data
+       1. into a hole
+       2. into allocated space
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       3. into unwritten space
+0: [0..7]: unwritten
+1: [8..23]: hole
+2: [24..39]: unwritten
+       4. hole -> data
+0: [0..23]: hole
+1: [24..31]: data
+2: [32..39]: hole
+       5. hole -> unwritten
+0: [0..23]: hole
+1: [24..31]: unwritten
+2: [32..39]: hole
+       6. data -> hole
+0: [0..7]: data
+1: [8..39]: hole
+       7. data -> unwritten
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..31]: unwritten
+3: [32..39]: hole
+       8. unwritten -> hole
+0: [0..7]: unwritten
+1: [8..39]: hole
+       9. unwritten -> data
+0: [0..7]: unwritten
+1: [8..23]: hole
+2: [24..31]: data
+3: [32..39]: hole
+       10. hole -> data -> hole
+       11. data -> hole -> data
+0: [0..7]: data
+1: [8..31]: hole
+2: [32..39]: data
+       12. unwritten -> data -> unwritten
+0: [0..7]: unwritten
+1: [8..31]: hole
+2: [32..39]: unwritten
+       13. data -> unwritten -> data
+0: [0..7]: data
+1: [8..31]: hole
+2: [32..39]: data
+       14. data -> hole @ EOF
+0: [0..23]: data
+1: [24..39]: hole
+       15. data -> hole @ 0
+0: [0..15]: hole
+1: [16..39]: data
+       16. data -> cache cold ->hole
+0: [0..15]: hole
+1: [16..39]: data
+       17. data -> hole in single block file
+0: [0..7]: data
+       1. into a hole
+0: [0..7]: data
+1: [8..39]: hole
+       2. into allocated space
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       3. into unwritten space
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       4. hole -> data
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       5. hole -> unwritten
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       6. data -> hole
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       7. data -> unwritten
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       8. unwritten -> hole
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       9. unwritten -> data
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       10. hole -> data -> hole
+0: [0..7]: data
+1: [8..31]: hole
+2: [32..39]: data
+       11. data -> hole -> data
+0: [0..7]: data
+1: [8..31]: hole
+2: [32..39]: data
+       12. unwritten -> data -> unwritten
+0: [0..7]: data
+1: [8..31]: hole
+2: [32..39]: data
+       13. data -> unwritten -> data
+0: [0..7]: data
+1: [8..31]: hole
+2: [32..39]: data
+       14. data -> hole @ EOF
+0: [0..23]: data
+1: [24..39]: hole
+       15. data -> hole @ 0
+0: [0..15]: hole
+1: [16..39]: data
+       16. data -> cache cold ->hole
+0: [0..15]: hole
+1: [16..39]: data
+       17. data -> hole in single block file
+0: [0..7]: data
+       1. into a hole
+0: [0..7]: data
+1: [8..39]: hole
+       2. into allocated space
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       3. into unwritten space
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       4. hole -> data
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       5. hole -> unwritten
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       6. data -> hole
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       7. data -> unwritten
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       8. unwritten -> hole
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       9. unwritten -> data
+0: [0..7]: data
+1: [8..23]: hole
+2: [24..39]: data
+       10. hole -> data -> hole
+0: [0..7]: data
+1: [8..31]: hole
+2: [32..39]: data
+       11. data -> hole -> data
+0: [0..7]: data
+1: [8..31]: hole
+2: [32..39]: data
+       12. unwritten -> data -> unwritten
+0: [0..7]: data
+1: [8..31]: hole
+2: [32..39]: data
+       13. data -> unwritten -> data
+0: [0..7]: data
+1: [8..31]: hole
+2: [32..39]: data
+       14. data -> hole @ EOF
+0: [0..23]: data
+1: [24..39]: hole
+       15. data -> hole @ 0
+0: [0..15]: hole
+1: [16..39]: data
+       16. data -> cache cold ->hole
+0: [0..15]: hole
+1: [16..39]: data
+       17. data -> hole in single block file
+0: [0..7]: data
index e2da5d88dac5f56dee64215997e37c1be2b21e64..ddf63b0e6d4775884ea758ed0fece69d90e4ee54 100644 (file)
@@ -256,8 +256,39 @@ die_now()
 #      11. data -> hole -> data
 #      12. unwritten -> data -> unwritten
 #      13. data -> unwritten -> data
+#      14. data -> hole @ EOF
+#      15. data -> hole @ 0
+#      16. data -> cache cold ->hole
+#      17. data -> hole in single block file
+#
+# Test file is removed, created and sync'd between tests.
+#
+# Use -k flag to keep the file between tests.  This will
+# test the handling of pre-existing holes.
+#
+# Use the -d flag to not sync the file between tests.
+# This will test the handling of delayed extents
+#
 _test_generic_punch()
 {
+
+       remove_testfile=1
+       sync_cmd="-c fsync"
+       OPTIND=1
+       while getopts 'dk' OPTION
+       do
+               case $OPTION in
+               k)      remove_testfile=
+               ;;
+               d)      sync_cmd=
+               ;;
+               ?)      echo Invalid flag
+               exit 1
+               ;;
+               esac
+       done
+       shift $(($OPTIND - 1))
+
        alloc_cmd=$1
        punch_cmd=$2
        zero_cmd=$3     #if not testing zero just set to punch
@@ -267,22 +298,28 @@ _test_generic_punch()
        xfs_io_opt=$7   #needs to be -F if not testing xfs
 
        echo "  1. into a hole"
-       rm -f $testfile
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
        $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
                -c "$zero_cmd 4k 8k" \
                -c "$map_cmd -v" $testfile | $filter_cmd
        [ $? -ne 0 ] && die_now
 
        echo "  2. into allocated space"
-       rm -f $testfile
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
        $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
-               -c "pwrite 0 20k" -c "fsync" \
+               -c "pwrite 0 20k" $sync_cmd \
                -c "$zero_cmd 4k 8k" \
                -c "$map_cmd -v" $testfile | $filter_cmd
        [ $? -ne 0 ] && die_now
 
        echo "  3. into unwritten space"
-       rm -f $testfile
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
        $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
                -c "$alloc_cmd 0 20k" \
                -c "$zero_cmd 4k 8k" \
@@ -290,15 +327,19 @@ _test_generic_punch()
        [ $? -ne 0 ] && die_now
 
        echo "  4. hole -> data"
-       rm -f $testfile
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
        $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
-               -c "pwrite 8k 8k" -c "fsync" \
+               -c "pwrite 8k 8k" $sync_cmd \
                -c "$zero_cmd 4k 8k" \
                -c "$map_cmd -v" $testfile | $filter_cmd
        [ $? -ne 0 ] && die_now
 
        echo "  5. hole -> unwritten"
-       rm -f $testfile
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
        $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
                -c "$alloc_cmd 8k 8k" \
                -c "$zero_cmd 4k 8k" \
@@ -306,24 +347,30 @@ _test_generic_punch()
        [ $? -ne 0 ] && die_now
 
        echo "  6. data -> hole"
-       rm -f $testfile
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
        $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
-               -c "pwrite 0 8k" -c "fsync" \
+               -c "pwrite 0 8k" $sync_cmd \
                -c "$zero_cmd 4k 8k" \
                -c "$map_cmd -v" $testfile | $filter_cmd
        [ $? -ne 0 ] && die_now
 
        echo "  7. data -> unwritten"
-       rm -f $testfile
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
        $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
-               -c "pwrite 0 8k" -c "fsync" \
+               -c "pwrite 0 8k" $sync_cmd \
                -c "$alloc_cmd 8k 8k" \
                -c "$zero_cmd 4k 8k" \
                -c "$map_cmd -v" $testfile | $filter_cmd
        [ $? -ne 0 ] && die_now
 
        echo "  8. unwritten -> hole"
-       rm -f $testfile
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
        $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
                -c "$alloc_cmd 0 8k" \
                -c "$zero_cmd 4k 8k" \
@@ -331,49 +378,108 @@ _test_generic_punch()
        [ $? -ne 0 ] && die_now
 
        echo "  9. unwritten -> data"
-       rm -f $testfile
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
        $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
                -c "$alloc_cmd 0 8k" \
-               -c "pwrite 8k 8k" -c "fsync" \
+               -c "pwrite 8k 8k" $sync_cmd \
                -c "$zero_cmd 4k 8k" \
                -c "$map_cmd -v" $testfile | $filter_cmd
        [ $? -ne 0 ] && die_now
 
        echo "  10. hole -> data -> hole"
-       rm -f $testfile
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
        $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
-               -c "pwrite 8k 4k" -c "fsync" \
+               -c "pwrite 8k 4k" $sync_cmd \
                -c "$zero_cmd 4k 12k" \
                -c "$map_cmd -v" $testfile | $filter_cmd
        [ $? -ne 0 ] && die_now
 
        echo "  11. data -> hole -> data"
-       rm -f $testfile
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
        $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
                -c "$alloc_cmd 0 20k" \
                -c "pwrite 0 8k" \
-               -c "pwrite 12k 8k" -c "fsync" \
+               -c "pwrite 12k 8k" $sync_cmd \
                -c "$punch_cmd 8k 4k" \
                -c "$zero_cmd 4k 12k" \
                -c "$map_cmd -v" $testfile | $filter_cmd
        [ $? -ne 0 ] && die_now
 
        echo "  12. unwritten -> data -> unwritten"
-       rm -f $testfile
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
        $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
                -c "$alloc_cmd 0 20k" \
-               -c "pwrite 8k 4k" -c "fsync" \
+               -c "pwrite 8k 4k" $sync_cmd \
                -c "$zero_cmd 4k 12k" \
                -c "$map_cmd -v" $testfile | $filter_cmd
        [ $? -ne 0 ] && die_now
 
        echo "  13. data -> unwritten -> data"
-       rm -f $testfile
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
        $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
                -c "$alloc_cmd 0 20k" \
-               -c "pwrite 0k 8k" -c "fsync" \
+               -c "pwrite 0k 8k" $sync_cmd \
                -c "pwrite 12k 8k" -c "fsync" \
                -c "$zero_cmd 4k 12k" \
                -c "$map_cmd -v" $testfile | $filter_cmd
        [ $? -ne 0 ] && die_now
+
+       echo "  14. data -> hole @ EOF"
+       rm -f $testfile
+       $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
+               -c "pwrite 0 20k" $sync_cmd \
+               -c "$zero_cmd 12k 8k" \
+               -c "$map_cmd -v" $testfile | $filter_cmd
+       [ $? -ne 0 ] && die_now
+
+       echo "  15. data -> hole @ 0"
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
+       $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
+               -c "pwrite 0 20k" $sync_cmd \
+               -c "$zero_cmd 0k 8k" \
+               -c "$map_cmd -v" $testfile | $filter_cmd
+       [ $? -ne 0 ] && die_now
+
+       echo "  16. data -> cache cold ->hole"
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+               rm -f $testfile.2
+       else
+               cp $testfile $testfile.2
+       fi
+       $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
+               -c "pwrite 8k 12k" -c "fsync" $testfile.2 \
+               > /dev/null
+       $XFS_IO_PROG $xfs_io_opt -f -c "truncate 20k" \
+               -c "pwrite 0 20k" $sync_cmd \
+               -c "$zero_cmd 0k 8k" \
+               -c "fadvise -d" \
+               -c "$map_cmd -v" $testfile | $filter_cmd
+       diff $testfile $testfile.2
+       [ $? -ne 0 ] && die_now
+       rm -f $testfile.2
+
+       echo "  17. data -> hole in single block file"
+       if [ "$remove_testfile" ]; then
+               rm -f $testfile
+       fi
+       block_size=`stat -f $TEST_DEV | grep "Block size" | cut -d " " -f3`
+       $XFS_IO_PROG $xfs_io_opt -f -c "truncate $block_size" \
+               -c "pwrite 0 $block_size" $sync_cmd \
+               -c "$zero_cmd 128 128" \
+               -c "$map_cmd -v" $testfile | $filter_cmd
+       [ $? -ne 0 ] && die_now
+
 }