android13/external/ltp/testcases/kernel/fs/fs_inod/fs_inod

257 lines
6.4 KiB
Bash
Executable File

#!/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 implied 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#
#***********************************************************************
#
# TEST:
# NAME: fs_inod
# FUNCTIONALITY: File system stress - inode allocation/deallocation
# DESCRIPTION: Rapidly creates and deletes files through
# multiple processes running in the background.
# The user may specify the number of subdirectories
# to create, the number of files to create (per
# subdirectory), and the number of times to repeat
# the creation/deletion cycle.
#
#========================================================================
#
# CHANGE HISTORY:
# DATE AUTHOR REASON
# 04/18/98 Dara Morgenstein Project Yeager (AIX)
# 02/08/01 Jay Inman Modified to run standalone on Linux
# 05/24/01 Jay Inman Added command line args
# 06/27/01 Jay Inman Ported from Korn to Bash
#
#***********************************************************************
#=============================================================================
# FUNCTION NAME: err_log
#
# FUNCTION DESCRIPTION: Log error
#
# PARAMETERS: None.
#
# RETURNS: None.
#=============================================================================
err_log()
{
: $((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 &
pid2=$!
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 &
pid1=$!
: $((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
ERRORS=0
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
echo "step$I failed - see above errors"
: $((ERRORS += step_errors))
fi
done
# Clean up and timestamp
rm -rf $testvol/dir*
echo "Execution completed"
date
exit $ERRORS