Files
apfstests/139
T
Dave Chinner e714acc0ef reduce the number of processes forked
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>
2009-03-25 20:53:36 +01:00

104 lines
1.9 KiB
Bash
Executable File

#! /bin/sh
# FSQA Test No. 139
#
# Test for NULL files problem
#
#-----------------------------------------------------------------------
# Copyright (c) 2006 Silicon Graphics, Inc. All Rights Reserved.
#-----------------------------------------------------------------------
#
# creator
owner=lachlan@sgi.com
seq=`basename $0`
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
_cleanup()
{
_cleanup_testdir
}
# get standard environment, filters and checks
. ./common.rc
. ./common.filter
# real QA test starts here
_supported_fs xfs
_supported_os Linux IRIX
_setup_testdir
_require_scratch
_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
xfs_io -c "truncate 32k" $file > /dev/null
if [ $? -ne 0 ]
then
echo error truncating file $file
exit
fi
let i=$i+1
done
# give the system a chance to write something out
sleep 10
src/godown $SCRATCH_MNT
umount $SCRATCH_MNT
_scratch_mount
umount $SCRATCH_MNT
if [ ! _check_scratch_fs ]
then
echo error detected in filesystem
exit
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.
if xfs_bmap $file | grep 'no extents' > /dev/null
then
echo corrupt file $file - non-zero size but no extents
elif xfs_bmap $file | grep 'hole' > /dev/null
then
echo corrupt file $file - contains holes
else
rm -f $file
fi
else
rm -f $file
fi
fi
let i=$i+1
done
status=0
exit