generic: xattr enospc cleanup test
authorBrian Foster <bfoster@redhat.com>
Tue, 4 Aug 2015 04:10:49 +0000 (14:10 +1000)
committerDave Chinner <david@fromorbit.com>
Tue, 4 Aug 2015 04:10:49 +0000 (14:10 +1000)
XFS had a regression where inode reclaim in the unlink codepath would
not correctly tear down extended attribute forks where no xattr extents
are present. Add a generic test to create this condition.

The test sets extended attributes on a series of files under ENOSPC
conditions and then verifies that the files can be removed without
syslog warnings or errors.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Eryu Guan <eguan@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
common/rc
tests/generic/103 [new file with mode: 0644]
tests/generic/103.out [new file with mode: 0644]
tests/generic/group

index 00d59796ac31eeffb805dd903df5c2b421cc9139..5e83c809160f8ac60fa9d2c403ecbc7b9f480654 100644 (file)
--- a/common/rc
+++ b/common/rc
@@ -2995,6 +2995,7 @@ _check_dmesg()
             -e "BUG:" \
             -e "Oops:" \
             -e "possible recursive locking detected" \
             -e "BUG:" \
             -e "Oops:" \
             -e "possible recursive locking detected" \
+            -e "Internal error" \
             $seqres.dmesg
        if [ $? -eq 0 ]; then
                echo "_check_dmesg: something found in dmesg (see $seqres.dmesg)"
             $seqres.dmesg
        if [ $? -eq 0 ]; then
                echo "_check_dmesg: something found in dmesg (see $seqres.dmesg)"
diff --git a/tests/generic/103 b/tests/generic/103
new file mode 100644 (file)
index 0000000..3884e3e
--- /dev/null
@@ -0,0 +1,92 @@
+#! /bin/bash
+# FSQA Test No. 103
+#
+# Test attribute fork teardown. This test is inspired by a regression in XFS
+# that resulted in problematic removal of inodes with remote attribute forks
+# without attribute extents. The attribute fork condition is created by
+# attempting to set larger attribute values on a filesystem that is at or near
+# ENOSPC.
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2015 Red Hat, Inc.  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
+#
+#-----------------------------------------------------------------------
+#
+
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+_cleanup()
+{
+        cd /
+        rm -f $tmp.*
+}
+
+here=`pwd`
+tmp=/tmp/$$
+status=1       # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15 25
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/attr
+
+# real QA test starts here
+_supported_fs generic
+_supported_os Linux
+_require_scratch
+_require_attrs
+_require_xfs_io_command "falloc"
+
+rm -f $seqres.full
+
+_consume_freesp()
+{
+       file=$1
+
+       # consume nearly all available space (leave ~512kB)
+       avail=`_get_available_space $SCRATCH_MNT`
+       filesizekb=$((avail / 1024 - 512))
+       $XFS_IO_PROG -fc "falloc 0 ${filesizekb}k" $file
+}
+
+_scratch_mkfs >> $seqres.full 2>&1
+_scratch_mount
+
+for i in $(seq 0 63); do
+       touch $SCRATCH_MNT/$seq.$i
+done
+
+# Generate a large attribute value and consume the rest of the space in the
+# filesystem.
+$XFS_IO_PROG -fc "pwrite 0 64k" $SCRATCH_MNT/attrval > /dev/null 2>&1
+_consume_freesp $SCRATCH_MNT/spc
+
+# Set attributes on the test files. These should start to hit ENOSPC.
+for i in $(seq 0 63); do
+       $SETFATTR_PROG -n user.test -v "`cat $SCRATCH_MNT/attrval`" \
+               $SCRATCH_MNT/$seq.$i >> $seqres.full 2>&1
+done
+
+# Remove the files with attributes to test attribute fork teardown. Problems
+# result in dmesg output.
+rm -f $SCRATCH_MNT/$seq.*
+
+echo Silence is golden.
+
+status=0
+exit
diff --git a/tests/generic/103.out b/tests/generic/103.out
new file mode 100644 (file)
index 0000000..ce229bf
--- /dev/null
@@ -0,0 +1,2 @@
+QA output created by 103
+Silence is golden.
index 8cf12fa7ea8e55763149d0277a11d61d2e784d72..9da394e0d3c8f48df19180e0369ba5d55e57f2ec 100644 (file)
 100 udf auto
 101 auto quick metadata
 102 auto rw
 100 udf auto
 101 auto quick metadata
 102 auto rw
+103 auto enospc quick
 105 acl auto quick
 112 rw aio auto quick
 113 rw aio auto quick
 105 acl auto quick
 112 rw aio auto quick
 113 rw aio auto quick