mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
expand 252 with more corner case tests
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>
This commit is contained in:
committed by
Christoph Hellwig
parent
abccd8eb54
commit
0c95fadc35
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
+128
-22
@@ -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
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user