#! /bin/sh
-# XFS QA Test No. 016
-# $Id: 1.1 $
+# FS QA Test No. 016
#
# test end of log overwrite bug #796141
#
#-----------------------------------------------------------------------
-# Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of version 2 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.
-#
-# Further, this software is distributed without any warranty that it is
-# free of the rightful claim of any third person regarding infringement
-# or the like. Any license provided herein, whether implied or
-# otherwise, applies only to this software file. Patent licenses, if
-# any, provided herein do not apply to combinations of this program with
-# other software, or any other product whatsoever.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write the Free Software Foundation, Inc., 59
-# Temple Place - Suite 330, Boston MA 02111-1307, USA.
-#
-# Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
-# Mountain View, CA 94043, or:
-#
-# http://www.sgi.com
-#
-# For further information regarding this notice, see:
-#
-# http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
+# Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved.
#-----------------------------------------------------------------------
#
# creator
# start bit by bit to force wiping of stale blocks near the end of the
# log. Check the block after the log ends to check for corruption
#
-# assumptions :
+# assumptions :
# - given we're only touching a single inode, the block after the
# log which is in the middle ag should never be touched.
# if it changes, we assume the log is writing over it
_cleanup()
{
+ cd /
+ rm -f $tmp.*
echo "*** unmount"
umount $SCRATCH_MNT 2>/dev/null
}
echo "*** reset partition"
$here/src/devzero -b 2048 -n 50 -v 198 $SCRATCH_DEV
echo "*** mkfs"
- if ! mkfs -t xfs -f -d size=50m -l size=512b $SCRATCH_DEV >$tmp.out 2>&1
- then
- cat $tmp.out
- echo "failed to mkfs $SCRATCH_DEV"
- exit 1
- fi
+ force_opts="-dsize=50m -lsize=2097152"
+ echo mkfs_xfs $force_opts $SCRATCH_DEV >>$seq.full
+ _scratch_mkfs_xfs $force_opts >$tmp.mkfs0 2>&1
+ [ $? -ne 0 ] && \
+ _notrun "Cannot mkfs for this test using MKFS_OPTIONS specified"
+ _filter_mkfs <$tmp.mkfs0 >/dev/null 2>$tmp.mkfs
+ . $tmp.mkfs
+ [ $logsunit -ne 0 ] && \
+ _notrun "Cannot run this test using log MKFS_OPTIONS specified"
}
_log_traffic()
{
count=$1
echo "*** generate log traffic"
-
+
out=$SCRATCH_MNT/$$.tmp
-
+
echo " *** mount"
- if ! mount $SCRATCH_DEV $SCRATCH_MNT -t xfs
+ if ! _scratch_mount
then
echo "failed to mount $SCRATCH_DEV"
exit 1
fi
# having any quota enabled (acct/enfd) means extra log traffic - evil!
- $here/src/feature -U $SCRATCH_DEV && _notrun "User quota are enabled"
- $here/src/feature -G $SCRATCH_DEV && _notrun "Group quota are enabled"
-
+ $here/src/feature -U $SCRATCH_DEV && \
+ _notrun "UQuota are enabled, test needs controlled log traffic"
+ $here/src/feature -G $SCRATCH_DEV && \
+ _notrun "GQuota are enabled, test needs controlled log traffic"
+ $here/src/feature -P $SCRATCH_DEV && \
+ _notrun "PQuota are enabled, test needs controlled log traffic"
+
echo " *** fiddle"
while [ $count -ge 0 ]
do
- touch $out
+ touch $out
rm $out
let "count = count - 1"
done
-
+
echo " *** unmount"
if ! umount $SCRATCH_DEV
then
_log_size()
{
- xfs_logprint -tb $SCRATCH_DEV | $AWK_PROG '
- /log device/ { print $7}
+ _scratch_xfs_logprint -tb | $AWK_PROG '
+ /log file: / || /log device: / { print $7}
'
}
_log_head()
{
- xfs_logprint -tb $SCRATCH_DEV | $AWK_PROG '
+ _scratch_xfs_logprint -tb | $AWK_PROG '
/head:/ { print $5 }
'
}
+# Get log stripe unit for v2 logs; if none specified,
+# (or v1 log) just return "1" block
+
+_log_sunit()
+{
+ if [ ${lsunit:-0} -eq 0 ]; then
+ echo $dbsize
+ else
+ expr $lsunit \* $dbsize
+ fi
+}
+
_after_log()
{
xfs_db -r $1 -c "sb" -c "print" | $AWK_PROG '
f="c6c6c6c6"
echo "*** check for corruption"
echo "expect $f..." >>$seq.full
- xfs_db -r $1 -c "fsblock $2" -c "print" | head | tee -a $seq.full | \
+ xfs_db -r -c "fsblock $2" -c "print" $1 | head | tee -a $seq.full | \
grep -q -v "$f $f $f $f $f $f $f $f" && \
_fail "!!! block $2 corrupted!"
}
. ./common.filter
# real QA test starts here
+_supported_fs xfs
+_supported_os Linux
rm -f $seq.full
echo "log size = $size BB" >>$seq.full
head=`_log_head`
echo "log position = $head" >>$seq.full
+lsunit=`_log_sunit`
+echo "log sunit = $lsunit" >>$seq.full
[ $size -eq 4096 ] || \
_fail "!!! unexpected log size $size"
-[ $head -eq 2 ] || \
- _fail "!!! unexpected initial log position $head"
+[ $head -eq 2 -o $head -eq $((lsunit/512)) ] || \
+ _fail "!!! unexpected initial log position $head vs. $((lsunit/512))"
echo " lots of traffic" >>$seq.full
_log_traffic 850
[ $head -lt 1000 ] || \
_fail "!!! unexpected log position $head"
-
-# happy exit
-rm $seq.full
+# success, all done
status=0
-exit 0
+exit