Whamcloud - gitweb
Create sparse files unless using one of the gzipped sizes. Waiting for
[fs/lustre-release.git] / lustre / tests / common.sh
1 #!/bin/sh
2 export PATH=$PATH:/sbin:/usr/sbin
3
4 [ -d /r ] && R=/r
5
6 PORTALS=$SRCDIR/../../portals
7 LUSTRE=$SRCDIR/../../obd
8
9 PTLCTL=$PORTALS/linux/utils/ptlctl
10 DBGCTL=$PORTALS/linux/utils/debugctl
11 ACCEPTOR=$PORTALS/linux/utils/acceptor
12
13 OBDCTL=$LUSTRE/utils/obdctl
14
15 LOOPNUM=0; export LOOPNUM
16 if [ -b /dev/loop0 ]; then
17         LOOP=/dev/loop
18 elif [ -b /dev/loop/0 ]; then
19         LOOP=/dev/loop/
20 else
21         echo "Cannot find /dev/loop0 or /dev/loop/0" 1>&2 && exit -1
22 fi
23
24 # Return the next unused loop device on stdout and in the $LOOPDEV
25 # environment variable.
26 next_loop_dev() {
27         NEXT=
28         while [ -b ${LOOP}${LOOPNUM} ]; do
29                 LOOPDEV=${LOOP}${LOOPNUM}
30                 losetup ${LOOPDEV} > /dev/null 2>&1 || NEXT=${LOOPDEV}
31                 LOOPNUM=`expr ${LOOPNUM} + 1`
32                 [ "$NEXT" ] && echo ${NEXT} && break
33         done
34 }
35
36 # Create a new filesystem.  If we are using a loopback device, we check
37 # for existing "template" filesystems instead of creating a new one,
38 # because it is _much_ faster to gunzip the empty filesystem instead of
39 # creating a new one from scratch.  Conversely, if we are creating a
40 # filesystem on a device we use mkfs, because that only writes sparsely
41 # to the device.  The empty filesystems are also highly compressed (1000:1)
42 # so they don't take too much space.
43 new_fs () {
44         EFILE="$1_$3.gz"
45         MKFS="mkfs.$1"
46         MKFSOPT="-b 4096"
47
48         [ "$1" = "ext3" ] && MKFS="mkfs.ext2 -j"
49
50         if [ -b "$2" ]; then
51                 [ $# -lt 2 -o $# -gt 3 ] && \
52                         echo "usage: $0 <fstype> <file> [size]" 1>&2 && exit -1
53
54                 PM="/proc/mounts"
55                 [ -r "$PM" ] || PM="/etc/mtab"
56
57                 grep "$2 " $PM 1>&2 && echo "$0: $2 is in $PM!" 1>&2 && exit -1
58
59                 $MKFS $MKFSOPT $2 $3 || exit -1
60                 LOOPDEV=$2      # Not really a loop device
61         else
62                 [ $# -ne 3 ] && \
63                         echo "usage: $0 <fstype> <file> <size>" 1>&2 && exit -1
64
65                 if [ -r "$EFILE" ]; then
66                         echo "using prepared filesystem $EFILE for $2"
67                         zcat "$EFILE" > $2 || exit -1
68                         sync
69                 else
70                         echo "creating new sparse filesystem on $2"
71                         dd if=/dev/zero of=$2 bs=1k seek=$3 count=1 1>&2 || exit -1
72                         $MKFS $MKFSOPT -F $2 1>&2 || exit -1
73                 fi
74                 LOOPDEV=`next_loop_dev`
75                 losetup ${LOOPDEV} $2 1>&2 || exit -1
76         fi
77 }
78
79 # Set up to use an existing filesystem.  We take the same parameters as
80 # new_fs, even though we only use the <file> parameter, to make it easy
81 # to convert between new_fs and old_fs in testing scripts.
82 old_fs () {
83         [ -e $2 ] || exit -1
84
85         if [ -b "$2" ]; then
86                 LOOPDEV=$2      # Not really a loop device
87         else
88                 LOOPDEV=`next_loop_dev`
89                 losetup ${LOOPDEV} $2 1>&2 || exit -1
90         fi
91 }
92
93 list_mods() {
94         $DBGCTL modules > $R/tmp/ogdb
95         echo "The GDB module script is in /tmp/ogdb"
96         [ "$DEBUG_WAIT" = "yes" ] && echo -n "Press ENTER to continue" && read
97 }
98
99 # We need at least one setup file to be given.  It can be passed on
100 # the command-line, or it can be found in the home directory, or it
101 # can even be sourced into the current shell environment.
102 setup_opts() {
103         DEF=$HOME/.lustretestrc
104         [ -r $DEF ] && . $DEF && SETUP=y
105
106         for CFG in "$@" ; do
107                 case $CFG  in
108                 *.cfg) [ -r "$CFG" ] && . $CFG && SETUP=y ;;
109                 *) echo "unknown option '$CFG'" 1>&2
110                 esac
111         done
112
113         if [ "$SETUP" != "y" ]; then
114                 echo "error: no config file on command-line and no $DEF" 1>&2
115                 exit -1
116         fi
117         
118         [ -z "$MDS_RSH" ] && MDS_RSH="eval"
119         [ -z "$OST_RSH" ] && OST_RSH="eval"
120         [ -z "$OSC_RSH" ] && OSC_RSH="eval"
121 }
122
123 do_insmod() {
124         MODULE=$LUSTRE/$1
125
126         [ "$MODULE" ] || fail "usage: $0 <module>"
127         [ -f $MODULE ] || fail "$0: module '$MODULE' not found"
128
129         lsmod | grep -q `basename $MODULE` || insmod $MODULE || exit -1
130 }
131
132 setup_portals() {
133         if [ -z "$NETWORK" -o -z "$LOCALHOST" -o -z "$SERVER" ]; then
134                 echo "$0: NETWORK or LOCALHOST or SERVER is not set" 1>&2
135                 exit -1
136         fi
137
138         if [ "$LOCALHOST" == "$SERVER" ]; then
139                 DLM=localhost
140         else
141                 DLM=$SERVER
142         fi
143
144         [ -c /dev/portals ] || mknod /dev/portals c 10 240
145
146         insmod $PORTALS/linux/oslib/portals.o || exit -1
147
148         case $NETWORK in
149         elan)   [ "$PORT" ] && fail "$0: NETWORK is elan but PORT is set"
150                 insmod $PORTALS/linux/qswnal/kqswnal.o
151                 ;;
152         tcp)    [ "$PORT" ] || fail "$0: NETWORK is tcp but PORT is not set"
153                 insmod $PORTALS/linux/socknal/ksocknal.o || exit -1
154                 $ACCEPTOR $PORT
155                 ;;
156         *)      fail "$0: unknown NETWORK '$NETWORK'" ;;
157         esac
158
159         $PTLCTL <<- EOF
160         setup $NETWORK
161         mynid $LOCALHOST
162         connect $SERVER $PORT
163         add_uuid self
164         add_uuid mds
165         add_uuid ost
166         connect $DLM $PORT
167         add_uuid ldlm
168         quit
169         EOF
170 }
171
172 setup_lustre() {
173         [ -c /dev/obd ] || mknod /dev/obd c 10 241
174
175         do_insmod class/obdclass.o
176         do_insmod rpc/ptlrpc.o
177         do_insmod ldlm/ldlm.o
178         do_insmod mds/mds.o
179         do_insmod obdecho/obdecho.o
180         do_insmod ext2obd/obdext2.o
181         do_insmod filterobd/obdfilter.o
182         do_insmod ost/ost.o
183         do_insmod osc/osc.o
184         do_insmod mdc/mdc.o
185         do_insmod llight/llite.o
186
187         list_mods
188
189         $OBDCTL <<- EOF || return $rc
190         newdev
191         attach ptlrpc RPCDEV
192         setup
193         quit
194         EOF
195
196         [ -d /mnt/lustre ] || mkdir /mnt/lustre
197 }
198
199 setup_ldlm() {
200         [ -c /dev/portals ] || mknod /dev/portals c 10 240
201
202         insmod $PORTALS/linux/oslib/portals.o || exit -1
203
204         do_insmod class/obdclass.o
205         do_insmod rpc/ptlrpc.o
206         do_insmod ldlm/ldlm.o
207
208         DEBUG_WAIT=yes
209         list_mods
210 }
211
212 find_devno() {
213         if [ -z "$1" ]; then
214                 echo "usage: $0 <devname>" 1>&2
215                 return -1
216         fi
217
218         $OBDCTL name2dev $1
219 }
220
221 setup_mds() {
222         [ "$SETUP_MDS" = "y" ] || return 0
223
224         if [ -z "$MDSFS" -o -z "$MDSDEV" ]; then
225                 echo "error: setup_mds: MDSFS or MDSDEV unset" 1>&2
226                 return -1
227         fi
228
229         [ "$1" ] && DO_FS=$1
230         if [ "$DO_FS" != "new_fs" -a "$DO_FS" != "old_fs" ]; then
231                 echo "usage: setup_mds {new_fs|old_fs}" 1>&2
232                 return -1
233         fi
234
235         $DO_FS ${MDSFS} ${MDSDEV} ${MDSSIZE}
236         MDS=${LOOPDEV}
237
238         $OBDCTL <<- EOF
239         newdev
240         attach mds MDSDEV
241         setup ${MDS} ${MDSFS}
242         quit
243         EOF
244 }
245
246 setup_ost() {
247         [ "$SETUP_OST" = "y" ] || return 0
248
249         if [ -z "$OSTTYPE" ]; then
250                 echo "error: setup_ost: OSTTYPE unset" 1>&2
251                 return -1
252         fi
253
254         case $OSTTYPE in
255         obdecho)        OBD=
256                         OBDARG=
257                         NEED_FS=n
258                 ;;
259         obdext2)        OBDARG=
260                         NEED_FS=y
261                 ;;
262         obdfilter)      OBDARG=$OSTFS
263                         NEED_FS=y
264                 ;;
265         *)      echo "error: setup_ost: unknown OSTTYPE '$OSTTYPE'" 1>&2
266                 return -1
267                 ;;
268         esac
269
270         if [ "$NEED_FS" = "y" ]; then
271                 [ "$1" ] && DO_FS=$1
272                 if [ -z "$OSTFS" -o -z "$OSTDEV" ]; then
273                         echo "error: setup_ost: OSTFS or OSTDEV unset" 1>&2
274                         return -1
275                 fi
276
277                 if [ "$DO_FS" != "new_fs" -a "$DO_FS" != "old_fs" ]; then
278                         echo "usage: setup_ost {new_fs|old_fs}" 1>&2
279                         return -1
280                 fi
281
282                 $DO_FS ${OSTFS} ${OSTDEV} ${OSTSIZE}
283                 OBD=${LOOPDEV}
284         fi
285
286         $OBDCTL <<- EOF
287         newdev
288         attach ${OSTTYPE} OBDDEV
289         setup ${OBD} ${OBDARG}
290         newdev
291         attach ost OSTDEV
292         setup \$OBDDEV
293         quit
294         EOF
295 }
296
297 setup_server() {
298         setup_mds $1 && setup_ost $1
299 }
300
301 setup_osc() {
302         [ "$SETUP_OSC" != "y" ] && return 0
303
304         $OBDCTL <<- EOF || return $rc
305         newdev
306         attach osc OSCDEV
307         setup -1
308         quit
309         EOF
310 }
311
312 setup_mount() {
313         [ "$SETUP_MOUNT" != "y" ] && return 0
314
315         [ "$OSCMT" ] || fail "error: $0: OSCMT unset"
316
317         [ ! -d $OSCMT ] && mkdir $OSCMT
318         mount -t lustre_lite -o device=`find_devno OSCDEV` none $OSCMT
319 }
320
321 setup_client() {
322         setup_osc && setup_mount
323 }
324
325 DEBUG_ON="echo 0xffffffff > /proc/sys/portals/debug"
326 DEBUG_OFF="echo 0 > /proc/sys/portals/debug"
327
328 debug_server_off() {
329         [ "$MDS_RSH" ] && echo "Turn OFF debug on MDS" && $MDS_RSH "$DEBUG_OFF"
330         [ "$OST_RSH" ] && echo "Turn OFF debug on OST" && $OST_RSH "$DEBUG_OFF"
331 }
332
333 debug_server_on() {
334         [ "$MDS_RSH" ] && echo "Turn ON debug on MDS" && $MDS_RSH "$DEBUG_ON"
335         [ "$OST_RSH" ] && echo "Turn ON debug on OST" && $OST_RSH "$DEBUG_ON"
336 }
337
338 debug_client_off() {
339         echo "Turning OFF debug on client" && $OSC_RSH "$DEBUG_OFF"
340 }
341
342 debug_client_on() {
343         echo "Turning ON debug on client" && $OSC_RSH "$DEBUG_ON"
344 }
345
346 cleanup_portals() {
347         $PTLCTL <<- EOF
348         setup tcp
349         disconnect
350         del_uuid self
351         del_uuid mds
352         del_uuid ost
353         del_uuid ldlm
354         quit
355         EOF
356
357         rmmod kqswnal
358         rmmod ksocknal
359         rmmod portals
360 }
361
362 cleanup_lustre() {
363         killall acceptor
364
365         losetup -d ${LOOP}0
366         losetup -d ${LOOP}1
367         losetup -d ${LOOP}2
368
369         rmmod llite
370         rmmod mdc
371
372         rmmod mds
373         rmmod ost
374         rmmod osc
375         rmmod obdecho
376         rmmod obdfilter
377         rmmod obdext2
378
379         rmmod ldlm
380         rmmod ptlrpc
381         rmmod obdclass
382 }
383
384 cleanup_mds() {
385         [ "$SETUP" -a -z "$SETUP_MDS" ] && return 0
386
387         MDSDEVNO=`find_devno MDSDEV`
388         if [ "$MDSDEVNO" ]; then
389                 $OBDCTL <<- EOF
390                 device $MDSDEVNO
391                 cleanup
392                 detach
393                 quit
394                 EOF
395         fi
396 }
397
398 cleanup_ost() {
399         [ "$SETUP" -a -z "$SETUP_OST" ] && return 0
400
401         OSTDEVNO=`find_devno OSTDEV`
402         if [ "$OSTDEVNO" ]; then
403                 $OBDCTL <<- EOF
404                 device $OSTDEVNO
405                 cleanup
406                 detach
407                 quit
408                 EOF
409         fi
410
411         OBDDEVNO=`find_devno OBDDEV`
412         if [ "$OBDDEVNO" ]; then
413                 $OBDCTL <<- EOF
414                 device $OBDDEVNO
415                 cleanup
416                 detach
417                 quit
418                 EOF
419         fi
420 }
421
422 cleanup_server() {
423         cleanup_ost && cleanup_mds
424 }
425
426 cleanup_mount() {
427         [ "$SETUP" -a -z "$SETUP_MOUNT" ] && return 0
428
429         [ "$OSCMT" ] || OSCMT=/mnt/lustre
430         if [ "`mount | grep $OSCMT`" ]; then
431                 umount $OSCMT || fail "unable to unmount $OSCMT"
432         fi
433 }
434
435 cleanup_osc() {
436         [ "$SETUP" -a -z "$SETUP_OSC" ] && return 0
437
438         OSCDEVNO=`find_devno OSCDEV`
439         if [ "$OSCDEVNO" ]; then
440                 $OBDCTL <<- EOF
441                 device $OSCDEVNO
442                 cleanup
443                 detach
444                 quit
445                 EOF
446         fi
447 }
448
449 cleanup_rpc() {
450         RPCDEVNO=`find_devno RPCDEV`
451         if [ "$RPCDEVNO" ]; then
452                 $OBDCTL <<- EOF
453                 device $RPCDEVNO
454                 cleanup
455                 detach
456                 quit
457                 EOF
458         fi
459 }
460
461 cleanup_client() {
462         cleanup_mount && cleanup_osc && cleanup_rpc
463 }
464
465 fail() { 
466     echo "ERROR: $1" 1>&2
467     [ $2 ] && RC=$2 || RC=1
468     exit $RC
469 }