summaryrefslogtreecommitdiff
path: root/tests/xfs/415
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2017-01-21 00:11:21 -0800
committerEryu Guan <eguan@redhat.com>2017-01-27 16:06:12 +0800
commitf5f0c11a67a8f5d2b77ea8d5a3661c35c757fdea (patch)
treef61f121cc7f25123e50d54b0a7cd64940d600c81 /tests/xfs/415
parent898e0cf2a46e61a58926c45038cecc3e2d9a6da7 (diff)
xfs: fuzz every field of every structure
Previously, our XFS fuzzing efforts were limited to using the xfs_db blocktrash command to scribble garbage all over a block. This is pretty easy to discover; it would be far more interesting if we could fuzz individual fields looking for unhandled corner cases. Since we now have an online scrub tool, use it to check for our targeted corruptions prior to the usual steps of writing to the FS, taking it offline, repairing, and re-checking. These tests use the new xfs_db 'fuzz' command to test corner case handling of every field. The 'print' command tells us which fields are available, and the fuzz command can write zeroes or ones to the field; set the high, middle, or low bit; add or subtract numbers; or randomize the field. We loop through all fields and all fuzz verbs to see if we can trip up the kernel. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Eryu Guan <eguan@redhat.com> Signed-off-by: Eryu Guan <eguan@redhat.com>
Diffstat (limited to 'tests/xfs/415')
-rwxr-xr-xtests/xfs/41565
1 files changed, 65 insertions, 0 deletions
diff --git a/tests/xfs/415 b/tests/xfs/415
new file mode 100755
index 00000000..efbbe041
--- /dev/null
+++ b/tests/xfs/415
@@ -0,0 +1,65 @@
+#! /bin/bash
+# FS QA Test No. 415
+#
+# Populate a XFS filesystem and fuzz every blockdev inode field.
+# Use xfs_scrub to fix the corruption.
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2017 Oracle, 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-1303 USA
+#-----------------------------------------------------------------------
+#
+
+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 7 15
+
+_cleanup()
+{
+ cd /
+ rm -rf $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+. ./common/populate
+. ./common/fuzzy
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs xfs
+_require_scratch_xfs_fuzz_fields
+
+echo "Format and populate"
+_scratch_populate_cached nofill > $seqres.full 2>&1
+
+echo "Find blockdev inode"
+_scratch_mount
+inum=$(stat -c '%i' $SCRATCH_MNT/S_IFBLK)
+_scratch_unmount
+
+echo "Fuzz inode"
+_scratch_xfs_fuzz_metadata '' 'online' "inode ${inum}" >> $seqres.full
+echo "Done fuzzing inode"
+
+# success, all done
+status=0
+exit