| #! /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 : nfs03 |
| # |
| # DESCRIPTION: This script sets up the NFS directories in the remote machine |
| # and runs the LTP's filesystem test: fs_inod. |
| # |
| # 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: |
| # 11/2/01 Robbie Williamson (robbiew@us.ibm.com) |
| # -Created |
| # |
| #*********************************************************************** |
| |
| #Uncomment line below for debug output. |
| #trace_logic=${trace_logic:-"set -x"} |
| |
| $trace_logic |
| |
| #----------------------------------------------------------------------- |
| # Initialize local variables |
| #----------------------------------------------------------------------- |
| TC=${TC:=nfs03} |
| TCbin=${TCbin:=`pwd`} |
| TCdat=${TCdat:=$TCbin} |
| TCsrc=${TCsrc:=$TCbin} |
| TCtmp=${TCtmp:=$TCbin/$TC$$} |
| TCdump=${TCdump:=$TCbin} |
| RHOST=${RHOST:=`hostname | awk {'print $1'}`} |
| |
| PID=$$ |
| |
| # Setting the NFS to version 2 by default |
| VERSION=${VERSION:=2} |
| SOCKET_TYPE=${SOCKET_TYPE:=udp} |
| TESTDIR=${TESTDIR:=/tmp/$TC$PID.testdir} |
| NFS_TYPE=${NFS_TYPE:=nfs} |
| |
| # If CLEANUP is not set; set it to "ON" |
| CLEANUP=${CLEANUP:="ON"} |
| |
| DIR_NUM=$1 |
| FILE_NUM=$2 |
| NFSD_NUM=$3 |
| |
| DIR_NUM=${DIR_NUM:=100} |
| FILE_NUM=${FILE_NUM:= 100} |
| THREAD_NUM=${THREAD_NUM:=1} |
| |
| #============================================================================ |
| # FUNCTION NAME: fs_inod |
| # |
| # FUNCTION DESCRIPTION: Filesystems test from LTP. |
| # |
| # PARAMETERS: Filesystem, number of directories, number of files, |
| # and loops |
| # |
| # RETURNS: 0 for PASS and Error Code for FAIL. |
| #============================================================================ |
| fs_inod() |
| { |
| |
| #============================================================================= |
| # FUNCTION NAME: err_log |
| # |
| # FUNCTION DESCRIPTION: Log error |
| # |
| # PARAMETERS: None. |
| # |
| # RETURNS: None. |
| #============================================================================= |
| err_log() |
| { |
| error "$1" |
| : $(($step_errors+=1)) |
| } |
| |
| |
| #============================================================================= |
| # FUNCTION NAME: make_subdirs |
| # |
| # FUNCTION DESCRIPTION: Creates $numsubdirs subdirectories |
| # |
| # PARAMETERS: None. |
| # |
| # RETURNS: None. |
| #============================================================================= |
| make_subdirs() |
| { |
| i=0; |
| while [ "$i" -lt "$numsubdirs" ]; do |
| [ -d dir$i ] || { \ |
| echo "$0: mkdir dir$i" |
| mkdir -p dir$i || echo "mkdir dir$i FAILED" |
| } |
| : $(( i += 1 )) |
| done; |
| } |
| |
| |
| #============================================================================= |
| # FUNCTION NAME: touch_files |
| # |
| # FUNCTION DESCRIPTION: Creates $numfiles in each of $numsubdirs directories |
| # |
| # PARAMETERS: None. |
| # |
| # RETURNS: None. |
| #============================================================================= |
| touch_files() |
| { |
| echo "$0: touch files [0-$numsubdirs]/file$numsubdirs[0-$numfiles]" |
| j=0; |
| |
| while [ "$j" -lt "$numsubdirs" ]; do |
| cd dir$j |
| k=0; |
| |
| while [ "$k" -lt "$numfiles" ]; do |
| >file$j$k || err_log ">file$j$k FAILED" |
| : $(( k += 1 )) |
| done |
| |
| : $(( j += 1 )) |
| cd .. |
| done |
| } |
| |
| |
| #============================================================================= |
| # FUNCTION NAME: rm_files |
| # |
| # FUNCTION DESCRIPTION: Removes $numfiles in each $numsubdir directory |
| # |
| # PARAMETERS: None. |
| # |
| # RETURNS: None. |
| #============================================================================= |
| rm_files() |
| { |
| echo "$0: rm files [0-$numsubdirs]/file$numsubdirs[0-$numfiles]" |
| j=0; |
| |
| while [ "$j" -lt "$numsubdirs" ]; do |
| cd dir$j |
| k=0; |
| |
| while [ "$k" -lt "$numfiles" ]; do |
| rm -f file$j$k || err_log "rm -f file$j$k FAILED" |
| : $(( k += 1 )) |
| done |
| |
| : $(( j += 1 )) |
| cd .. |
| done |
| } |
| |
| |
| #============================================================================= |
| # FUNCTION NAME: step1 |
| # |
| # FUNCTION DESCRIPTION: multiple processes creating and deleting files |
| # |
| # PARAMETERS: None. |
| # |
| # RETURNS: None. |
| #============================================================================= |
| step1() |
| { |
| echo "==============================================" |
| echo "MULTIPLE PROCESSES CREATING AND DELETING FILES" |
| echo "==============================================" |
| |
| echo "$0: creating dir2 subdirectories" |
| [ -d dir2 ] || { \ |
| mkdir -p dir2 || end_testcase "mkdir dir2 failed" |
| } |
| cd dir2 || err_log "cd dir2 FAILED" |
| make_subdirs || err_log "make_subdirs on dir2 FAILED" |
| cd .. |
| |
| echo "$0: creating dir1 subdirectories & files" |
| [ -d dir1 ] || { \ |
| mkdir dir1 || abort "mkdir dir1 FAILED" |
| } |
| cd dir1 || err_log "cd dir1 FAILED" |
| make_subdirs || err_log "make_subdirs on dir1 FAILED" |
| touch_files |
| pid1=$! |
| |
| i=1; |
| while [ "$i" -le "$numloops" ]; do |
| echo "Executing loop $i of $numloops..." |
| |
| # Added date stamps to track execution time and duration |
| |
| echo "$0: cd ../dir1 & creating files" |
| cd ../dir1 |
| wait $pid1 |
| touch_files & |
| pid1=$! |
| |
| echo "$0: cd ../dir1 & removing files" |
| cd ../dir1 |
| wait $pid1 |
| rm_files & |
| pid1=$! |
| |
| echo "$0: cd ../dir2 & creating files" |
| cd ../dir2 |
| wait $pid2 |
| touch_files & |
| pid2=$! |
| |
| echo "$0: cd ../dir2 & removing files" |
| cd ../dir2 |
| wait $pid2 |
| rm_files & |
| pid2=$! |
| |
| : $(( i += 1 )) |
| done |
| |
| # wait for all background processes to complete execution |
| wait |
| return $step_errors |
| } |
| |
| |
| #============================================================================= |
| # MAIN |
| # See the description, purpose, and design of this test under TEST |
| # in this test's prolog. |
| #============================================================================= |
| USAGE="Usage: ./fs_inod [volumename] [numsubdirectories] [numfiles] [numloops]" |
| |
| if [ $# -ne 4 ] |
| then |
| echo $USAGE |
| exit 2 |
| fi |
| |
| testvol=$1 |
| numsubdirs=$2 |
| numfiles=$3 |
| numloops=$4 |
| |
| cd $testvol || exit 2 |
| |
| echo "FS_INODE: File system stress - inode allocation/deallocation" |
| echo "Volume under test: $testvol" |
| echo "Number of subdirectories: $numsubdirs" |
| echo "Number of files: $numfiles" |
| echo "Number of loops: $numloops" |
| echo "Execution begins " |
| date |
| |
| STEPS="1" |
| for I in $STEPS |
| do |
| step_errors=0 |
| step$I |
| if [ $? != 0 ]; then |
| error "step$I failed - see above errors" |
| fi |
| done |
| |
| # Clean up and timestamp |
| rm -rf $testvol/dir* |
| echo "Execution completed" |
| date |
| |
| return $ERRORS |
| } |
| |
| #============================================================================= |
| # FUNCTION NAME: setup_testcase |
| # |
| # FUNCTION DESCRIPTION: Perform the setup function for the testcase. |
| # |
| # PARAMETERS: None. |
| # |
| # RETURNS: None. |
| #============================================================================= |
| |
| setup_testcase() |
| { |
| $trace_logic |
| |
| |
| echo "" |
| echo "Test Options:" |
| echo " VERSION: $VERSION" |
| echo " SOCKET_TYPE: $SOCKET_TYPE" |
| echo " TESTDIR: $TESTDIR" |
| echo " RHOST: $RHOST" |
| echo " NFS_TYPE: $NFS_TYPE" |
| echo "" |
| echo "Test Parameters:" |
| echo " Number of Directories: $DIR_NUM" |
| echo " Number of Files per Directory: $FILE_NUM" |
| echo " Number of nfsds tested: $THREAD_NUM" |
| echo "" |
| |
| if [ "x$NFS_TYPE" != "xnfs4" ]; then |
| OPTS=${OPTS:="-o vers=$VERSION,proto=$SOCKET_TYPE "} |
| fi |
| |
| REMOTE_DIR=${RHOST}:$TESTDIR |
| mkdir -p $TCtmp || end_testcase "Could not create $TCtmp" |
| chmod 777 $TCtmp |
| |
| echo "Setting up remote machine: $RHOST" |
| rsh -n $RHOST "mkdir -p $TESTDIR" |
| [ $? = 0 ] || end_testcase "Could not create 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" |
| echo "rsh -n $RHOST 'mount --bind $TESTDIR /export$TESTDIR'" |
| rsh -n $RHOST "mount --bind $TESTDIR /export$TESTDIR" |
| [ $? = 0 ] || end_testcase "Could not bind $TESTDIR to /export" |
| rsh -n $RHOST "/usr/sbin/exportfs -i -o no_root_squash,rw *:$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" |
| |
| echo "Setting server side nfsd count to $THREAD_NUM" |
| ORIG_NFSD=`rsh -n $RHOST "ps -ef" | grep nfsd | grep -v grep | wc -l` |
| rsh -n $RHOST "/usr/sbin/rpc.nfsd $THREAD_NUM" |
| [ $? = 0 ] || end_testcase "Could not set the number of nfsds on $RHOST" |
| |
| } |
| |
| |
| #============================================================================= |
| # FUNCTION NAME: do_test |
| # |
| # FUNCTION DESCRIPTION: Perform the test |
| # |
| # PARAMETERS: None. |
| # |
| # RETURNS: None. |
| #============================================================================= |
| do_test() |
| { |
| $trace_logic |
| echo "fs_inod starting on $TCtmp." |
| fs_inod $TCtmp $DIR_NUM $FILE_NUM 1 |
| retval=$? |
| echo "fs_inod on $TCtmp finished." |
| |
| if [ "$retval" != 0 ]; then |
| end_testcase "Errors have resulted from this test: fs_inod returned $retval." |
| fi |
| |
| cd / |
| } |
| |
| |
| #============================================================================= |
| # 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" |
| /bin/umount $TCtmp || echo "Cannot umount $TCtmp" |
| sleep 2 |
| rmdir $TCtmp || echo "Cannot remove $TCtmp" |
| rsh -n $RHOST "/usr/sbin/exportfs -u *:$TESTDIR" |
| rsh -n $RHOST "rm -rf $TESTDIR" |
| rsh -n $RHOST "/usr/sbin/rpc.nfsd $ORIG_NFSD" |
| |
| fi |
| |
| [ $# = 0 ] && { echo "Test Successful"; exit 0; } |
| echo "Test Failed: $@" |
| exit 1 |
| } |
| |
| #============================================================================= |
| # MAIN PROCEDURE |
| #============================================================================= |
| |
| setup_testcase |
| do_test |
| end_testcase |