1#!/bin/sh 2# 3# Copyright (c) International Business Machines Corp., 2008 4# 5# This program is free software; you can redistribute it and/or modify 6# it under the terms of the GNU General Public License as published by 7# the Free Software Foundation; either version 2 of the License, or 8# (at your option) any later version. 9# 10# This program is distributed in the hope that it will be useful, 11# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13# the GNU General Public License for more details. 14# 15# You should have received a copy of the GNU General Public License 16# along with this program; if not, write to the Free Software 17# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18# 19#******************************************************************************* 20# Readme_ROBind has more details on the tests running for ROBIND. 21# TEST: 22# NAME: test_robind.sh 23# FUNCTIONALITY: File system tests for normal mount, bind mount and RO mount 24# 25# DESCRIPTION: Performs filesystems tests for RO mount. 26# For filesystem, like ext2, ext3, reiserfs, jfs & xfs, 27# This test needs a big block device(>=500MB is ok), and you can specify 28# it by -z option when running runltp. 29# a) mounts on dir1, 30# b) mount --bind dir2 31# c) mount -o remount,ro 32# It verifies the tests on a) and b) works correctly. 33# For the c) option it checks that the tests are not able to write 34# into dir. 35#=============================================================================== 36# 37# CHANGE HISTORY: 38# DATE AUTHOR REASON 39# 09/06/2008 Veerendra Chandrappa For Container, testing of RO-Bind mount 40# Dave Hansen 41# This script is based on the Dave Hansen script for testing the robind. 42#******************************************************************************* 43 44export TCID="test_robind" 45export TST_TOTAL=3 46 47DIRS="dir1 dir2-bound dir3-ro" 48dir1_mount_flag=0 49dir2_bound_mount_flag=0 50dir3_ro_mount_flag=0 51 52. test.sh 53 54usage() 55{ 56 cat << EOF 57 usage: $0 -c command [ext3,ext2,jfs,xfs,reiserfs,ramfs] 58 59 This script verifies ReadOnly-filesystem, by mounting block device and 60 executing the filesystem tests. 61 62 OPTIONS 63 -h display this message and exit 64 -c command to be executed 65 66EOF 67 exit 1 68} 69 70umount_mntpoint() 71{ 72 if [ $dir3_ro_mount_flag -eq 1 ];then 73 umount dir3-ro 74 if [ $? -ne 0 ];then 75 tst_resm TWARN "umount dir3-ro failed" 76 else 77 dir3_ro_mount_flag=0 78 fi 79 fi 80 81 if [ $dir2_bound_mount_flag -eq 1 ];then 82 umount dir2-bound 83 if [ $? -ne 0 ];then 84 tst_resm TWARN "umount dir2-bound failed" 85 else 86 dir2_bound_mount_flag=0 87 fi 88 fi 89 90 if [ $dir1_mount_flag -eq 1 ];then 91 umount dir1 92 if [ $? -ne 0 ];then 93 tst_resm TWARN "umount dir1" 94 else 95 dir1_mount_flag=0 96 fi 97 fi 98} 99 100cleanup() 101{ 102 umount_mntpoint 103 tst_rmdir 104} 105 106# parameters: file_systems (if any ) 107setup() 108{ 109 tst_require_root 110 111 if [ -z "$LTP_BIG_DEV" ];then 112 tst_brkm TCONF "tests need a big block device(>=500MB)" 113 else 114 device=$LTP_BIG_DEV 115 fi 116 117 tst_tmpdir 118 TST_CLEANUP=cleanup 119 120 for dir in $DIRS 121 do 122 rm -rf $dir 123 mkdir -p $dir 124 done 125 126 # populating the default FS as $LTP_BIG_DEV_FS_TYPE 127 # (or ext3 if it's not set), if FS is not given 128 if [ -z "$*" ]; then 129 FSTYPES=${LTP_BIG_DEV_FS_TYPE:-ext3} 130 else 131 FSTYPES="$*" 132 fi 133} 134 135# the core function where it runs the tests 136# $1 - directory where to run tests 137# $2 - file system type 138# $3 - read-only flag [true|false] 139testdir() 140{ 141 local dir=$1 142 local fs_type=$2 143 local RO=$3 144 local tst_result=0 145 local curdir=$(pwd) 146 147 cd $dir 148 tst_resm TINFO "command: $command" 149 150 # we need to export TMPDIR, in case test calls tst_rmdir() 151 export TMPDIR=$curdir/$dir 152 153 eval $command > $curdir/test.log 2>&1 154 tst_result=$? 155 156 # if tst_result isn't 0 and read-only flag is false, the test failed 157 # or if tst_result is 0 and read-only flag is true, the test failed. 158 if [ "$RO" = "false" -a $tst_result -ne 0 -o "$RO" = "true" -a \ 159 $tst_result -eq 0 ];then 160 tst_resm TINFO "error info:" 161 cat $curdir/test.log 162 tst_resm TFAIL "RO-FileSystem Tests FAILED for \ 163 $dir $fs_type read-only flag: $RO" 164 else 165 tst_resm TPASS "RO-FileSystem Tests PASSED for \ 166 $dir $fs_type read-only flag: $RO" 167 fi 168 169 # remove all the temp files created. 170 cd .. 171 rm -f $curdir/test.log 172 rm -rf $curdir/$dir/* 173} 174 175#============================================================================= 176# MAIN 177# See the description, purpose, and design of this test under TEST 178# in this test's prolog. 179#============================================================================= 180 181while getopts c:h: OPTION; do 182 case $OPTION in 183 c) 184 command=$OPTARG;; 185 h) 186 usage;; 187 ?) 188 usage;; 189 esac 190done 191shift $((OPTIND-1)) 192 193setup $* 194 195# Executes the tests for different FS's 196for fstype in $FSTYPES; do 197 if [ "$fstype" = "reiserfs" ]; then 198 opts="-f --journal-size 513 -q" 199 elif echo "$fstype" | grep -q "ext"; then 200 opts="-F" 201 elif [ "$fstype" = "xfs" ]; then 202 opts="-f" 203 elif [ "$fstype" = "btrfs" ]; then 204 opts="-f" 205 fi 206 207 if [ "$fstype" != "ramfs" ]; then 208 tst_mkfs $fstype $device $opts 209 fi 210 211 mount -t $fstype $device dir1 212 if [ $? -ne 0 ];then 213 tst_brkm TBROK "mount $device to dir1 failed" 214 else 215 dir1_mount_flag=1 216 fi 217 218 mount --bind dir1 dir2-bound 219 if [ $? -ne 0 ];then 220 tst_brkm TBROK "mount --bind dir1 dir2-bound failed" 221 else 222 dir2_bound_mount_flag=1 223 fi 224 225 mount --bind dir1 dir3-ro 226 if [ $? -ne 0 ];then 227 tst_brkm TBROK "mount --bind dir1 dir3-ro failed" 228 else 229 dir3_ro_mount_flag=1 230 fi 231 232 mount -o remount,ro,bind dir1 dir3-ro 233 if [ $? -ne 0 ];then 234 tst_brkm TBROK "mount -o remount,ro,bind dir1 dir3-ro failed" 235 fi 236 237 testdir dir1 $fstype false 238 testdir dir2-bound $fstype false 239 testdir dir3-ro $fstype true 240 umount_mntpoint 241done 242 243tst_exit 244