1 #! /bin/sh 2 # 3 # Copyright (c) International Business Machines Corp., 2005 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 implie; 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 # 21 # FILE : fs_di 22 # 23 # PURPOSE: FileSystem Data Integrity 24 # 1. Creates a data file of specified or random size and copies 25 # the file to a random directory depth on a specified filesystem 26 # The two files are compared and checked for differences. 27 # If the files differ, then the test fails. By default, this 28 # test creates a 30Mb file and runs for ten loops. 29 # 2. Creates a datafile of size half of the partition size. Creates 30 # two fragmented files on the specified partition and copies datafile 31 # to them. Then compares both the fragmented files with datafile. If 32 # files differ, then test fails. 33 # 34 # SETUP: None 35 # 36 # 37 # HISTORY: 38 # 28/07/09 Jyoti Vantagodi (jyotiv (at] linux.vnet.ibm.com) 39 # Added point two of above PURPOSE 40 # 04/11/05 Robbie Williamson (robbiew (at] us.ibm.com) 41 # -Written 42 # 43 #*********************************************************************** 44 45 #Uncomment line below for debug output. 46 #trace_logic=${trace_logic:-"set -x"} 47 48 $trace_logic 49 50 #----------------------------------------------------------------------- 51 # Initialize local variables 52 #----------------------------------------------------------------------- 53 TC=${TC:=fs_di} 54 TCbin=${TCbin:=`pwd`} 55 TCtmp=${TCtmp:=$TMPDIR/$TC$$} 56 export PATH=$PATH:$TCbin:../../../bin 57 export TCID=$TC 58 export TST_TOTAL=1 59 export TST_COUNT=1 60 61 # If CLEANUP is not set; set it to "ON" 62 CLEANUP=${CLEANUP:="ON"} 63 usage() 64 { 65 cat <<-EOF >&2 66 67 usage: ./${0##*/} -d TMPDIR [-h] [-l # of LOOPS ] [-s SIZE in Mb][-S partition SIZE in Mb] 68 69 -d TMPDIR Directory where temporary files will be created. 70 -h Help. Prints all available options. 71 -l # of LOOPS The number of times to run the test. Default=10. 72 -s SIZE in Mb The size of the data file to create. Default=30Mb. A "0" means random sizes from 10-500Mb. 73 -S SIZE in Mb Size of usable partition (in MBs) on which the testing is carried out (needs to be passed 74 for fragmented file test) 75 -v Verbose output. 76 example: ./${0##*/} -d /mnt/cifsmount -l 20 -s 100 -S 200 77 example: ./${0##*/} -d /mnt/cifsmount -l 20 -s 100 78 79 EOF 80 exit 0 81 } 82 83 #============================================================================= 84 # FUNCTION NAME: end_testcase 85 # 86 # FUNCTION DESCRIPTION: Clean up 87 # 88 # PARAMETERS: None. 89 # 90 # RETURNS: None. 91 #============================================================================= 92 end_testcase() 93 { 94 $trace_logic 95 if [ "$CLEANUP" = "ON" ]; then 96 rm -rf $TCtmp 97 rm -rf ${TESTFS} 98 rm -f $TCtmp/testfile* 99 fi 100 101 [ $# = 0 ] && { tst_resm TPASS "Test Successful"; exit 0; } 102 tst_resm TFAIL "Test Failed: $@" 103 exit 1 104 } 105 106 #============================================================================= 107 # FUNCTION NAME: setup_testcase 108 # 109 # FUNCTION DESCRIPTION: Perform the setup function for the testcase. 110 # 111 # PARAMETERS: None. 112 # 113 # RETURNS: None. 114 #============================================================================= 115 $trace_logic 116 TMPBASE=0 117 LOOPS=10 118 SIZE=30 119 RANDOM_SIZE=0 120 DISK_SIZE=0 121 while getopts d:hl:s:S:v arg 122 do 123 case $arg in 124 125 d) # append $$ to TMP, as it is recursively 126 # removed at end of script. 127 export TMPBASE=$OPTARG 128 TMP="${TMPBASE}/fs_di-$$" 129 export TESTFS="$TMP";; 130 h) usage 131 exit 0;; 132 133 l) # Execute user defined number of loops. 134 LOOPS=$OPTARG;; 135 136 s) # Size of data file to create 137 SIZE=$OPTARG 138 if [ $SIZE -eq 0 ]; then 139 RANDOM_SIZE=1 140 fi;; 141 142 v) # Verbose 143 trace_logic=${trace_logic:-"set -x"};; 144 145 S) # Size of usable partition, which is used for creating creating the files 146 DISK_SIZE=$OPTARG;; 147 148 \?) usage 149 exit 0;; 150 esac 151 done 152 if [ $TMPBASE = "0" ]; then 153 tst_resm TBROK "You must specify the target directory [-d]" 154 exit 1 155 fi 156 157 export TST_COUNT=$LOOPS 158 159 echo "" 160 echo "Test Options:" 161 echo " Tested Filesystem: $TESTFS" 162 echo " Loops: $LOOPS" 163 if [ $RANDOM_SIZE -eq 0 ];then 164 echo " Data File Size: $SIZE" 165 else 166 echo " Data File Size: Random" 167 fi 168 sleep 5 169 170 $trace_logic 171 mkdir -p $TCtmp || end_testcase "Could not create $TCtmp" 172 chmod 777 $TCtmp 173 mkdir -p $TESTFS || end_testcase "Could not create $TESTFS" 174 chmod 777 $TESTFS 175 176 177 #============================================================================= 178 # FUNCTION NAME: main 179 # 180 # FUNCTION DESCRIPTION: Perform the test 181 # 182 # PARAMETERS: None. 183 # 184 # RETURNS: None. 185 #============================================================================= 186 loopcount=0 187 tst_resm TINFO "Test Started" 188 while [ $loopcount -lt $LOOPS ] 189 do 190 if [ $RANDOM_SIZE -eq 1 ]; then 191 SIZE=$RANDOM 192 let "SIZE %= 500" 193 while [ $SIZE -lt 10 ] 194 do 195 SIZE=$RANDOM 196 let "SIZE %= 500" 197 done 198 fi 199 create_datafile $SIZE $TCtmp/testfile >/dev/null 200 if [ $? != 0 ]; then 201 end_testcase "Could not create testfile of size ${SIZE}Mb" 202 fi 203 RANDOM_DEPTH=$RANDOM 204 : $(( RANDOM_DEPTH %= 500 )) 205 206 RANDOM_LENGTH=$RANDOM 207 : $(( RANDOM_LENGTH %= 500 )) 208 RANDOM_LENGTH=$(( $RANDOM_LENGTH / 10 )) 209 210 NameCount=0 211 DepthCount=0 212 FILEPATH="" 213 while [ $DepthCount -lt $RANDOM_DEPTH ] 214 do 215 if [ $NameCount -lt $RANDOM_LENGTH ]; then 216 FILEPATH=${FILEPATH}X 217 NameCount=$(( $NameCount + 1 )) 218 else 219 FILEPATH=${FILEPATH}/ 220 NameCount=0 221 fi 222 DepthCount=$(( $DepthCount + 1 )) 223 done 224 mkdir -p ${TESTFS}/${FILEPATH} || end_testcase "Could not create ${TESTFS}/${FILEPATH}" 225 chmod -R 777 $TESTFS 226 227 cp $TCtmp/testfile ${TESTFS}/${FILEPATH} 228 cmp $TCtmp/testfile ${TESTFS}/${FILEPATH}/testfile 229 retval=$? 230 if [ "$retval" != 0 ]; then 231 end_testcase "Error in loop $loopcount: cmp after write FAILED" 232 fi 233 cp ${TESTFS}/${FILEPATH}/testfile $TCtmp/testfile_copy 234 cmp $TCtmp/testfile $TCtmp/testfile_copy 235 retval=$? 236 if [ "$retval" != 0 ]; then 237 end_testcase "Error in loop $loopcount: cmp after read FAILED" 238 fi 239 rm -rf ${TESTFS}/${FILEPATH} 240 rm -f $TCtmp/testfile* 241 loopcount=$(( $loopcount + 1 )) 242 tst_resm TINFO "Completed Loop $loopcount" 243 done 244 if [ "$DISK_SIZE" != 0 ]; then 245 #Create a datafile of size half of the disk size 246 tst_resm TINFO "Creating fragmented files. Please wait..." 247 DISK_SIZE=$(( $DISK_SIZE / 2 )) 248 if [ "$DISK_SIZE" == 0 ]; then 249 DISK_SIZE=1 250 fi 251 create_datafile $DISK_SIZE $TCtmp/testfile >/dev/null 252 retval=$? 253 if [ "$retval" != 0 ]; then 254 end_testcase "Error in creating data file" 255 fi 256 257 #Invoke frag to create 2 fragmented files and copy data file to both the files 258 frag $TCtmp/testfile $TMPBASE 259 retval=$? 260 if [ "$retval" != 0 ]; then 261 end_testcase "Error in creating frag files" 262 fi 263 tst_resm TINFO "Created fragmented files" 264 265 #Compare both frag files with data file 266 cmp $TCtmp/testfile $TMPBASE/frag1 267 retval=$? 268 if [ "$retval" != 0 ]; then 269 end_testcase "frag1 and datafile are not matching" 270 fi 271 if [ "$retval" != 0 ]; then 272 end_testcase "frag2 and datafile are not matching" 273 fi 274 275 tst_resm TINFO "Completed test with fragmented files" 276 rm -rf $TMPBASE/* 277 rm -f $TCtmp/testfile* 278 fi 279 end_testcase 280