blob: 9df9f2e0b58ee74634f9f46a40dae5cff375468b [file] [log] [blame]
#! /bin/sh
#
# Copyright (c) International Business Machines Corp., 2001
#
# 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; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implie; 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 to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#
#
# FILE : fsx.sh
#
# PURPOSE: Runs the fsx-linux tool with a 50000 iterations setting to
# attempt to uncover the "doread:read input/output" error
# received if the latest NFS patches for 2.4.17 from Trond
# are not applied. http://nfs.sf.net
#
#
# SETUP: The home directory of root on the machine exported as "RHOST"
# MUST have a ".rhosts" file with the hostname of the machine
# where the test is executed.
#
#
# HISTORY:
# 12/18/01 Robbie Williamson (robbiew@us.ibm.com)
# -Written
#
#***********************************************************************
#Uncomment line below for debug output.
#trace_logic=${trace_logic:-"set -x"}
$trace_logic
#-----------------------------------------------------------------------
# Initialize local variables
#-----------------------------------------------------------------------
TC=${TC:=fsx}
TCbin=${TCbin:=`pwd`}
TCdat=${TCdat:=$TCbin}
TCsrc=${TCsrc:=$TCbin}
TCtmp=${TCtmp:=$TCbin/$TC$$}
TCdump=${TCdump:=$TCbin}
# If CLEANUP is not set; set it to "ON"
CLEANUP=${CLEANUP:="ON"}
# If EXECUTABLES is not set; set it to default executables
EXECUTABLES=${EXECUTABLES:="fsx-linux"}
#=============================================================================
# FUNCTION NAME: setup_testcase
#
# FUNCTION DESCRIPTION: Perform the setup function for the testcase.
#
# PARAMETERS: None.
#
# RETURNS: None.
#=============================================================================
setup_testcase()
{
$trace_logic
PID=$$
VERSION=${VERSION:=2}
RHOST=${RHOST:=`hostname`}
ITERATIONS=${ITERATIONS:=50000}
SOCKET_TYPE=${SOCKET_TYPE:=udp}
TESTDIR=${TESTDIR:=/tmp/$TC$PID.testdir}
NFS_TYPE=${NFS_TYPE:=nfs}
echo ""
echo "Test Options:"
echo " VERSION: $VERSION"
echo " RHOST: $RHOST"
echo " ITERATIONS: $ITERATIONS"
echo " SOCKET_TYPE: $SOCKET_TYPE"
echo " NFS_TYPE: $NFS_TYPE"
if [ "x$NFS_TYPE" != "xnfs4" ]; then
OPTS=${OPTS:="-o proto=$SOCKET_TYPE,vers=$VERSION "}
fi
REMOTE_DIR=${RHOST}:${TESTDIR}
LUSER=${LUSER:=root}
mkdir -p $TCtmp || end_testcase "Could not create $TCtmp"
chmod 777 $TCtmp
echo "Setting up remote machine: $RHOST"
rsh -n $RHOST "mkdir $TESTDIR"
[ $? = 0 ] || end_testcase "Could not create remote directory"
rsh -n $RHOST "touch $TESTDIR/testfile"
[ $? = 0 ] || end_testcase "Could not create testfile in remote directory"
if [ "x$NFS_TYPE" = "xnfs4" ]; then
rsh -n $RHOST "mkdir -p /export$TESTDIR"
[ $? = 0 ] || end_testcase "Could not create /export$TESTDIR on server"
rsh -n $RHOST "mount --bind $TESTDIR /export$TESTDIR"
[ $? = 0 ] || end_testcase "Could not bind $TESTDIR to export on server"
rsh -n $RHOST "/usr/sbin/exportfs -o no_root_squash,rw,nohide,insecure,no_subtree_check *:$TESTDIR"
[ $? = 0 ] || end_testcase "Could not export remote directory"
else
rsh -n $RHOST "/usr/sbin/exportfs -i -o no_root_squash,rw *:$TESTDIR"
[ $? = 0 ] || end_testcase "Could not export remote directory"
fi
echo "Mounting NFS filesystem $REMOTE_DIR on $TCtmp with options '$OPTS'"
mount -t $NFS_TYPE $OPTS $REMOTE_DIR $TCtmp || end_testcase "Cannot mount $TCtmp"
[ $? = 0 ] || end_testcase "Could not mount $REMOTE_DIR"
}
#=============================================================================
# FUNCTION NAME: do_test
#
# FUNCTION DESCRIPTION: Perform the test
#
# PARAMETERS: None.
#
# RETURNS: None.
#=============================================================================
do_test()
{
$trace_logic
for executable in $EXECUTABLES
do
cd $TCbin
echo "${executable} -N $ITERATIONS $TCtmp/testfile Starting"
./${executable} -N $ITERATIONS $TCtmp/testfile 2>&1
retval=$?
echo "${executable} -N $ITERATIONS $TCtmp/testfile Finished"
if [ "$retval" != 0 ]; then
end_testcase "Errors have resulted from this test"
fi
done
}
#=============================================================================
# FUNCTION NAME: end_testcase
#
# FUNCTION DESCRIPTION: Clean up
#
# PARAMETERS: None.
#
# RETURNS: None.
#=============================================================================
end_testcase()
{
$trace_logic
if [ "$CLEANUP" = "ON" ]; then
cd \
echo "Cleaning up testcase"
cd $HOME
echo "Unmounting $TCtmp"
sleep 2
umount $TCtmp || { echo "Cannot umount $TCtmp"; exit 1; }
rm -rf $TCtmp || echo "Cannot remove $TCtmp"
rsh -n $RHOST "/usr/sbin/exportfs -u *:$TESTDIR"
rsh -n $RHOST "rm -rf $TESTDIR"
fi
[ $# = 0 ] && { echo "Test Successful"; exit 0; }
echo "Test Failed: $@"
exit 1
}
#=============================================================================
# MAIN PROCEDURE
#=============================================================================
setup_testcase
do_test
end_testcase