mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
e714acc0ef
One of the big cpu time consumers when running xfsqa on UML is forking of new processes. when looping lots of times, using 'expr' to calculate the loop counter increment means we fork at least once every loop. using shell builtins means that we don't fork and many tests run substantially faster. Some tests are even runnable with this modification. e.g. 110 went from taking 4500s to run down to 9s with the loop iterators changed to avoid forking. Signed-off-by: Dave Chinner <david@fromorbit.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
113 lines
2.5 KiB
Bash
Executable File
113 lines
2.5 KiB
Bash
Executable File
#! /bin/sh
|
|
# FS QA Test No. 031
|
|
#
|
|
# exercise xfs_repair - ensure repeated use doesn't corrupt
|
|
#
|
|
#-----------------------------------------------------------------------
|
|
# Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved.
|
|
#-----------------------------------------------------------------------
|
|
#
|
|
# creator
|
|
owner=nathans@sgi.com
|
|
|
|
seq=`basename $0`
|
|
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
|
|
rm -f $seq.full
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common.rc
|
|
. ./common.repair
|
|
. ./common.filter
|
|
|
|
# link correct .out file
|
|
_link_out_file $seq.out
|
|
|
|
_check_repair()
|
|
{
|
|
echo "Repairing, round 0" >> $seq.full
|
|
_scratch_xfs_repair 2>&1 | _filter_repair | tee -a $seq.full >$tmp.0
|
|
for i in 1 2 3 4
|
|
do
|
|
echo "Repairing, iteration $i" | tee -a $seq.full
|
|
_scratch_xfs_repair 2>&1 | _filter_repair >$tmp.$i
|
|
diff $tmp.0 $tmp.$i >> $seq.full
|
|
if [ $? -ne 0 ]; then
|
|
echo "ERROR: repair round $i differs to round 0 (see $seq.full)" | tee -a $seq.full
|
|
break
|
|
fi
|
|
# echo all interesting stuff...
|
|
perl -ne '
|
|
s/(rebuilding directory inode) (\d+)/\1 INO/g;
|
|
s/internal log/<TYPEOF> log/g;
|
|
s/external log on \S+/<TYPEOF> log/g;
|
|
/^\S+/ && print;
|
|
' $tmp.$i
|
|
done
|
|
echo
|
|
}
|
|
|
|
# prototype file to create various directory forms
|
|
_create_proto()
|
|
{
|
|
total=$1
|
|
count=0
|
|
|
|
# take inode size into account for non-shortform directories...
|
|
[ $total -gt 0 ] && total=`expr $total \* $isize / 512`
|
|
|
|
cat >$tmp.proto <<EOF
|
|
DUMMY1
|
|
0 0
|
|
: root directory
|
|
d--777 3 1
|
|
lost+found d--755 3 1
|
|
$
|
|
EOF
|
|
|
|
while [ $count -lt $total ]
|
|
do
|
|
let count=$count+1
|
|
cat >>$tmp.proto <<EOF
|
|
${count}_of_${total}_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ---755 3 1 /bin/true
|
|
EOF
|
|
done
|
|
echo '$' >>$tmp.proto
|
|
}
|
|
|
|
# real QA test starts here
|
|
_supported_fs xfs
|
|
_supported_os IRIX Linux
|
|
|
|
_require_nobigloopfs
|
|
_require_scratch
|
|
|
|
# sanity test - default + one root directory entry
|
|
# Note: must do this proto/mkfs now for later inode size calcs
|
|
_create_proto 0
|
|
echo "=== one entry (shortform)"
|
|
_scratch_mkfs_xfs -p $tmp.proto >$tmp.mkfs0 2>&1
|
|
_filter_mkfs <$tmp.mkfs0 >/dev/null 2>$tmp.mkfs
|
|
. $tmp.mkfs
|
|
_check_repair
|
|
|
|
# block-form root directory & repeat
|
|
_create_proto 20
|
|
echo "=== twenty entries (block form)"
|
|
_scratch_mkfs_xfs -p $tmp.proto | _filter_mkfs >/dev/null 2>&1
|
|
_check_repair
|
|
|
|
# leaf-form root directory & repeat
|
|
_create_proto 1000
|
|
echo "=== thousand entries (leaf form)"
|
|
_scratch_mkfs_xfs -p $tmp.proto | _filter_mkfs >/dev/null 2>&1
|
|
_check_repair
|
|
|
|
# success, all done
|
|
status=0
|
|
exit
|