#!/bin/sh
#
# 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, like ext2, ext3, reiserfs, jfs & xfs,
# This test needs a big block device(>=500MB is ok), and you can specify
# it by -z option when running runltp.
# 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.
#===============================================================================
#
# 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.
#*******************************************************************************
export TCID="test_robind"
export TST_TOTAL=3
DIRS="dir1 dir2-bound dir3-ro"
dir1_mount_flag=0
dir2_bound_mount_flag=0
dir3_ro_mount_flag=0
. test.sh
usage()
{
cat << EOF
usage: $0 -c command [ext3,ext2,jfs,xfs,reiserfs,ramfs]
This script verifies ReadOnly-filesystem, by mounting block device and
executing the filesystem tests.
OPTIONS
-h display this message and exit
-c command to be executed
EOF
exit 1
}
umount_mntpoint()
{
if [ $dir3_ro_mount_flag -eq 1 ];then
umount dir3-ro
if [ $? -ne 0 ];then
tst_resm TWARN "umount dir3-ro failed"
else
dir3_ro_mount_flag=0
fi
fi
if [ $dir2_bound_mount_flag -eq 1 ];then
umount dir2-bound
if [ $? -ne 0 ];then
tst_resm TWARN "umount dir2-bound failed"
else
dir2_bound_mount_flag=0
fi
fi
if [ $dir1_mount_flag -eq 1 ];then
umount dir1
if [ $? -ne 0 ];then
tst_resm TWARN "umount dir1"
else
dir1_mount_flag=0
fi
fi
}
cleanup()
{
umount_mntpoint
tst_rmdir
}
# parameters: file_systems (if any )
setup()
{
tst_require_root
if [ -z "$LTP_BIG_DEV" ];then
tst_brkm TCONF "tests need a big block device(>=500MB)"
else
device=$LTP_BIG_DEV
fi
tst_tmpdir
TST_CLEANUP=cleanup
for dir in $DIRS
do
rm -rf $dir
mkdir -p $dir
done
# populating the default FS as $LTP_BIG_DEV_FS_TYPE
# (or ext3 if it's not set), if FS is not given
if [ -z "$*" ]; then
FSTYPES=${LTP_BIG_DEV_FS_TYPE:-ext3}
else
FSTYPES="$*"
fi
}
# the core function where it runs the tests
# $1 - directory where to run tests
# $2 - file system type
# $3 - read-only flag [true|false]
testdir()
{
local dir=$1
local fs_type=$2
local RO=$3
local tst_result=0
local curdir=$(pwd)
cd $dir
tst_resm TINFO "command: $command"
# we need to export TMPDIR, in case test calls tst_rmdir()
export TMPDIR=$curdir/$dir
eval $command > $curdir/test.log 2>&1
tst_result=$?
# if tst_result isn't 0 and read-only flag is false, the test failed
# or if tst_result is 0 and read-only flag is true, the test failed.
if [ "$RO" = "false" -a $tst_result -ne 0 -o "$RO" = "true" -a \
$tst_result -eq 0 ];then
tst_resm TINFO "error info:"
cat $curdir/test.log
tst_resm TFAIL "RO-FileSystem Tests FAILED for \
$dir $fs_type read-only flag: $RO"
else
tst_resm TPASS "RO-FileSystem Tests PASSED for \
$dir $fs_type read-only flag: $RO"
fi
# remove all the temp files created.
cd ..
rm -f $curdir/test.log
rm -rf $curdir/$dir/*
}
#=============================================================================
# MAIN
# See the description, purpose, and design of this test under TEST
# in this test's prolog.
#=============================================================================
while getopts c:h: OPTION; do
case $OPTION in
c)
command=$OPTARG;;
h)
usage;;
?)
usage;;
esac
done
shift $((OPTIND-1))
setup $*
# Executes the tests for differnt FS's
for fstype in $FSTYPES; do
if [ "$fstype" = "reiserfs" ]; then
opts="-f --journal-size 513 -q"
elif echo "$fstype" | grep -q "ext"; then
opts="-F"
elif [ "$fstype" = "xfs" ]; then
opts="-f"
elif [ "$fstype" = "btrfs" ]; then
opts="-f"
fi
if [ "$fstype" != "ramfs" ]; then
tst_mkfs $fstype $device $opts
fi
mount -t $fstype $device dir1
if [ $? -ne 0 ];then
tst_brkm TBROK "mount $device to dir1 failed"
else
dir1_mount_flag=1
fi
mount --bind dir1 dir2-bound
if [ $? -ne 0 ];then
tst_brkm TBROK "mount --bind dir1 dir2-bound failed"
else
dir2_bound_mount_flag=1
fi
mount --bind dir1 dir3-ro
if [ $? -ne 0 ];then
tst_brkm TBROK "mount --bind dir1 dir3-ro failed"
else
dir3_ro_mount_flag=1
fi
mount -o remount,ro,bind dir1 dir3-ro
if [ $? -ne 0 ];then
tst_brkm TBROK "mount -o remount,ro,bind dir1 dir3-ro failed"
fi
testdir dir1 $fstype false
testdir dir2-bound $fstype false
testdir dir3-ro $fstype true
umount_mntpoint
done
tst_exit