--- /dev/null
+#! /bin/sh
+# FS QA Test No. 164
+#
+# To test for short dio reads on IRIX and Linux - pv#962005/962547
+# http://bugworks.engr.sgi.com/query.cgi/962005
+#
+# In particular we are interested in dio_reads for the cases of:
+# * eof on a hole
+# * eof on an unwritten extent
+# * eof on a sector boundary and not on a sector boundary
+#
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2007 Silicon Graphics, Inc. All Rights Reserved.
+#-----------------------------------------------------------------------
+#
+# creator
+owner=tes@puffy.melbourne.sgi.com
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1 # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -f $tmp.*
+}
+
+_filter_io()
+{
+ tee -a $seq.full | sed 's/ops;.*/ops/'
+}
+
+#
+# 1: [128..199]: 212280..212351 0 (212280..212351) 72 10000
+#
+#
+_filter_bmap()
+{
+ tee -a $seq.full |\
+ awk '$3 ~ /hole/ { print $1, $2, $3; next }
+ $7 ~ /10000/ { print $1, $2, "unwritten"; next }
+ {print $1, $2}'
+}
+
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+
+# real QA test starts here
+
+# Modify as appropriate.
+_supported_fs xfs udf nfs
+_supported_os IRIX Linux
+
+testfile=$TEST_DIR/file.$seq
+rm -f $testfile
+
+_test_eof_hole()
+{
+ # on a BB boundary
+ xfs_io -f -c 'pwrite 0 50k' -c 'truncate 100k'\
+ -c 'pread -b 200k 0 200k' $testfile | _filter_io
+ xfs_io -c 'bmap -vp' $testfile | _filter_bmap
+ echo ""
+
+ # on an odd byte boundary => 1 short of boundary
+ boundary_minus1=`expr 100 \* 1024 - 1`
+ echo "boundary_minus1 = $boundary_minus1"
+ xfs_io -f -c 'pwrite 0 50k' -c "truncate $boundary_minus1" \
+ -c 'pread -b 200k 0 200k' $testfile | _filter_io
+ xfs_io -c 'bmap -vp' $testfile | _filter_bmap
+ echo ""
+
+ # on an odd byte boundary => 1 over boundary
+ echo "boundary_plus1 = $boundary_plus1"
+ boundary_plus1=`expr 100 \* 1024 + 1`
+ xfs_io -f -c 'pwrite 0 50k' -c "truncate $boundary_plus1" \
+ -c 'pread -b 200k 0 200k' $testfile | _filter_io
+ xfs_io -c 'bmap -vp' $testfile | _filter_bmap
+ echo ""
+}
+
+_test_eof_unwritten_extent()
+{
+ # on a BB boundary
+ xfs_io -f -c 'resvsp 0 100k' -c 'pwrite 0 50k' \
+ -c 'pread -b 200k 0 200k' $testfile | _filter_io
+ xfs_io -c 'bmap -vp' $testfile | _filter_bmap
+ echo ""
+
+ # on an odd byte boundary => 1 short of boundary
+ boundary_minus1=`expr 100 \* 1024 - 1`
+ echo "boundary_minus1 = $boundary_minus1"
+ xfs_io -f -c "resvsp 0 $boundary_minus1" -c 'pwrite 0 50k' \
+ -c 'pread -b 200k 0 200k' $testfile | _filter_io
+ xfs_io -c 'bmap -vp' $testfile | _filter_bmap
+ echo ""
+
+ # on an odd byte boundary => 1 over boundary
+ boundary_plus1=`expr 100 \* 1024 + 1`
+ echo "boundary_plus1 = $boundary_plus1"
+ xfs_io -f -c "resvsp 0 $boundary_plus1" -c 'pwrite 0 50k' \
+ -c 'pread -b 200k 0 200k' $testfile | _filter_io
+ xfs_io -c 'bmap -vp' $testfile | _filter_bmap
+ echo ""
+}
+
+_test_eof_hole
+_test_eof_unwritten_extent
+
+# success, all done
+status=0
+exit
--- /dev/null
+QA output created by 164
+wrote 51200/51200 bytes at offset 0
+50 KiB, 13 ops
+read 102400/204800 bytes at offset 0
+100 KiB, 1 ops
+/mnt/test/file.164:
+EXT: FILE-OFFSET
+0: [0..127]:
+1: [128..199]: hole
+
+boundary_minus1 = 102399
+wrote 51200/51200 bytes at offset 0
+50 KiB, 13 ops
+read 102399/204800 bytes at offset 0
+100 KiB, 1 ops
+/mnt/test/file.164:
+EXT: FILE-OFFSET
+0: [0..127]:
+1: [128..199]: hole
+
+boundary_plus1 =
+wrote 51200/51200 bytes at offset 0
+50 KiB, 13 ops
+read 102401/204800 bytes at offset 0
+100 KiB, 1 ops
+/mnt/test/file.164:
+EXT: FILE-OFFSET
+0: [0..127]:
+1: [128..207]: hole
+
+wrote 51200/51200 bytes at offset 0
+50 KiB, 13 ops
+read 102401/204800 bytes at offset 0
+100 KiB, 1 ops
+/mnt/test/file.164:
+EXT: FILE-OFFSET
+0: [0..127]:
+1: [128..199]: unwritten
+
+boundary_minus1 = 102399
+wrote 51200/51200 bytes at offset 0
+50 KiB, 13 ops
+read 102401/204800 bytes at offset 0
+100 KiB, 1 ops
+/mnt/test/file.164:
+EXT: FILE-OFFSET
+0: [0..127]:
+1: [128..199]: unwritten
+
+boundary_plus1 = 102401
+wrote 51200/51200 bytes at offset 0
+50 KiB, 13 ops
+read 102401/204800 bytes at offset 0
+100 KiB, 1 ops
+/mnt/test/file.164:
+EXT: FILE-OFFSET
+0: [0..127]:
+1: [128..199]: unwritten
+2: [200..207]: unwritten
+