X-Git-Url: http://git.apps.os.sepia.ceph.com/?p=xfstests-dev.git;a=blobdiff_plain;f=tests%2Fxfs%2F087;h=b3d3bca9606ff8c6c8f321023fab2733a7560df5;hp=43c23f05f16448f35856d39a7f7d15f2c0b0add1;hb=0c92d38b7bd27418a707edf3c67c3fd3c8cfc1ee;hpb=1d5d46db80370172750ab0c45ead3991c53678ef diff --git a/tests/xfs/087 b/tests/xfs/087 index 43c23f05..b3d3bca9 100755 --- a/tests/xfs/087 +++ b/tests/xfs/087 @@ -1,155 +1,110 @@ #! /bin/bash -# FS QA Test No. 087 -# -# * like 086 but want to create more/different kinds of metadata -# and so will use fsstress -# * also can interrupt metadata with godown -# -#----------------------------------------------------------------------- -# Copyright (c) 2000-2004 Silicon Graphics, 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. +# SPDX-License-Identifier: GPL-2.0 +# Copyright (c) 2015 Oracle, Inc. All Rights Reserved. # -# 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 +# 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. # - seq=`basename $0` seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq -seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` tmp=/tmp/$$ status=1 # failure is the default! -trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 - -# get standard environment, filters and checks -. ./common.rc -. ./common.filter -. ./common.log -. ./common.quota +trap "_cleanup; exit \$status" 0 1 2 3 15 -_do_meta() +_cleanup() { - out=$SCRATCH_MNT/fsstress - count=10000 - param="-p 4 -z -f rmdir=10 -f link=10 -f creat=10 -f mkdir=10 \ - -f rename=30 -f stat=30 -f unlink=30 -f truncate=20" - _echofull "calling fsstress $param -m8 -n $count" - FSSTRESS_ARGS=`_scale_fsstress_args $param $FSSTRESS_AVOID -m 8 -n $count -d $out` - if ! $FSSTRESS_PROG $FSSTRESS_ARGS >>$seqres.full 2>&1 - then - _echofull "fsstress failed" - fi + 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 IRIX Linux +_supported_os Linux -rm -f $seqres.full $tmp.* _require_scratch -_require_v2log -_require_xfs_quota - -echo "*** init FS" -umount $SCRATCH_DEV >/dev/null 2>&1 - -cat >$tmp.seq.params <>$seqres.full 2>&1 - if [ $? -ne 0 ] ; then - _echofull "mkfs failed: $MKFS_OPTIONS" - continue - fi - - # mount the FS - _echofull "mount" - if ! _scratch_mount -o uquota >>$seqres.full 2>&1; then - _echofull "mount failed: $MOUNT_OPTIONS" - continue - fi - - # create the metadata - _do_meta - - # check before on what FS should look like - _echofull "ls -RF SCRATCH_MNT" - ls -RF $SCRATCH_MNT >$tmp.ls1 - - _echofull "godown" - src/godown -v -f $SCRATCH_MNT >> $seqres.full - - _echofull "unmount" - umount $SCRATCH_DEV >>$seqres.full 2>&1 \ - || _fail "umount failed" - - _echofull "logprint after going down..." - _print_logstate - - _full "logprint headers" - _scratch_xfs_logprint -n >>$seqres.full 2>&1 - - _echofull "mount with replay" - _scratch_mount -o uquota >>$seqres.full 2>&1 \ - || _fail "mount failed: $MOUNT_OPTIONS" - - # check on what FS looks like after log recovery - _echofull "ls -RF SCRATCH_MNT" - ls -RF $SCRATCH_MNT >$tmp.ls2 - - _echofull "diff ls before and after" - diff -us $tmp.ls1 $tmp.ls2 | sed "s#$tmp#TMP#g" - - _echofull "unmount" - umount $SCRATCH_MNT - - _echofull "logprint after mount and replay..." - _print_logstate - - if _check_scratch_fs; then - _echofull "filesystem is checked ok" - else - _echofull "filesystem is NOT ok" - fi +test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc +_require_attrs +_require_populate_commands +_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_mount_agcount $SCRATCH_MNT)" +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 + _scratch_xfs_db -x -c "agi ${ag}" -c "agi ${ag}" -c "stack" -c "blocktrash -x 32 -o +64 -y 4096 -z ${FUZZ_ARGS}" >> $seqres.full 2>&1 +done + +echo "+ mount image && modify files" +broken=1 +if _try_scratch_mount >> $seqres.full 2>&1; then + + for x in `seq 65 70`; do + touch "${TESTFILE}.${x}" 2> /dev/null && broken=0 + done + umount "${SCRATCH_MNT}" +fi +echo "broken: ${broken}" + +echo "+ repair fs" +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ chattr -R -i" +$CHATTR_PROG -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 +status=0 exit