]> git.apps.os.sepia.ceph.com Git - xfstests-dev.git/commitdiff
fuzzy: test fuzzing directory block mappings
authorDarrick J. Wong <djwong@kernel.org>
Fri, 30 Dec 2022 22:19:44 +0000 (14:19 -0800)
committerZorro Lang <zlang@kernel.org>
Sat, 25 Feb 2023 13:24:52 +0000 (21:24 +0800)
Fuzz the block mappings of directories to see what happens.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Zorro Lang <zlang@redhat.com>
Signed-off-by: Zorro Lang <zlang@kernel.org>
common/fuzzy
tests/xfs/733 [new file with mode: 0755]
tests/xfs/733.out [new file with mode: 0644]
tests/xfs/734 [new file with mode: 0755]
tests/xfs/734.out [new file with mode: 0644]
tests/xfs/735 [new file with mode: 0755]
tests/xfs/735.out [new file with mode: 0644]

index 74230aacb93d385d8a0eb994424b079171eda60c..dfd50b1f2f39cf81b6c1975f0ed8b9f97e4f239d 100644 (file)
@@ -549,6 +549,22 @@ _require_scratch_xfs_fuzz_fields()
        _require_xfs_db_command "fuzz"
 }
 
+# Sets the array SCRATCH_XFS_DIR_FUZZ_TYPES to the list of directory formats
+# available for fuzzing.  Each list item must match one of the /S_IFDIR.FMT_*
+# files created by the fs population code.  Users can override this by setting
+# SCRATCH_XFS_LIST_FUZZ_DIRTYPE in the environment.  BTREE is omitted here
+# because that refers to the fork format and does not affect the directory
+# structure at all.
+_scratch_xfs_set_dir_fuzz_types() {
+       if [ -n "${SCRATCH_XFS_LIST_FUZZ_DIRTYPE}" ]; then
+               mapfile -t SCRATCH_XFS_DIR_FUZZ_TYPES < \
+                               <(echo "${SCRATCH_XFS_LIST_FUZZ_DIRTYPE}" | tr '[ ,]' '[\n\n]')
+               return
+       fi
+
+       SCRATCH_XFS_DIR_FUZZ_TYPES=(BLOCK LEAF LEAFN NODE)
+}
+
 # Grab the list of available fuzzing verbs
 _scratch_xfs_list_fuzz_verbs() {
        if [ -n "${SCRATCH_XFS_LIST_FUZZ_VERBS}" ]; then
diff --git a/tests/xfs/733 b/tests/xfs/733
new file mode 100755 (executable)
index 0000000..d9f9b1c
--- /dev/null
@@ -0,0 +1,48 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2022 Oracle.  All Rights Reserved.
+#
+# FS QA Test No. 733
+#
+# Populate a XFS filesystem and fuzz the data mappings of every directory type.
+# Use xfs_scrub to fix the corruption.
+#
+. ./common/preamble
+_begin_fstest dangerous_fuzzers dangerous_scrub dangerous_online_repair
+
+_register_cleanup "_cleanup" BUS
+
+# Import common functions.
+. ./common/filter
+. ./common/populate
+. ./common/fuzzy
+
+# real QA test starts here
+_supported_fs xfs
+_require_scratch_xfs_fuzz_fields
+
+echo "Format and populate"
+_scratch_populate_cached nofill > $seqres.full 2>&1
+
+_scratch_xfs_set_dir_fuzz_types
+
+# Now fuzz the block maps of each directory type.
+for dirtype in "${SCRATCH_XFS_DIR_FUZZ_TYPES[@]}"; do
+       echo "Fuzz block map for ${dirtype}" | tee -a $seqres.full
+
+       # Restore a correct copy of the filesystem before we start a round of
+       # fuzzing.  This avoids corruption errors from xfs_db when
+       # _scratch_xfs_fuzz_metadata probes the directory block fields.
+       __scratch_xfs_fuzz_mdrestore
+
+       _scratch_mount
+       inum=$(stat -c '%i' $SCRATCH_MNT/S_IFDIR.FMT_${dirtype})
+       _scratch_unmount
+
+       _scratch_xfs_fuzz_metadata 'u*.bmx' 'online'  "inode ${inum}" >> $seqres.full
+       echo "Done fuzzing dir map ${dirtype}"
+done
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/733.out b/tests/xfs/733.out
new file mode 100644 (file)
index 0000000..949fbc1
--- /dev/null
@@ -0,0 +1,10 @@
+QA output created by 733
+Format and populate
+Fuzz block map for BLOCK
+Done fuzzing dir map BLOCK
+Fuzz block map for LEAF
+Done fuzzing dir map LEAF
+Fuzz block map for LEAFN
+Done fuzzing dir map LEAFN
+Fuzz block map for NODE
+Done fuzzing dir map NODE
diff --git a/tests/xfs/734 b/tests/xfs/734
new file mode 100755 (executable)
index 0000000..9ffe0df
--- /dev/null
@@ -0,0 +1,48 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2022 Oracle.  All Rights Reserved.
+#
+# FS QA Test No. 734
+#
+# Populate a XFS filesystem and fuzz the data mappings of every directory type.
+# Use xfs_repair to fix the corruption.
+#
+. ./common/preamble
+_begin_fstest dangerous_fuzzers dangerous_scrub dangerous_repair
+
+_register_cleanup "_cleanup" BUS
+
+# Import common functions.
+. ./common/filter
+. ./common/populate
+. ./common/fuzzy
+
+# real QA test starts here
+_supported_fs xfs
+_require_scratch_xfs_fuzz_fields
+
+echo "Format and populate"
+_scratch_populate_cached nofill > $seqres.full 2>&1
+
+_scratch_xfs_set_dir_fuzz_types
+
+# Now fuzz the block maps of each directory type.
+for dirtype in "${SCRATCH_XFS_DIR_FUZZ_TYPES[@]}"; do
+       echo "Fuzz block map for ${dirtype}" | tee -a $seqres.full
+
+       # Restore a correct copy of the filesystem before we start a round of
+       # fuzzing.  This avoids corruption errors from xfs_db when
+       # _scratch_xfs_fuzz_metadata probes the directory block fields.
+       __scratch_xfs_fuzz_mdrestore
+
+       _scratch_mount
+       inum=$(stat -c '%i' $SCRATCH_MNT/S_IFDIR.FMT_${dirtype})
+       _scratch_unmount
+
+       _scratch_xfs_fuzz_metadata 'u*.bmx' 'offline'  "inode ${inum}" >> $seqres.full
+       echo "Done fuzzing dir map ${dirtype}"
+done
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/734.out b/tests/xfs/734.out
new file mode 100644 (file)
index 0000000..80b91b6
--- /dev/null
@@ -0,0 +1,10 @@
+QA output created by 734
+Format and populate
+Fuzz block map for BLOCK
+Done fuzzing dir map BLOCK
+Fuzz block map for LEAF
+Done fuzzing dir map LEAF
+Fuzz block map for LEAFN
+Done fuzzing dir map LEAFN
+Fuzz block map for NODE
+Done fuzzing dir map NODE
diff --git a/tests/xfs/735 b/tests/xfs/735
new file mode 100755 (executable)
index 0000000..96a171f
--- /dev/null
@@ -0,0 +1,48 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2022 Oracle.  All Rights Reserved.
+#
+# FS QA Test No. 735
+#
+# Populate a XFS filesystem and fuzz the data mappings of every directory type.
+# Do not fix the filesystem, to test metadata verifiers.
+#
+. ./common/preamble
+_begin_fstest dangerous_fuzzers dangerous_scrub dangerous_norepair
+
+_register_cleanup "_cleanup" BUS
+
+# Import common functions.
+. ./common/filter
+. ./common/populate
+. ./common/fuzzy
+
+# real QA test starts here
+_supported_fs xfs
+_require_scratch_xfs_fuzz_fields
+
+echo "Format and populate"
+_scratch_populate_cached nofill > $seqres.full 2>&1
+
+_scratch_xfs_set_dir_fuzz_types
+
+# Now fuzz the block maps of each directory type.
+for dirtype in "${SCRATCH_XFS_DIR_FUZZ_TYPES[@]}"; do
+       echo "Fuzz block map for ${dirtype}" | tee -a $seqres.full
+
+       # Restore a correct copy of the filesystem before we start a round of
+       # fuzzing.  This avoids corruption errors from xfs_db when
+       # _scratch_xfs_fuzz_metadata probes the directory block fields.
+       __scratch_xfs_fuzz_mdrestore
+
+       _scratch_mount
+       inum=$(stat -c '%i' $SCRATCH_MNT/S_IFDIR.FMT_${dirtype})
+       _scratch_unmount
+
+       _scratch_xfs_fuzz_metadata 'u*.bmx' 'none'  "inode ${inum}" >> $seqres.full
+       echo "Done fuzzing dir map ${dirtype}"
+done
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/735.out b/tests/xfs/735.out
new file mode 100644 (file)
index 0000000..5fa88f7
--- /dev/null
@@ -0,0 +1,10 @@
+QA output created by 735
+Format and populate
+Fuzz block map for BLOCK
+Done fuzzing dir map BLOCK
+Fuzz block map for LEAF
+Done fuzzing dir map LEAF
+Fuzz block map for LEAFN
+Done fuzzing dir map LEAFN
+Fuzz block map for NODE
+Done fuzzing dir map NODE