xfs/{111,137}: replace open-coded calls to repair with _scratch_xfs_repair
[xfstests-dev.git] / tests / xfs / 137
index eb9a5fabd46ea08ed7e4d979bcadad564f20bb90..c10860bbc026c90c026e136d4b6179b1dafc67f3 100755 (executable)
 #! /bin/bash
-# FSQA Test No. 137
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2015 Red Hat, Inc. All Rights Reserved.
 #
-# Test for NULL files problem
+# FS QA Test No. 137
 #
-#-----------------------------------------------------------------------
-# Copyright (c) 2006 Silicon Graphics, Inc.  All Rights Reserved.
+# XFS v5 supers carry an LSN in various on-disk structures to track when
+# associated metadata was last written to disk. These metadata LSNs must always
+# be behind the current LSN as dictated by the log to ensure log recovery
+# correctness after a potential crash. This test uses xfs_db to intentionally
+# put the current LSN behind metadata LSNs and verifies that the kernel and
+# xfs_repair detect the problem.
 #
-# 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 "exit \$status" 0 1 2 3 15
+status=1       # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+       cd /
+       rm -f $tmp.*
+}
+
+rm -f $seqres.full
 
 # get standard environment, filters and checks
 . ./common/rc
-. ./common/filter
 
 # real QA test starts here
-_supported_fs xfs
-_supported_os Linux IRIX
 
+# Modify as appropriate.
+_supported_fs xfs
+_supported_os Linux
 _require_scratch
-_require_scratch_shutdown
-_require_fiemap
-_scratch_mkfs_xfs >/dev/null 2>&1
-_scratch_mount
-
-# create files
-i=1;
-while [ $i -lt 1000 ]
-do
-       file=$SCRATCH_MNT/$i
-       xfs_io -f -c "pwrite -b 64k -S 0xff 0 64k" $file > /dev/null
-       if [ $? -ne 0 ]
-       then
-               echo error creating/writing file $file
-               exit
-       fi
-       let i=$i+1
-done
+_require_scratch_xfs_crc
+_require_xfs_db_command "logformat"
 
-# give the system a chance to write something out
-sleep 10
+_scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed"
 
-src/godown $SCRATCH_MNT
+# push the log cycle ahead so we have room to move it backwards later
+_scratch_xfs_db -x -c "logformat -c 3" >> $seqres.full 2>&1
 
-umount $SCRATCH_MNT
+# do some work on the fs to update metadata LSNs
 _scratch_mount
-umount $SCRATCH_MNT
-if [ ! _check_scratch_fs ]
-then
-       echo error detected in filesystem
-       exit
+$FSSTRESS_PROG -d $SCRATCH_MNT -n 999 -p 4 -w >> $seqres.full 2>&1
+_scratch_unmount
+
+# Reformat to the current cycle and try to mount. This fails in most cases
+# because the sb LSN is ahead of the current LSN. If it doesn't fail, push the
+# cycle back further and try again.
+_scratch_xfs_db -x -c "logformat" >> $seqres.full 2>&1
+_try_scratch_mount >> $seqres.full 2>&1
+if [ $? != 0 ]; then
+       echo mount failure detected
+else
+       _scratch_unmount
+       _scratch_xfs_db -x -c "logformat -c 2" >> $seqres.full 2>&1
+       _try_scratch_mount >> $seqres.full 2>&1 || echo mount failure detected
 fi
-_scratch_mount
 
-# check file size and contents
-i=1;
-while [ $i -lt 1000 ]
-do
-       file=$SCRATCH_MNT/$i
-       # if file does not exist, the create was not logged, skip it
-       if [ -e $file ]
-       then
-               # if file size is zero it cannot be corrupt, skip it
-               if [ -s $file ]
-               then
-                       # if file has non-zero size but no extents then it's contents will be NULLs, bad.
-                       num_extents=`_count_extents $file`
-                       num_holes=`_count_holes $file`
-                       if [ $num_extents -eq 0 ]; then
-                               echo corrupt file $file - non-zero size but no extents
-                       elif [ $num_holes -ne 0 ]; then
-                               echo corrupt file $file - contains holes
-                       else
-                               rm -f $file
-                       fi
-               else
-                       rm -f $file
-               fi
-       fi
-       let i=$i+1
-done
+# verify that repair detects invalid LSNs as well
+_scratch_xfs_repair -n >> $seqres.full 2>&1 || \
+       echo repair failure detected
+
+# repair for real so the post-test check can verify repair fixed things up
+_scratch_xfs_repair >> $seqres.full 2>&1
 
+# success, all done
 status=0
-exit 
+exit