blob: 4c01f4eff030437e6ad761c6cec3b86710a3c3f9 [file] [log] [blame]
#!/bin/bash
#
# Copyright (c) International Business Machines Corp., 2008
#
# 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
#
#*******************************************************************************
# Readme_ROBind has more details on the tests running for ROBIND.
# TEST:
# NAME: test_robind.sh
# FUNCTIONALITY: File system tests for normal mount, bind mount and RO mount
#
# DESCRIPTION: Performs filesystems tests for RO mount.
# For filesystem's like ext2, ext3, reiserfs, jfs & xfs.
# This test creates an image-file and
# a) mounts on dir1,
# b) mount --bind dir2
# c) mount -o remount,ro
# It verifies the tests on a) and b) works correctly.
# For the c) option it checks that the tests are not able to write into dir.
# Then it executes the tests from flat-file {LTPROOT}/testscripts/fs_ro_tests
# Check the logs /tmp/fs$$/errs.log and /tmp/fs$$/pass.log for pass/failures.
#===============================================================================
#
# CHANGE HISTORY:
# DATE AUTHOR REASON
# 09/06/2008 Veerendra Chandrappa For Container, testing of RO-Bind mount
# Dave Hansen
# This script is based on the Dave Hansen script for testing the robind.
#*******************************************************************************
#trace_logic=${trace_logic:-"set -x"}
$trace_logic
# The test case ID, the test case count and the total number of test case
TCID=${TCID:-test_robind.sh}
TST_TOTAL=1
TST_COUNT=1
export TCID
export TST_COUNT
export TST_TOTAL
usage()
{
cat << EOF
usage: $0 [ext3,ext2,jfs,xfs,reiserfs,ramfs]
This script verifies ReadOnly-filesystem, by mounting imagefile and
executing the filesystem tests.
OPTIONS
-h display this message and exit
EOF
}
DIRS="dir1 dir2-bound dir3-ro"
TMPDIR=/tmp/fs$$
trap cleanup ERR
trap cleanup INT
#==============================================================================
# FUNCTION NAME: cleanup
#
# FUNCTION DESCRIPTION: Unmounts dir, Removes dir's, files created by the tests.
#
# PARAMETERS: The $fs_image .
#
# RETURNS: None.
#==============================================================================
function cleanup
{
umount ${TMPDIR}/dir3-ro 2> /dev/null > /dev/null
umount ${TMPDIR}/dir2-bound 2> /dev/null 1> /dev/null
umount ${TMPDIR}/dir1 2> /dev/null 1> /dev/null
if [ ! -z $1 ]; then {
rm -rf $1 || true
}
fi
}
#===============================================================================
# FUNCTION NAME: setup
#
# FUNCTION DESCRIPTION: Does the initailization
#
# PARAMETERS: File_systems (if any )
#
# RETURNS: None.
#===============================================================================
function setup
{
mkdir ${TMPDIR}
FAILLOG="$TMPDIR/errs.log"
PASSLOG="$TMPDIR/pass.log"
for i in $DIRS; do
rm -rf ${TMPDIR}/$i || true
mkdir -p ${TMPDIR}/$i
done;
# Populating the default FS as ext3, if FS is not given
if [ -z "$*" ]; then
FSTYPES="ext3"
else
FSTYPES="$*"
fi
# set the LTPROOT directory
cd `dirname $0`
echo "${PWD}" | grep testscripts > /dev/null 2>&1
if [ $? -eq 0 ]; then
cd ..
export LTPROOT="${PWD}"
export PATH="${PATH}:${LTPROOT}/testcases/bin"
fi
FS_Tests="${LTPROOT}/testscripts/fs_ro_tests"
cd ${TMPDIR}
}
#=============================================================================
# FUNCTION NAME: testdir
#
# FUNCTION DESCRIPTION: The core function where it runs the tests
#
# PARAMETERS: dir_name, file_systems, Read_only flag = [true|false]
#
# RETURNS: None.
#=============================================================================
function testdir
{
dir=$1
fs=$2
RO=$3
pushd $dir
testnums=`wc -l $FS_Tests | cut -f1 -d" "`
status=0
echo "---------------------------------------------------" >> $FAILLOG ;
echo "Running RO-FileSystem Tests for $dir $fs filesystem" >> $FAILLOG ;
echo "---------------------------------------------------" >> $FAILLOG ;
echo "---------------------------------------------------" >> $PASSLOG ;
echo "Running RO-FileSystem Tests for $dir $fs filesystem" >> $PASSLOG ;
echo "---------------------------------------------------" >> $PASSLOG ;
export TDIRECTORY=$PWD ;
echo TDIR is $TDIRECTORY;
if [ $RO == false ] ; then # Testing Read-Write dir
for tests in `seq $testnums` ; do
cmd=`cat $FS_Tests | head -$tests | tail -n 1`
# eval $cmd 2>&1 /dev/null
eval $cmd 2> /dev/null 1> /dev/null
if [ $? -eq 0 ]; then
echo "$tests. '$cmd' PASS" >> $PASSLOG
else
echo "$tests. '$cmd' FAIL " >> $FAILLOG
echo "TDIR is $TDIRECTORY" >> $FAILLOG;
status=1
fi
done
else # Testing Read-Only dir
for tests in `seq $testnums` ; do
cmd=`cat $FS_Tests | head -$tests | tail -n 1`
eval $cmd 2> /dev/null 1> /dev/null
if [ $? -ne 0 ]; then
echo "$tests. '$cmd' PASS " >> $PASSLOG
else
echo "$tests. '$cmd' FAIL" >> $FAILLOG
status=1
fi
done
fi
if [ $status == 1 ] ; then
echo "RO-FileSystem Tests FAILED for $dir $fs filesystem" >> $FAILLOG
echo >> $FAILLOG
retcode=$status
else
echo "RO-FileSystem Tests PASSed for $dir $fs filesystem" >> $PASSLOG
echo >> $PASSLOG
fi
# Remove all the temp-files created.
eval rm -rf ${TMPDIR}/${dir}/* > /dev/null 2>&1 || true
unset TDIRECTORY
popd
}
#=============================================================================
# MAIN
# See the description, purpose, and design of this test under TEST
# in this test's prolog.
#=============================================================================
retcode=0
while getopts h: OPTION; do
case $OPTION in
h)
usage
exit 1
;;
?)
usage
exit 1
;;
esac
done
# Does the initial setups
oldpwd=${PWD}
setup $*
# Executes the tests for differnt FS's
# Creates an image file of 500 MB and mounts it.
for fstype in $FSTYPES; do
image=$fstype.img
dd if=/dev/zero of=$image bs=$((1<<20)) count=500 2> /dev/null 1> /dev/null
if [ $? -ne 0 ] ; then
tst_resm, TFAIL "Unable to create image "
tst_resm, TFAIL "Free Disk space of 512MB is required in /tmp fs"
tst_resm, TFAIL "Please free it and rerun thank you.."
rm -f $image
exit -1
fi
OPTS="-F"
if [ "$fstype" == "reiserfs" ]; then
OPTS="-f --journal-size 513 -q"
elif [ "$fstype" == "jfs" ]; then
OPTS="-f"
elif [ "$fstype" == "xfs" ]; then
OPTS=""
fi
if [ "$fstype" != "ramfs" ] ; then
mkfs.$fstype $OPTS $image 2> /dev/null 1> /dev/null
fi
mount -t $fstype -o loop $image dir1
mount --bind dir1 dir2-bound || exit -1
mount --bind dir1 dir3-ro || exit -1
mount -o remount,ro dir3-ro || exit -1
testdir dir1 $fstype false
testdir dir2-bound $fstype false
testdir dir3-ro $fstype true
cleanup $image
done
for i in $DIRS; do
rm -rf ./$i || true
done;
cd $oldpwd || true
exit $retcode