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
+
 }
