From 56cc8b05d4c5281c2c91fb7c2e5f0d8279e50922 Mon Sep 17 00:00:00 2001 From: Dave Chinner Date: Sat, 6 Mar 2010 11:22:58 +1100 Subject: [PATCH] xfsqa: add delayed allocation @ ENOSPC exerciser When we deplete the reserve block pool or receive an error during delayed allocation, we currently toss the page away. If that page has delayed allocation extents on it, we can fail to remove them and leave stale delayed llocation extents lying around on the inode. This can, in certain circumstances, trigger errors later on when the stale delalloc extent it found again, including tripping a BUG(). Exercise this failure path so that we get code coverage of the fix that prevents stale delalloc mappings from being left on the inode when pages are tossed. This is based on a test case supplied by Lachlan McIlroy. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- 224 | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 224.out | 2 ++ group | 1 + 3 files changed, 90 insertions(+) create mode 100644 224 create mode 100644 224.out diff --git a/224 b/224 new file mode 100644 index 00000000..21be9af4 --- /dev/null +++ b/224 @@ -0,0 +1,87 @@ +#! /bin/bash +# FS QA Test No. 224 +# +# Delayed allocation at ENOSPC test +# +# Derived from a test case from Lachlan McIlroy and improved to +# reliably trigger a BUG in xfs_get_blocks(). Despite this XFS +# focus, the test can to run on any filesystem to exercise ENOSPC +# behaviour. +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Dave Chinner. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# +# creator +owner=david@fromorbit.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* + rm -f $SCRATCH_MNT/testfile.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_scratch + +# make a 1GB filesystem +_scratch_mkfs_sized `expr 1024 \* 1024 \* 1024` > $seq.full 2>&1 +_scratch_mount >> $seq.full 2>&1 + +# set the reserved block pool to almost empty for XFS +if [ "$FSTYP" = "xfs" ]; then + xfs_io -x -c "resblks 4" /mnt/scratch/ >> $seq.full 2>&1 +fi + +FILES=1000 +for i in `seq 0 1 $FILES`; do + + # set the file size to be 10MB - that way the direct IO will always try + # to read at least 10MB even if only 4k was written. This allows + # discarded delalloc pages that would have been beyond EOF to be + # tripped over. + ( + sleep 5 + xfs_io -f -c "truncate 10485760" $SCRATCH_MNT/testfile.$i + dd if=/dev/zero of=$SCRATCH_MNT/testfile.$i bs=4k conv=notrunc + ) > /dev/null 2>&1 & +done +wait + +for i in `seq 0 1 $FILES`; do + dd of=/dev/null if=$SCRATCH_MNT/testfile.$i bs=512k iflag=direct > /dev/null 2>&1 & +done +wait +echo "*** Silence is golden ***" +status=0 +exit diff --git a/224.out b/224.out new file mode 100644 index 00000000..cf4fd9c8 --- /dev/null +++ b/224.out @@ -0,0 +1,2 @@ +QA output created by 224 +*** Silence is golden *** diff --git a/group b/group index c66d965d..5d675f0d 100644 --- a/group +++ b/group @@ -337,3 +337,4 @@ deprecated 221 auto metadata quick 222 auto fsr ioctl quick 223 auto quick +224 auto -- 2.47.3