244 lines
5.7 KiB
Bash
Executable File
244 lines
5.7 KiB
Bash
Executable File
#!/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
|