xref: /aosp_15_r20/external/ltp/testcases/kernel/fs/doio/rwtest (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker#!/bin/bash
2*49cdfc7eSAndroid Build Coastguard Worker
3*49cdfc7eSAndroid Build Coastguard Worker# Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
4*49cdfc7eSAndroid Build Coastguard Worker#
5*49cdfc7eSAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or modify it
6*49cdfc7eSAndroid Build Coastguard Worker# under the terms of version 2 of the GNU General Public License as
7*49cdfc7eSAndroid Build Coastguard Worker# published by the Free Software Foundation.
8*49cdfc7eSAndroid Build Coastguard Worker#
9*49cdfc7eSAndroid Build Coastguard Worker# This program is distributed in the hope that it would be useful, but
10*49cdfc7eSAndroid Build Coastguard Worker# WITHOUT ANY WARRANTY; without even the implied warranty of
11*49cdfc7eSAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12*49cdfc7eSAndroid Build Coastguard Worker#
13*49cdfc7eSAndroid Build Coastguard Worker# Further, this software is distributed without any warranty that it is
14*49cdfc7eSAndroid Build Coastguard Worker# free of the rightful claim of any third person regarding infringement
15*49cdfc7eSAndroid Build Coastguard Worker# or the like.  Any license provided herein, whether implied or
16*49cdfc7eSAndroid Build Coastguard Worker# otherwise, applies only to this software file.  Patent licenses, if
17*49cdfc7eSAndroid Build Coastguard Worker# any, provided herein do not apply to combinations of this program with
18*49cdfc7eSAndroid Build Coastguard Worker# other software, or any other product whatsoever.
19*49cdfc7eSAndroid Build Coastguard Worker#
20*49cdfc7eSAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License along
21*49cdfc7eSAndroid Build Coastguard Worker# with this program; if not, write the Free Software Foundation, Inc.,
22*49cdfc7eSAndroid Build Coastguard Worker# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23*49cdfc7eSAndroid Build Coastguard Worker#
24*49cdfc7eSAndroid Build Coastguard Worker# Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
25*49cdfc7eSAndroid Build Coastguard Worker# Mountain View, CA  94043, or:
26*49cdfc7eSAndroid Build Coastguard Worker#
27*49cdfc7eSAndroid Build Coastguard Worker# http://www.sgi.com
28*49cdfc7eSAndroid Build Coastguard Worker#
29*49cdfc7eSAndroid Build Coastguard Worker# For further information regarding this notice, see:
30*49cdfc7eSAndroid Build Coastguard Worker#
31*49cdfc7eSAndroid Build Coastguard Worker# http://oss.sgi.com/projects/GenInfo/NoticeExplan/
32*49cdfc7eSAndroid Build Coastguard Worker
33*49cdfc7eSAndroid Build Coastguard Worker#
34*49cdfc7eSAndroid Build Coastguard Worker# rwtest - a shell wrapper around iogen and doio
35*49cdfc7eSAndroid Build Coastguard Worker#
36*49cdfc7eSAndroid Build Coastguard Worker
37*49cdfc7eSAndroid Build Coastguard Workertrap "exit 0" INT  # Until the smarter signal handler is engaged, below.
38*49cdfc7eSAndroid Build Coastguard Worker
39*49cdfc7eSAndroid Build Coastguard WorkerProg=${0##*/}
40*49cdfc7eSAndroid Build Coastguard Worker
41*49cdfc7eSAndroid Build Coastguard WorkeriOpts=""
42*49cdfc7eSAndroid Build Coastguard WorkerdOpts=""
43*49cdfc7eSAndroid Build Coastguard WorkerLockRegion=""
44*49cdfc7eSAndroid Build Coastguard WorkerNprocs=1
45*49cdfc7eSAndroid Build Coastguard WorkerFiles=""
46*49cdfc7eSAndroid Build Coastguard WorkerRemove_Test_Files=""
47*49cdfc7eSAndroid Build Coastguard WorkerFiles_To_Remove=""
48*49cdfc7eSAndroid Build Coastguard WorkerMPPrun=""
49*49cdfc7eSAndroid Build Coastguard Workerexport TCID="rwtest"
50*49cdfc7eSAndroid Build Coastguard Workerexport TST_TOTAL=1
51*49cdfc7eSAndroid Build Coastguard Workerexport TST_COUNT=1
52*49cdfc7eSAndroid Build Coastguard Worker
53*49cdfc7eSAndroid Build Coastguard Workerusage()
54*49cdfc7eSAndroid Build Coastguard Worker{
55*49cdfc7eSAndroid Build Coastguard Worker	echo "$Prog: [-chq] [-N name] [ iogen options ] [ doio options ] files" >&2
56*49cdfc7eSAndroid Build Coastguard Worker}
57*49cdfc7eSAndroid Build Coastguard Worker
58*49cdfc7eSAndroid Build Coastguard Workerhelp()
59*49cdfc7eSAndroid Build Coastguard Worker{
60*49cdfc7eSAndroid Build Coastguard Worker	echo "\
61*49cdfc7eSAndroid Build Coastguard Worker    -c           Cleanup test files created by this invocation on exit.
62*49cdfc7eSAndroid Build Coastguard Worker                 Default is to leave them.
63*49cdfc7eSAndroid Build Coastguard Worker    -h           This help - ignore all other options/arguments
64*49cdfc7eSAndroid Build Coastguard Worker    -F		 Only process filenames - does not run iogen & doio.
65*49cdfc7eSAndroid Build Coastguard Worker    -P Places	 Not used
66*49cdfc7eSAndroid Build Coastguard Worker    -S Scenario  Execute an internal scenario.
67*49cdfc7eSAndroid Build Coastguard Worker    -N Name	 Pan-style name to be printed with error messages.
68*49cdfc7eSAndroid Build Coastguard Worker
69*49cdfc7eSAndroid Build Coastguard Worker    Options passed through to iogen:
70*49cdfc7eSAndroid Build Coastguard Worker    -[afiLmOstT] arg
71*49cdfc7eSAndroid Build Coastguard Worker    -o
72*49cdfc7eSAndroid Build Coastguard Worker    -q		 Set rwtest to be quiet and pass the flag on to iogen.
73*49cdfc7eSAndroid Build Coastguard Worker
74*49cdfc7eSAndroid Build Coastguard Worker    Options passed through to doio:
75*49cdfc7eSAndroid Build Coastguard Worker    -D[rmMVUC] arg
76*49cdfc7eSAndroid Build Coastguard Worker    -D[aekv]
77*49cdfc7eSAndroid Build Coastguard Worker    -n nprocs    # procs to do simultanious io to the test files.
78*49cdfc7eSAndroid Build Coastguard Worker                 Default is 1.  If -n is non-zero, doio's -k option (use
79*49cdfc7eSAndroid Build Coastguard Worker		 file locking) is forced.
80*49cdfc7eSAndroid Build Coastguard Worker
81*49cdfc7eSAndroid Build Coastguard Worker    files        Files to test on.  File names have the following format:
82*49cdfc7eSAndroid Build Coastguard Worker		 [ size: ] path
83*49cdfc7eSAndroid Build Coastguard Worker		 [ free% [ max size ] : ] path
84*49cdfc7eSAndroid Build Coastguard Worker		 If no size is specified, the files must exist
85*49cdfc7eSAndroid Build Coastguard Worker                 and the contents will be overwritten if testing write or
86*49cdfc7eSAndroid Build Coastguard Worker                 writea system calls.  If a size is supplied, an attempt to
87*49cdfc7eSAndroid Build Coastguard Worker                 create/grow/shrink path to the desired size will be made.
88*49cdfc7eSAndroid Build Coastguard Worker                 size is an integer which defaults to bytes, but may be
89*49cdfc7eSAndroid Build Coastguard Worker                 suffixed by 'b', 'k', or 'm' for blocks (4096 byte units),
90*49cdfc7eSAndroid Build Coastguard Worker	         kilobytes (1024 byte units), or megabytes (2^20 byte units).
91*49cdfc7eSAndroid Build Coastguard Worker
92*49cdfc7eSAndroid Build Coastguard Worker		 If the size is a percentage, df is used to find how much
93*49cdfc7eSAndroid Build Coastguard Worker		 free space there is (in blocks), and uses that.  The maximum
94*49cdfc7eSAndroid Build Coastguard Worker		 size is implied to be in blocks.
95*49cdfc7eSAndroid Build Coastguard Worker" >&2
96*49cdfc7eSAndroid Build Coastguard Worker}
97*49cdfc7eSAndroid Build Coastguard Worker
98*49cdfc7eSAndroid Build Coastguard Workerkillkids()
99*49cdfc7eSAndroid Build Coastguard Worker{
100*49cdfc7eSAndroid Build Coastguard Worker	trap "killkids" INT
101*49cdfc7eSAndroid Build Coastguard Worker	if [[ -z $didkids ]]
102*49cdfc7eSAndroid Build Coastguard Worker	then
103*49cdfc7eSAndroid Build Coastguard Worker		didkids=done
104*49cdfc7eSAndroid Build Coastguard Worker		kill -INT -$$
105*49cdfc7eSAndroid Build Coastguard Worker	fi
106*49cdfc7eSAndroid Build Coastguard Worker}
107*49cdfc7eSAndroid Build Coastguard Worker
108*49cdfc7eSAndroid Build Coastguard Worker
109*49cdfc7eSAndroid Build Coastguard Workercleanup_and_exit()
110*49cdfc7eSAndroid Build Coastguard Worker{
111*49cdfc7eSAndroid Build Coastguard Worker	if [ -n "$Remove_Test_Files" ]
112*49cdfc7eSAndroid Build Coastguard Worker	then
113*49cdfc7eSAndroid Build Coastguard Worker		if [ -n "$Files_To_Remove" ]
114*49cdfc7eSAndroid Build Coastguard Worker		then
115*49cdfc7eSAndroid Build Coastguard Worker			rm -rf $Files_To_Remove
116*49cdfc7eSAndroid Build Coastguard Worker		fi
117*49cdfc7eSAndroid Build Coastguard Worker	fi
118*49cdfc7eSAndroid Build Coastguard Worker
119*49cdfc7eSAndroid Build Coastguard Worker	if [ $1 -ne 0 ]
120*49cdfc7eSAndroid Build Coastguard Worker	then
121*49cdfc7eSAndroid Build Coastguard Worker	    tst_resm TFAIL "Test failed"
122*49cdfc7eSAndroid Build Coastguard Worker	    echo "Test failed"
123*49cdfc7eSAndroid Build Coastguard Worker	else
124*49cdfc7eSAndroid Build Coastguard Worker	    tst_resm TPASS "Test passed"
125*49cdfc7eSAndroid Build Coastguard Worker	    echo "Test passed"
126*49cdfc7eSAndroid Build Coastguard Worker	fi
127*49cdfc7eSAndroid Build Coastguard Worker
128*49cdfc7eSAndroid Build Coastguard Worker	exit $1
129*49cdfc7eSAndroid Build Coastguard Worker}
130*49cdfc7eSAndroid Build Coastguard Worker
131*49cdfc7eSAndroid Build Coastguard Workerwhile (( $# > 0 ))
132*49cdfc7eSAndroid Build Coastguard Workerdo	case $1 in
133*49cdfc7eSAndroid Build Coastguard Worker	-c)	Remove_Test_Files=yes
134*49cdfc7eSAndroid Build Coastguard Worker		;;
135*49cdfc7eSAndroid Build Coastguard Worker
136*49cdfc7eSAndroid Build Coastguard Worker	-d)	debug=$2
137*49cdfc7eSAndroid Build Coastguard Worker		shift
138*49cdfc7eSAndroid Build Coastguard Worker		;;
139*49cdfc7eSAndroid Build Coastguard Worker
140*49cdfc7eSAndroid Build Coastguard Worker	-h)	help
141*49cdfc7eSAndroid Build Coastguard Worker		exit 0
142*49cdfc7eSAndroid Build Coastguard Worker		;;
143*49cdfc7eSAndroid Build Coastguard Worker
144*49cdfc7eSAndroid Build Coastguard Worker	-F)
145*49cdfc7eSAndroid Build Coastguard Worker		opt_F="-F"	# only process filenames
146*49cdfc7eSAndroid Build Coastguard Worker		;;
147*49cdfc7eSAndroid Build Coastguard Worker
148*49cdfc7eSAndroid Build Coastguard Worker	-P)
149*49cdfc7eSAndroid Build Coastguard Worker		PLACES=$2
150*49cdfc7eSAndroid Build Coastguard Worker		shift
151*49cdfc7eSAndroid Build Coastguard Worker		;;
152*49cdfc7eSAndroid Build Coastguard Worker
153*49cdfc7eSAndroid Build Coastguard Worker	-S)	Scenario=$2
154*49cdfc7eSAndroid Build Coastguard Worker		shift
155*49cdfc7eSAndroid Build Coastguard Worker		opt_S="-S"
156*49cdfc7eSAndroid Build Coastguard Worker		;;
157*49cdfc7eSAndroid Build Coastguard Worker
158*49cdfc7eSAndroid Build Coastguard Worker	-N)	Name="($2)"
159*49cdfc7eSAndroid Build Coastguard Worker		TCID=$2
160*49cdfc7eSAndroid Build Coastguard Worker		iOpts="$iOpts -N $2"
161*49cdfc7eSAndroid Build Coastguard Worker		dOpts="$dOpts -N $2"
162*49cdfc7eSAndroid Build Coastguard Worker		shift
163*49cdfc7eSAndroid Build Coastguard Worker		;;
164*49cdfc7eSAndroid Build Coastguard Worker
165*49cdfc7eSAndroid Build Coastguard Worker	# iogen Options to pass thru ... options with an argument
166*49cdfc7eSAndroid Build Coastguard Worker	-[afiLmOstT] )
167*49cdfc7eSAndroid Build Coastguard Worker		iOpts="$iOpts $1 $2"
168*49cdfc7eSAndroid Build Coastguard Worker		shift
169*49cdfc7eSAndroid Build Coastguard Worker		;;
170*49cdfc7eSAndroid Build Coastguard Worker
171*49cdfc7eSAndroid Build Coastguard Worker	# iogen Options to pass thru ... just the option
172*49cdfc7eSAndroid Build Coastguard Worker	-[o] )
173*49cdfc7eSAndroid Build Coastguard Worker		iOpts="$iOpts $1"
174*49cdfc7eSAndroid Build Coastguard Worker		;;
175*49cdfc7eSAndroid Build Coastguard Worker
176*49cdfc7eSAndroid Build Coastguard Worker	# iogen options to look at
177*49cdfc7eSAndroid Build Coastguard Worker	-q)
178*49cdfc7eSAndroid Build Coastguard Worker		iOpts="$iOpts $1"
179*49cdfc7eSAndroid Build Coastguard Worker		Quiet=$1
180*49cdfc7eSAndroid Build Coastguard Worker		;;
181*49cdfc7eSAndroid Build Coastguard Worker
182*49cdfc7eSAndroid Build Coastguard Worker	# doio Options to pass thru ... options with an argument
183*49cdfc7eSAndroid Build Coastguard Worker	-D[rmMVUC] )
184*49cdfc7eSAndroid Build Coastguard Worker		o=${1#-D}
185*49cdfc7eSAndroid Build Coastguard Worker		dOpts="$dOpts -$o $2"
186*49cdfc7eSAndroid Build Coastguard Worker		shift
187*49cdfc7eSAndroid Build Coastguard Worker		;;
188*49cdfc7eSAndroid Build Coastguard Worker
189*49cdfc7eSAndroid Build Coastguard Worker	# doio options to pass thru ... just the options
190*49cdfc7eSAndroid Build Coastguard Worker	-D[aekv] )
191*49cdfc7eSAndroid Build Coastguard Worker		o=${1#-D}
192*49cdfc7eSAndroid Build Coastguard Worker		dOpts="$dOpts -$o"
193*49cdfc7eSAndroid Build Coastguard Worker		;;
194*49cdfc7eSAndroid Build Coastguard Worker
195*49cdfc7eSAndroid Build Coastguard Worker	# doio options to look at
196*49cdfc7eSAndroid Build Coastguard Worker	-n | -Dn )
197*49cdfc7eSAndroid Build Coastguard Worker		dOpts="$dOpts $1 $2"
198*49cdfc7eSAndroid Build Coastguard Worker		# force file locking with > 1 process
199*49cdfc7eSAndroid Build Coastguard Worker		if [[ $2 > 1 ]]
200*49cdfc7eSAndroid Build Coastguard Worker		then
201*49cdfc7eSAndroid Build Coastguard Worker			dOpts="$dOpts -k"
202*49cdfc7eSAndroid Build Coastguard Worker		fi
203*49cdfc7eSAndroid Build Coastguard Worker		opt_n="-n"
204*49cdfc7eSAndroid Build Coastguard Worker		shift
205*49cdfc7eSAndroid Build Coastguard Worker		;;
206*49cdfc7eSAndroid Build Coastguard Worker
207*49cdfc7eSAndroid Build Coastguard Worker	\? | -*)
208*49cdfc7eSAndroid Build Coastguard Worker		echo "$Prog:  Illegal option $1" >&2
209*49cdfc7eSAndroid Build Coastguard Worker		tst_resm TBROK "Illegal option $1"
210*49cdfc7eSAndroid Build Coastguard Worker		exit 1
211*49cdfc7eSAndroid Build Coastguard Worker		;;
212*49cdfc7eSAndroid Build Coastguard Worker
213*49cdfc7eSAndroid Build Coastguard Worker	*)
214*49cdfc7eSAndroid Build Coastguard Worker		break
215*49cdfc7eSAndroid Build Coastguard Worker		;;
216*49cdfc7eSAndroid Build Coastguard Worker	esac
217*49cdfc7eSAndroid Build Coastguard Worker	shift
218*49cdfc7eSAndroid Build Coastguard Workerdone
219*49cdfc7eSAndroid Build Coastguard Worker
220*49cdfc7eSAndroid Build Coastguard Worker#
221*49cdfc7eSAndroid Build Coastguard Worker# Hard-Coded Scenario Specifications
222*49cdfc7eSAndroid Build Coastguard Worker#
223*49cdfc7eSAndroid Build Coastguard Worker# FSA		RAW I/O via FSA
224*49cdfc7eSAndroid Build Coastguard Worker# MPPnnn	Run as a <nnn> sized MPP application
225*49cdfc7eSAndroid Build Coastguard Worker# userstripe	create files using user striping
226*49cdfc7eSAndroid Build Coastguard Worker#
227*49cdfc7eSAndroid Build Coastguard Worker
228*49cdfc7eSAndroid Build Coastguard Workerif [[ -n "$opt_S" ]]
229*49cdfc7eSAndroid Build Coastguard Workerthen
230*49cdfc7eSAndroid Build Coastguard Worker	case $Scenario in
231*49cdfc7eSAndroid Build Coastguard Worker
232*49cdfc7eSAndroid Build Coastguard Worker	FSA )
233*49cdfc7eSAndroid Build Coastguard Worker		# I/O via FSA
234*49cdfc7eSAndroid Build Coastguard Worker		Flags="parallel"
235*49cdfc7eSAndroid Build Coastguard Worker		Nprocs=1
236*49cdfc7eSAndroid Build Coastguard Worker		LockRegion=""
237*49cdfc7eSAndroid Build Coastguard Worker	;;
238*49cdfc7eSAndroid Build Coastguard Worker
239*49cdfc7eSAndroid Build Coastguard Worker	MPP* )
240*49cdfc7eSAndroid Build Coastguard Worker		# use mpprun...  to cooperate with a batch system, this
241*49cdfc7eSAndroid Build Coastguard Worker		# requires scanning mppview, etc.
242*49cdfc7eSAndroid Build Coastguard Worker
243*49cdfc7eSAndroid Build Coastguard Worker		NPE=${Scenario#MPP}
244*49cdfc7eSAndroid Build Coastguard Worker		MPPrun=" mpprun -n $NPE "
245*49cdfc7eSAndroid Build Coastguard Worker	;;
246*49cdfc7eSAndroid Build Coastguard Worker	userstripe)
247*49cdfc7eSAndroid Build Coastguard Worker		#create files using user striping
248*49cdfc7eSAndroid Build Coastguard Worker		Oflags=O_PLACE,0xffffffffffffffff,1000
249*49cdfc7eSAndroid Build Coastguard Worker	;;
250*49cdfc7eSAndroid Build Coastguard Worker
251*49cdfc7eSAndroid Build Coastguard Worker	places*)
252*49cdfc7eSAndroid Build Coastguard Worker		FSIZE=${Scenario#places-}
253*49cdfc7eSAndroid Build Coastguard Worker		oi="$IFS"
254*49cdfc7eSAndroid Build Coastguard Worker		IFS=":"
255*49cdfc7eSAndroid Build Coastguard Worker		set -- $PLACES
256*49cdfc7eSAndroid Build Coastguard Worker		if [ $# -eq 0 ]
257*49cdfc7eSAndroid Build Coastguard Worker		then
258*49cdfc7eSAndroid Build Coastguard Worker			# "this isn't supposed to happen"
259*49cdfc7eSAndroid Build Coastguard Worker			Files="25%:rwtest.$$"
260*49cdfc7eSAndroid Build Coastguard Worker		else
261*49cdfc7eSAndroid Build Coastguard Worker			IFS="$oi"
262*49cdfc7eSAndroid Build Coastguard Worker			PL=${*}
263*49cdfc7eSAndroid Build Coastguard Worker			for p in $PL
264*49cdfc7eSAndroid Build Coastguard Worker			do
265*49cdfc7eSAndroid Build Coastguard Worker				f="$f "${FSIZE}":"${p}"/rwtest$$"
266*49cdfc7eSAndroid Build Coastguard Worker			done
267*49cdfc7eSAndroid Build Coastguard Worker			set -- $f
268*49cdfc7eSAndroid Build Coastguard Worker		fi
269*49cdfc7eSAndroid Build Coastguard Worker	;;
270*49cdfc7eSAndroid Build Coastguard Worker	esac
271*49cdfc7eSAndroid Build Coastguard Workerfi
272*49cdfc7eSAndroid Build Coastguard Worker
273*49cdfc7eSAndroid Build Coastguard Worker#
274*49cdfc7eSAndroid Build Coastguard Worker# If no files are specified ...
275*49cdfc7eSAndroid Build Coastguard Worker#	check if PLACES is set; if so, put one file in each place
276*49cdfc7eSAndroid Build Coastguard Worker#	otherwise generate one filename in the current directory.
277*49cdfc7eSAndroid Build Coastguard Worker#
278*49cdfc7eSAndroid Build Coastguard Worker
279*49cdfc7eSAndroid Build Coastguard Workerif [ $# -eq 0 ]
280*49cdfc7eSAndroid Build Coastguard Workerthen
281*49cdfc7eSAndroid Build Coastguard Worker	# put one file in each of $PLACES
282*49cdfc7eSAndroid Build Coastguard Worker	Files="25%:rwtest.file"
283*49cdfc7eSAndroid Build Coastguard Workerelse
284*49cdfc7eSAndroid Build Coastguard Worker	Files=$*
285*49cdfc7eSAndroid Build Coastguard Workerfi
286*49cdfc7eSAndroid Build Coastguard Worker
287*49cdfc7eSAndroid Build Coastguard Worker#
288*49cdfc7eSAndroid Build Coastguard Worker# use 'df -PB' to see how many blocks are available, apply a hard limit of
289*49cdfc7eSAndroid Build Coastguard Worker# 1,000,000 blocks if no limit is specified
290*49cdfc7eSAndroid Build Coastguard Worker#
291*49cdfc7eSAndroid Build Coastguard Worker
292*49cdfc7eSAndroid Build Coastguard Workercase "$(uname -s)" in
293*49cdfc7eSAndroid Build Coastguard Worker	IRIX | IRIX64 )		dfOpts="-Pb"	;;
294*49cdfc7eSAndroid Build Coastguard Worker	Linux)			dfOpts="-P"	;;
295*49cdfc7eSAndroid Build Coastguard Worker	*)			dfOpts="-PB"	;;
296*49cdfc7eSAndroid Build Coastguard Workeresac
297*49cdfc7eSAndroid Build Coastguard Worker
298*49cdfc7eSAndroid Build Coastguard Workerfor f in $Files
299*49cdfc7eSAndroid Build Coastguard Workerdo
300*49cdfc7eSAndroid Build Coastguard Worker	file=${f##*:}
301*49cdfc7eSAndroid Build Coastguard Worker	if [ ! -f "$file" ]
302*49cdfc7eSAndroid Build Coastguard Worker	then
303*49cdfc7eSAndroid Build Coastguard Worker		Files_To_Remove="$Files_To_Remove $file"
304*49cdfc7eSAndroid Build Coastguard Worker	fi
305*49cdfc7eSAndroid Build Coastguard Worker
306*49cdfc7eSAndroid Build Coastguard Worker	dir=$(dirname $file)
307*49cdfc7eSAndroid Build Coastguard Worker	# create directory for file if non-existent
308*49cdfc7eSAndroid Build Coastguard Worker	if [ ! -d "$dir" ]
309*49cdfc7eSAndroid Build Coastguard Worker	then
310*49cdfc7eSAndroid Build Coastguard Worker		mkdir -p $dir
311*49cdfc7eSAndroid Build Coastguard Worker		Files_To_Remove="$Files_To_Remove $dir"
312*49cdfc7eSAndroid Build Coastguard Worker	fi
313*49cdfc7eSAndroid Build Coastguard Worker	size=${f%%:*}
314*49cdfc7eSAndroid Build Coastguard Worker	if [[ $size = *%* ]]
315*49cdfc7eSAndroid Build Coastguard Worker	then
316*49cdfc7eSAndroid Build Coastguard Worker
317*49cdfc7eSAndroid Build Coastguard Worker		typeset -i n=0
318*49cdfc7eSAndroid Build Coastguard Worker		while (( n < ${#szcache[*]} ))
319*49cdfc7eSAndroid Build Coastguard Worker		do
320*49cdfc7eSAndroid Build Coastguard Worker			if [[ szcache[$n] = $dir ]]; then
321*49cdfc7eSAndroid Build Coastguard Worker				break;
322*49cdfc7eSAndroid Build Coastguard Worker			fi
323*49cdfc7eSAndroid Build Coastguard Worker			n=n+1
324*49cdfc7eSAndroid Build Coastguard Worker		done
325*49cdfc7eSAndroid Build Coastguard Worker
326*49cdfc7eSAndroid Build Coastguard Worker		if (( n < ${#szcache[*]} ))
327*49cdfc7eSAndroid Build Coastguard Worker		then
328*49cdfc7eSAndroid Build Coastguard Worker			blks=${szblks[$n]}
329*49cdfc7eSAndroid Build Coastguard Worker		else
330*49cdfc7eSAndroid Build Coastguard Worker			blks=$(df $dfOpts $dir |
331*49cdfc7eSAndroid Build Coastguard Worker			(while read fs blks used avail cap mountpoint
332*49cdfc7eSAndroid Build Coastguard Worker			 do
333*49cdfc7eSAndroid Build Coastguard Worker				#echo $fs $blks $used $avail >&2
334*49cdfc7eSAndroid Build Coastguard Worker				b=$avail
335*49cdfc7eSAndroid Build Coastguard Worker			 done
336*49cdfc7eSAndroid Build Coastguard Worker			 echo $b) )
337*49cdfc7eSAndroid Build Coastguard Worker
338*49cdfc7eSAndroid Build Coastguard Worker			# check if blks is a number, else set a default value for blks
339*49cdfc7eSAndroid Build Coastguard Worker			default_sz=1000000
340*49cdfc7eSAndroid Build Coastguard Worker			if [ $blks -eq $blks 2> /dev/null -a $blks -gt 0 ]
341*49cdfc7eSAndroid Build Coastguard Worker			then
342*49cdfc7eSAndroid Build Coastguard Worker
343*49cdfc7eSAndroid Build Coastguard Worker				case $(uname) in
344*49cdfc7eSAndroid Build Coastguard Worker				Linux)  blks=$( expr $blks / 2 ) ;;
345*49cdfc7eSAndroid Build Coastguard Worker				esac
346*49cdfc7eSAndroid Build Coastguard Worker
347*49cdfc7eSAndroid Build Coastguard Worker				szcache[${#szcache[*]}+1]=$dir
348*49cdfc7eSAndroid Build Coastguard Worker				szblks[${#szblks[*]}+1]=$blks
349*49cdfc7eSAndroid Build Coastguard Worker
350*49cdfc7eSAndroid Build Coastguard Worker				max=${size##*\%}
351*49cdfc7eSAndroid Build Coastguard Worker				[ "x$max" = "x" ] && max=$default_sz
352*49cdfc7eSAndroid Build Coastguard Worker				size=${size%%\%*}
353*49cdfc7eSAndroid Build Coastguard Worker
354*49cdfc7eSAndroid Build Coastguard Worker				case $(uname) in
355*49cdfc7eSAndroid Build Coastguard Worker				IRIX*)
356*49cdfc7eSAndroid Build Coastguard Worker				  sz=$( perl -le 'print int( '$blks' * '$size' / 100 )' )
357*49cdfc7eSAndroid Build Coastguard Worker				  ;;
358*49cdfc7eSAndroid Build Coastguard Worker				*)
359*49cdfc7eSAndroid Build Coastguard Worker				  sz=$(expr \( $blks '*' $size \) / 100)
360*49cdfc7eSAndroid Build Coastguard Worker				  ;;
361*49cdfc7eSAndroid Build Coastguard Worker				esac
362*49cdfc7eSAndroid Build Coastguard Worker
363*49cdfc7eSAndroid Build Coastguard Worker				if [ $sz -gt $max ]
364*49cdfc7eSAndroid Build Coastguard Worker				then
365*49cdfc7eSAndroid Build Coastguard Worker					sz=$max
366*49cdfc7eSAndroid Build Coastguard Worker				fi
367*49cdfc7eSAndroid Build Coastguard Worker			else
368*49cdfc7eSAndroid Build Coastguard Worker				sz=$default_sz
369*49cdfc7eSAndroid Build Coastguard Worker			fi
370*49cdfc7eSAndroid Build Coastguard Worker		fi
371*49cdfc7eSAndroid Build Coastguard Worker		f=$sz"b:"$file
372*49cdfc7eSAndroid Build Coastguard Worker	fi
373*49cdfc7eSAndroid Build Coastguard Worker	F[${#F[*]}+1]=$f
374*49cdfc7eSAndroid Build Coastguard Workerdone
375*49cdfc7eSAndroid Build Coastguard Worker
376*49cdfc7eSAndroid Build Coastguard WorkerFiles=${F[*]}
377*49cdfc7eSAndroid Build Coastguard Worker
378*49cdfc7eSAndroid Build Coastguard Workerif [[ -z ${dOpts} ]]; then
379*49cdfc7eSAndroid Build Coastguard Worker	dOpts=-av
380*49cdfc7eSAndroid Build Coastguard Workerfi
381*49cdfc7eSAndroid Build Coastguard Worker
382*49cdfc7eSAndroid Build Coastguard Workerif [[ -n "$opt_F" ]]; then
383*49cdfc7eSAndroid Build Coastguard Worker
384*49cdfc7eSAndroid Build Coastguard Worker	echo $Files
385*49cdfc7eSAndroid Build Coastguard Worker
386*49cdfc7eSAndroid Build Coastguard Workerelse
387*49cdfc7eSAndroid Build Coastguard Worker
388*49cdfc7eSAndroid Build Coastguard Worker	cmd="${LTPROOT}/testcases/bin/iogen ${iOpts} ${Files} | $MPPrun ${LTPROOT}/testcases/bin/doio ${dOpts}"
389*49cdfc7eSAndroid Build Coastguard Worker
390*49cdfc7eSAndroid Build Coastguard Worker	if [[ -z "$Quiet" ]]; then
391*49cdfc7eSAndroid Build Coastguard Worker		echo $cmd
392*49cdfc7eSAndroid Build Coastguard Worker	fi
393*49cdfc7eSAndroid Build Coastguard Worker
394*49cdfc7eSAndroid Build Coastguard Worker	trap "killkids" INT
395*49cdfc7eSAndroid Build Coastguard Worker	trap "cleanup_and_exit 2" HUP
396*49cdfc7eSAndroid Build Coastguard Worker
397*49cdfc7eSAndroid Build Coastguard Worker	( ${LTPROOT}/testcases/bin/iogen ${iOpts} ${Files}
398*49cdfc7eSAndroid Build Coastguard Worker	  r=$?
399*49cdfc7eSAndroid Build Coastguard Worker	  if [ $r -ne 0 ]
400*49cdfc7eSAndroid Build Coastguard Worker	  then
401*49cdfc7eSAndroid Build Coastguard Worker		echo "$Prog$Name : iogen reported errors (r=$r)" >&2
402*49cdfc7eSAndroid Build Coastguard Worker		tst_resm TFAIL "iogen reported errors (r=$r)"
403*49cdfc7eSAndroid Build Coastguard Worker		kill -HUP $$
404*49cdfc7eSAndroid Build Coastguard Worker	  fi
405*49cdfc7eSAndroid Build Coastguard Worker	) | $MPPrun ${LTPROOT}/testcases/bin/doio ${dOpts}
406*49cdfc7eSAndroid Build Coastguard Worker	r=$?
407*49cdfc7eSAndroid Build Coastguard Worker	if [ $r -ne 0 ]
408*49cdfc7eSAndroid Build Coastguard Worker	then
409*49cdfc7eSAndroid Build Coastguard Worker		echo "$Prog$Name : doio reported errors (r=$r)" >&2
410*49cdfc7eSAndroid Build Coastguard Worker		tst_resm TFAIL "doio reported errors (r=$r)"
411*49cdfc7eSAndroid Build Coastguard Worker	fi
412*49cdfc7eSAndroid Build Coastguard Worker
413*49cdfc7eSAndroid Build Coastguard Worker	cleanup_and_exit $r
414*49cdfc7eSAndroid Build Coastguard Workerfi
415