#! /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