From d492bcd86bc4caaae4d3e6964767dd3a03139418 Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Mon, 21 Sep 2015 12:50:22 +1000 Subject: [PATCH] xfs: test allocation group metadata corruption checking and repair Targeted fuzzing tests which destroy various pieces of filesystem or allocation group metadata; the tests look for (a) kernel detection of corruption, (b) xfs_repair repair of said corruption, and (c) post-repair fs usability. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- common/rc | 11 ++++ tests/xfs/085 | 115 ++++++++++++++++++++++++++++++++++++ tests/xfs/085.out | 15 +++++ tests/xfs/086 | 147 ++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/086.out | 20 +++++++ tests/xfs/087 | 124 ++++++++++++++++++++++++++++++++++++++ tests/xfs/087.out | 15 +++++ tests/xfs/088 | 146 +++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/088.out | 20 +++++++ tests/xfs/089 | 147 ++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/089.out | 20 +++++++ tests/xfs/091 | 147 ++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/091.out | 20 +++++++ tests/xfs/093 | 124 ++++++++++++++++++++++++++++++++++++++ tests/xfs/093.out | 15 +++++ tests/xfs/097 | 127 +++++++++++++++++++++++++++++++++++++++ tests/xfs/097.out | 15 +++++ tests/xfs/098 | 118 +++++++++++++++++++++++++++++++++++++ tests/xfs/098.out | 14 +++++ tests/xfs/group | 9 +++ 20 files changed, 1369 insertions(+) create mode 100755 tests/xfs/085 create mode 100644 tests/xfs/085.out create mode 100755 tests/xfs/086 create mode 100644 tests/xfs/086.out create mode 100755 tests/xfs/087 create mode 100644 tests/xfs/087.out create mode 100755 tests/xfs/088 create mode 100644 tests/xfs/088.out create mode 100755 tests/xfs/089 create mode 100644 tests/xfs/089.out create mode 100755 tests/xfs/091 create mode 100644 tests/xfs/091.out create mode 100755 tests/xfs/093 create mode 100644 tests/xfs/093.out create mode 100755 tests/xfs/097 create mode 100644 tests/xfs/097.out create mode 100755 tests/xfs/098 create mode 100644 tests/xfs/098.out diff --git a/common/rc b/common/rc index f889103c..1e7e47b0 100644 --- a/common/rc +++ b/common/rc @@ -1409,6 +1409,17 @@ _require_scratch_ext4_crc() umount $SCRATCH_MNT } +# this test requires the xfs kernel support crc feature on scratch device +# +_require_scratch_xfs_crc() +{ + _scratch_mkfs_xfs >/dev/null 2>&1 + _scratch_mount >/dev/null 2>&1 \ + || _notrun "Kernel doesn't support crc feature" + xfs_info $SCRATCH_MNT | grep -q 'crc=1' || _notrun "crc feature not supported by this filesystem" + umount $SCRATCH_MNT +} + # this test requires the bigalloc feature to be available in mkfs.ext4 # _require_ext4_mkfs_bigalloc() diff --git a/tests/xfs/085 b/tests/xfs/085 new file mode 100755 index 00000000..73527796 --- /dev/null +++ b/tests/xfs/085 @@ -0,0 +1,115 @@ +#! /bin/bash +# FS QA Test No. 085 +# +# Create and populate an XFS filesystem, corrupt a superblock, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 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-1301 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 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +$XFS_IO_PROG -f -c "pwrite -S 0x62 32 4" "${SCRATCH_DEV}" >> $seqres.full + +echo "+ mount image" +_scratch_mount 2>/dev/null && _fail "mount should not succeed" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 1 64`; do + test -e "${TESTFILE}.${x}" || continue + echo moo | dd oflag=append conv=notrunc of="${TESTFILE}.${x}" 2>/dev/null + test $? -ne 0 && broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/085.out b/tests/xfs/085.out new file mode 100644 index 00000000..63030810 --- /dev/null +++ b/tests/xfs/085.out @@ -0,0 +1,15 @@ +QA output created by 085 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files +broken: 1 ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/086 b/tests/xfs/086 new file mode 100755 index 00000000..6c803688 --- /dev/null +++ b/tests/xfs/086 @@ -0,0 +1,147 @@ +#! /bin/bash +# FS QA Test No. 086 +# +# Create and populate an XFS filesystem, corrupt an AGF, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 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-1301 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 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +test "${agcount}" -gt 1 || _notrun "Single-AG XFS not supported" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "stack" -c "blocktrash -x 32 -o +64 -y 4096 -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +# Try to append to files; this should fail +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 0 ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files" +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" + +# Try appending again, now that we've fixed the fs +echo "+ modify files (2)" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 ${blksz} ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files (2)" +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/086.out b/tests/xfs/086.out new file mode 100644 index 00000000..6c053f42 --- /dev/null +++ b/tests/xfs/086.out @@ -0,0 +1,20 @@ +QA output created by 086 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files ++ repair fs ++ mount image ++ chattr -R -i ++ check files +broken: 1 ++ modify files (2) ++ repair fs ++ mount image ++ chattr -R -i ++ check files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/087 b/tests/xfs/087 new file mode 100755 index 00000000..03d76358 --- /dev/null +++ b/tests/xfs/087 @@ -0,0 +1,124 @@ +#! /bin/bash +# FS QA Test No. 087 +# +# Create and populate an XFS filesystem, corrupt the AGI, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 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-1301 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 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agi ${ag}" -c "agi ${ag}" -c "stack" -c "blocktrash -x 32 -o +64 -y 4096 -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +broken=0 +for x in `seq 65 70`; do + touch "${TESTFILE}.${x}" 2> /dev/null || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 65 70`; do + touch "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/087.out b/tests/xfs/087.out new file mode 100644 index 00000000..1f6e0b5e --- /dev/null +++ b/tests/xfs/087.out @@ -0,0 +1,15 @@ +QA output created by 087 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files +broken: 1 ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/088 b/tests/xfs/088 new file mode 100755 index 00000000..e171ba91 --- /dev/null +++ b/tests/xfs/088 @@ -0,0 +1,146 @@ +#! /bin/bash +# FS QA Test No. 088 +# +# Create and populate an XFS filesystem, corrupt the AGFL, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 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-1301 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 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agfl ${ag}" -c "agfl ${ag}" -c "stack" -c "blocktrash -x 32 -o +64 -y 4096 -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +# Try to append to files; this should fail +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 0 ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files" +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" + +# Try appending again, now that we've fixed the fs +echo "+ modify files (2)" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 ${blksz} ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files (2)" +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/088.out b/tests/xfs/088.out new file mode 100644 index 00000000..f083d3a5 --- /dev/null +++ b/tests/xfs/088.out @@ -0,0 +1,20 @@ +QA output created by 088 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files ++ repair fs ++ mount image ++ chattr -R -i ++ check files +broken: 1 ++ modify files (2) ++ repair fs ++ mount image ++ chattr -R -i ++ check files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/089 b/tests/xfs/089 new file mode 100755 index 00000000..4d414201 --- /dev/null +++ b/tests/xfs/089 @@ -0,0 +1,147 @@ +#! /bin/bash +# FS QA Test No. 089 +# +# Create and populate an XFS filesystem, corrupt the bnobt, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 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-1301 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 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "addr bnoroot" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +# Try to append to files; this should fail +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 0 ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files" +ls -la "${TESTDIR}" >> $seqres.full +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" + +# Try appending again, now that we've fixed the fs +echo "+ modify files (2)" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 ${blksz} ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files (2)" +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/089.out b/tests/xfs/089.out new file mode 100644 index 00000000..722bcdfa --- /dev/null +++ b/tests/xfs/089.out @@ -0,0 +1,20 @@ +QA output created by 089 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files ++ repair fs ++ mount image ++ chattr -R -i ++ check files +broken: 1 ++ modify files (2) ++ repair fs ++ mount image ++ chattr -R -i ++ check files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/091 b/tests/xfs/091 new file mode 100755 index 00000000..edc54bde --- /dev/null +++ b/tests/xfs/091 @@ -0,0 +1,147 @@ +#! /bin/bash +# FS QA Test No. 091 +# +# Create and populate an XFS filesystem, corrupt the cntbt, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 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-1301 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 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "addr cntroot" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +# Try to append to files; this should fail +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 0 ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files" +ls -la "${TESTDIR}" >> $seqres.full +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" + +# Try appending again, now that we've fixed the fs +echo "+ modify files (2)" +for x in `seq 1 64`; do + $XFS_IO_PROG -f -c "pwrite -S 0x62 ${blksz} ${blksz}" "${TESTFILE}.${x}" >> $seqres.full +done +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ check files (2)" +broken=0 +for x in `seq 1 64`; do + test -s "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/091.out b/tests/xfs/091.out new file mode 100644 index 00000000..d5570236 --- /dev/null +++ b/tests/xfs/091.out @@ -0,0 +1,20 @@ +QA output created by 091 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files ++ repair fs ++ mount image ++ chattr -R -i ++ check files +broken: 1 ++ modify files (2) ++ repair fs ++ mount image ++ chattr -R -i ++ check files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/093 b/tests/xfs/093 new file mode 100755 index 00000000..9daf20f3 --- /dev/null +++ b/tests/xfs/093 @@ -0,0 +1,124 @@ +#! /bin/bash +# FS QA Test No. 093 +# +# Create and populate an XFS filesystem, corrupt the inobt, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 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-1301 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 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agi ${ag}" -c "agi ${ag}" -c "addr root" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +broken=0 +for x in `seq 65 70`; do + touch "${TESTFILE}.${x}" 2> /dev/null || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 65 70`; do + touch "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/093.out b/tests/xfs/093.out new file mode 100644 index 00000000..74b773cc --- /dev/null +++ b/tests/xfs/093.out @@ -0,0 +1,15 @@ +QA output created by 093 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files +broken: 1 ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/097 b/tests/xfs/097 new file mode 100755 index 00000000..88c8d5fb --- /dev/null +++ b/tests/xfs/097 @@ -0,0 +1,127 @@ +#! /bin/bash +# FS QA Test No. 097 +# +# Create and populate an XFS filesystem, corrupt the finobt, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 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-1301 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 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +_require_xfs_mkfs_finobt +_require_xfs_finobt +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +xfs_info "${SCRATCH_MNT}" | grep -q "finobt=1" || _notrun "finobt not enabled" +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +agcount="$(xfs_info "${SCRATCH_MNT}" | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g')" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +for ag in $(seq 1 $((agcount - 1))) 0; do + $XFS_DB_PROG -x -c "agi ${ag}" -c "agi ${ag}" -c "addr free_root" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 +done + +echo "+ mount image" +_scratch_mount + +echo "+ modify files" +broken=0 +for x in `seq 65 70`; do + touch "${TESTFILE}.${x}" 2> /dev/null || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 65 70`; do + touch "${TESTFILE}.${x}" || broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/097.out b/tests/xfs/097.out new file mode 100644 index 00000000..84f6a70a --- /dev/null +++ b/tests/xfs/097.out @@ -0,0 +1,15 @@ +QA output created by 097 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ modify files +broken: 1 ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/098 b/tests/xfs/098 new file mode 100755 index 00000000..fcfba115 --- /dev/null +++ b/tests/xfs/098 @@ -0,0 +1,118 @@ +#! /bin/bash +# FS QA Test No. 098 +# +# Create and populate an XFS filesystem, corrupt the journal, then see how +# the kernel and xfs_repair deal with it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2015 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-1301 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 15 + +_cleanup() +{ + cd / + #rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_xfs_db_blocktrash_z_command +test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" + +rm -f $seqres.full +TESTDIR="${SCRATCH_MNT}/scratchdir" +TESTFILE="${TESTDIR}/testfile" + +echo "+ create scratch fs" +_scratch_mkfs_xfs > /dev/null + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" + +echo "+ make some files" +mkdir -p "${TESTDIR}" +for x in `seq 1 1024`; do + touch "${SCRATCH_MNT}/junk.${x}" + inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" + if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then + mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" + break + fi +done +for x in `seq 2 64`; do + touch "${TESTFILE}.${x}" +done +inode="$(stat -c '%i' "${TESTFILE}.1")" +umount "${SCRATCH_MNT}" + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +echo "+ corrupt image" +logstart="$($XFS_DB_PROG -c 'sb 0' -c 'p' "${SCRATCH_DEV}" | grep '^logstart =' | cut -d ' ' -f 3)" +logstart="$($XFS_DB_PROG -c "convert fsblock ${logstart} byte" "${SCRATCH_DEV}" | sed -e 's/^.*(\([0-9]*\).*$/\1/g')" +logblocks="$(xfs_db -c 'sb 0' -c 'p' "${SCRATCH_DEV}" | grep '^logblocks =' | cut -d ' ' -f 3)" +$XFS_IO_PROG -f -c "pwrite -S 0x62 ${logstart} $((logblocks * blksz))" "${SCRATCH_DEV}" >> $seqres.full + +echo "+ mount image" +_scratch_mount 2>/dev/null && _fail "mount should not succeed" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +chattr -R -f -i "${SCRATCH_MNT}/" + +echo "+ modify files (2)" +broken=0 +for x in `seq 1 64`; do + test -e "${TESTFILE}.${x}" || continue + echo moo | dd oflag=append conv=notrunc of="${TESTFILE}.${x}" 2>/dev/null + test $? -ne 0 && broken=1 +done +echo "broken: ${broken}" +umount "${SCRATCH_MNT}" + +echo "+ check fs (2)" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" + +status=0 +exit diff --git a/tests/xfs/098.out b/tests/xfs/098.out new file mode 100644 index 00000000..84a2b4d0 --- /dev/null +++ b/tests/xfs/098.out @@ -0,0 +1,14 @@ +QA output created by 098 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image +broken: 1 ++ repair fs ++ mount image (2) ++ chattr -R -i ++ modify files (2) +broken: 0 ++ check fs (2) diff --git a/tests/xfs/group b/tests/xfs/group index ddb04551..fe420680 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -82,11 +82,20 @@ 082 deprecated # log logprint v2log 083 dangerous_fuzzers 084 ioctl rw auto +085 fuzzers +086 fuzzers +087 fuzzers +088 fuzzers +089 fuzzers 090 rw auto +091 fuzzers 092 other auto quick +093 fuzzers 094 metadata dir ioctl auto 095 log v2log auto 096 mkfs v2log auto quick +097 fuzzers +098 fuzzers 103 metadata dir ioctl auto quick 104 growfs ioctl prealloc auto stress 106 quota -- 2.30.2