new file mode 100755
@@ -0,0 +1,89 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2020 Chandan Babu R. All Rights Reserved.
+#
+# FS QA Test 527
+#
+# Verify that XFS does not cause inode fork's extent count to overflow when
+# writing to an unwritten extent.
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+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.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/inject
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+_supported_fs xfs
+_require_scratch
+_require_xfs_debug
+_require_xfs_io_command "falloc"
+_require_xfs_io_error_injection "reduce_max_iextents"
+
+echo "Format and mount fs"
+_scratch_mkfs_sized $((1024 * 1024 * 1024)) >> $seqres.full
+_scratch_mount >> $seqres.full
+
+bsize=$(_get_file_block_size $SCRATCH_MNT)
+
+testfile=${SCRATCH_MNT}/testfile
+
+echo "Inject reduce_max_iextents error tag"
+_scratch_inject_error reduce_max_iextents 1
+
+nr_blks=15
+
+for io in Buffered Direct; do
+ echo "* $io write to unwritten extent"
+
+ echo "Fallocate $nr_blks blocks"
+ $XFS_IO_PROG -f -c "falloc 0 $((nr_blks * bsize))" $testfile >> $seqres.full
+
+ if [[ $io == "Buffered" ]]; then
+ xfs_io_flag=""
+ else
+ xfs_io_flag="-d"
+ fi
+
+ echo "$io write to every other block of fallocated space"
+ for i in $(seq 1 2 $((nr_blks - 1))); do
+ $XFS_IO_PROG -f -s $xfs_io_flag -c "pwrite $((i * bsize)) $bsize" \
+ $testfile >> $seqres.full 2>&1
+ [[ $? != 0 ]] && break
+ done
+
+ echo "Verify \$testfile's extent count"
+ nextents=$($XFS_IO_PROG -c 'stat' $testfile | grep nextents)
+ nextents=${nextents##fsxattr.nextents = }
+ if (( $nextents > 10 )); then
+ echo "Extent count overflow check failed: nextents = $nextents"
+ exit 1
+ fi
+
+ rm $testfile
+done
+
+# super_block->s_wb_err will have a newer seq value when compared to "/"'s
+# file->f_sb_err. Consume it here so that xfs_scrub can does not error out.
+$XFS_IO_PROG -c syncfs $SCRATCH_MNT >> $seqres.full 2>&1
+
+# success, all done
+status=0
+exit
new file mode 100644
@@ -0,0 +1,11 @@
+QA output created by 527
+Format and mount fs
+Inject reduce_max_iextents error tag
+* Buffered write to unwritten extent
+Fallocate 15 blocks
+Buffered write to every other block of fallocated space
+Verify $testfile's extent count
+* Direct write to unwritten extent
+Fallocate 15 blocks
+Direct write to every other block of fallocated space
+Verify $testfile's extent count
@@ -524,6 +524,7 @@
524 auto quick punch zero insert collapse
525 auto quick attr
526 auto quick dir hardlink symlink
+527 auto quick
758 auto quick rw attr realtime
759 auto quick rw realtime
760 auto quick rw collapse punch insert zero prealloc
This test verifies that XFS does not cause inode fork's extent count to overflow when writing to an unwritten extent. Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com> --- tests/xfs/527 | 89 +++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/527.out | 11 ++++++ tests/xfs/group | 1 + 3 files changed, 101 insertions(+) create mode 100755 tests/xfs/527 create mode 100644 tests/xfs/527.out