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@xxxxxxxxxx> --- :100755 100755 dfdf3f8... 5efa243... M 252 :100644 100644 cd8e4b4... 930c924... M 252.out :100644 100644 e2da5d8... ddf63b0... M common.punch 252 | 10 +++ 252.out | 192 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ common.punch | 150 ++++++++++++++++++++++++++++++++++++++------- 3 files changed, 330 insertions(+), 22 deletions(-) diff --git a/252 b/252 index dfdf3f8..5efa243 100755 --- 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 cd8e4b4..930c924 100644 --- 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 diff --git a/common.punch b/common.punch index e2da5d8..ddf63b0 100644 --- a/common.punch +++ b/common.punch @@ -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 + } -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html