Whamcloud - gitweb
Add slab patches to chaos patch.
[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../../lustre
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 do_insmod() {
25         MODULE=$1
26         BASE=`echo $MODULE | sed -e "s^.*/^^" -e "s/\.o$//"`
27
28         [ "$MODULE" ] || fail "usage: $0 <module>"
29         [ -f $MODULE ] || echo "$0: module '$MODULE' not found" 1>&2
30         lsmod | grep -q "\<$BASE\>" && return 0
31         insmod $MODULE
32 }
33
34 # Return the next unused loop device on stdout and in the $LOOPDEV
35 # environment variable.
36 next_loop_dev() {
37         NEXT=
38         while [ -b ${LOOP}${LOOPNUM} ]; do
39                 LOOPDEV=${LOOP}${LOOPNUM}
40                 losetup ${LOOPDEV} > /dev/null 2>&1 || NEXT=${LOOPDEV}
41                 LOOPNUM=`expr ${LOOPNUM} + 1`
42                 [ "$NEXT" ] && echo ${NEXT} && break
43         done
44 }
45
46 # Create a new filesystem.  If we are using a loopback device, we check
47 # for existing "template" filesystems instead of creating a new one,
48 # because it is _much_ faster to gunzip the empty filesystem instead of
49 # creating a new one from scratch.  Conversely, if we are creating a
50 # filesystem on a device we use mkfs, because that only writes sparsely
51 # to the device.  The empty filesystems are also highly compressed (1000:1)
52 # so they don't take too much space.
53 #
54 new_fs_usage() {
55         echo "new_fs <fstype> {device | file} [size]" 1>&2
56         exit -1
57 }
58 new_fs () {
59         EFILE="$1_$3.gz"
60         MKFS="mkfs.$1"
61         MKFSOPT="-b 4096"
62
63         [ "$1" = "ext3" ] && MKFS="mkfs.ext2 -j"
64         if [ "$1" = "extN" ]; then
65                 MKFS="mkfs.ext2 -j"
66                 EFILE="ext3_$3.gz"
67         fi
68
69         if [ -b "$2" ]; then
70                 [ $# -lt 2 -o $# -gt 3 ] && new_fs_usage
71
72                 PM="/proc/mounts"
73                 [ -r "$PM" ] || PM="/etc/mtab"
74
75                 grep "$2 " $PM 1>&2 && echo "$0: $2 is in $PM!" 1>&2 && exit -1
76
77                 $MKFS $MKFSOPT $2 $3 || exit -1
78                 LOOPDEV=$2      # Not really a loop device
79         else
80                 [ $# -ne 3 ] && new_fs_usage
81
82                 if [ -r "$EFILE" ]; then
83                         echo "using prepared filesystem $EFILE for $2"
84                         zcat "$EFILE" > $2 || exit -1
85                         sync
86                 else
87                         echo "creating new sparse filesystem on $2"
88                         dd if=/dev/zero of=$2 bs=1k seek=$3 count=1 1>&2 || exit -1
89                         $MKFS $MKFSOPT -F $2 1>&2 || exit -1
90                 fi
91                 LOOPDEV=`next_loop_dev`
92                 losetup ${LOOPDEV} $2 1>&2 || exit -1
93         fi
94
95         # Enable hash-indexed directories for extN filesystems
96         [ "$1" = "extN" ] && echo "feature FEATURE_C5" | debugfs -w $2
97 }
98
99 # Set up to use an existing filesystem.  We take the same parameters as
100 # new_fs, even though we only use the <fstype> and <file> parameters, to
101 # make it easy to convert between new_fs and old_fs in testing scripts.
102 old_fs () {
103         [ -e $2 ] || exit -1
104
105         if [ -b "$2" ]; then
106                 LOOPDEV=$2      # Not really a loop device
107         else
108                 LOOPDEV=`next_loop_dev`
109                 losetup ${LOOPDEV} $2 1>&2 || exit -1
110         fi
111 }
112
113 list_mods() {
114         $DBGCTL modules > $R/tmp/ogdb
115         echo "The GDB module script is in $R/tmp/ogdb"
116         [ "$DEBUG_WAIT" = "yes" ] && echo -n "Press ENTER to continue" && read
117 }
118
119 # We need at least one setup file to be given.  It can be passed on
120 # the command-line, or it can be found in the home directory, or it
121 # can even be sourced into the current shell environment.
122 setup_opts() {
123         DEF=$HOME/.lustretestrc
124         [ -r $DEF ] && . $DEF && SETUP=y
125
126         for CFG in "$@" ; do
127                 case $CFG  in
128                 *.cfg) [ -r "$CFG" ] && . $CFG && SETUP=y ;;
129                 *) echo "unknown option '$CFG'" 1>&2
130                 esac
131         done
132
133         if [ "$SETUP" != "y" ]; then
134                 echo "error: no config file on command-line and no $DEF" 1>&2
135                 exit -1
136         fi
137         
138         [ -z "$MDS_RSH" ] && MDS_RSH="eval"
139         [ -z "$OST_RSH" ] && OST_RSH="eval"
140         [ -z "$OSC_RSH" ] && OSC_RSH="eval"
141 }
142
143 setup_portals() {
144         if grep -q portals /proc/modules; then
145                 echo "$0: portals already appears to be set up, skipping"
146                 return 0
147         fi
148
149         if [ -z "$NETWORK" -o -z "$LOCALHOST" -o -z "$SERVER" ]; then
150                 echo "$0: NETWORK or LOCALHOST or SERVER is not set" 1>&2
151                 exit -1
152         fi
153
154         [ -z "$OSTNODE" ] && OSTNODE=$SERVER
155         [ -z "$MDSNODE" ] && MDSNODE=$SERVER
156
157         if [ -z "$DLM" ]; then
158                 if [ "$LOCALHOST" == "$SERVER" ]; then
159                         DLM=localhost
160                 else
161                         DLM=$SERVER
162                 fi
163         fi
164
165         [ -c /dev/portals ] || mknod /dev/portals c 10 240
166
167         do_insmod $PORTALS/linux/oslib/portals.o || exit -1
168
169         case $NETWORK in
170         elan)   [ "$PORT" ] && fail "$0: NETWORK is elan but PORT is set"
171                 do_insmod $PORTALS/linux/qswnal/kqswnal.o || exit -1
172                 ;;
173         tcp)    [ "$PORT" ] || fail "$0: NETWORK is tcp but PORT is not set"
174                 do_insmod $PORTALS/linux/socknal/ksocknal.o || exit -1
175                 $ACCEPTOR $PORT
176                 ;;
177         *)      fail "$0: unknown NETWORK '$NETWORK'" ;;
178         esac
179
180         $PTLCTL <<- EOF
181         setup $NETWORK
182         mynid $LOCALHOST
183         connect $MDSNODE $PORT
184         add_uuid $MDSNODE
185         connect $OSTNODE $PORT
186         add_uuid $OSTNODE
187         connect $DLM $PORT
188         add_uuid $DLM
189         add_uuid self
190         quit
191         EOF
192 }
193
194 setup_lustre() {
195         [ -c /dev/obd ] || mknod /dev/obd c 10 241
196
197         do_insmod $LUSTRE/obdclass/obdclass.o || exit -1
198         do_insmod $LUSTRE/ptlrpc/ptlrpc.o || exit -1
199         do_insmod $LUSTRE/ldlm/ldlm.o || exit -1
200         do_insmod $LUSTRE/extN/extN.o || \
201                 echo "info: can't load extN.o module, not fatal if using ext3"
202         do_insmod $LUSTRE/mds/mds.o || exit -1
203         #do_insmod $LUSTRE/mds/mds_ext2.o || exit -1
204         #do_insmod $LUSTRE/mds/mds_ext3.o || exit -1
205         do_insmod $LUSTRE/mds/mds_extN.o || \
206                 echo "info: can't load mds_extN.o module, needs extN.o"
207         do_insmod $LUSTRE/obdecho/obdecho.o || exit -1
208         #do_insmod $LUSTRE/obdext2/obdext2.o || exit -1
209         do_insmod $LUSTRE/obdfilter/obdfilter.o || exit -1
210         do_insmod $LUSTRE/ost/ost.o || exit -1
211         do_insmod $LUSTRE/osc/osc.o || exit -1
212         do_insmod $LUSTRE/mdc/mdc.o || exit -1
213         do_insmod $LUSTRE/llite/llite.o || exit -1
214
215         echo "$R/tmp/lustre-log" > /proc/sys/portals/debug_path
216         list_mods
217
218         if $OBDCTL name2dev RPCDEV > /dev/null 2>&1; then
219                 echo "$0: RPCDEV is already configured, skipping"
220                 return 0
221         fi
222
223         $OBDCTL <<- EOF || return $?
224         newdev
225         attach ptlrpc RPCDEV
226         setup
227         quit
228         EOF
229
230         [ -d /mnt/lustre ] || mkdir /mnt/lustre
231 }
232
233 setup_ldlm() {
234         [ "$SETUP_LDLM" = "y" ] || return 0
235
236         [ -c /dev/portals ] || mknod /dev/portals c 10 240
237
238         $OBDCTL <<- EOF || return $?
239         newdev
240         attach ldlm LDLMDEV
241         setup
242         quit
243         EOF
244
245 }
246
247 find_devno() {
248         if [ -z "$1" ]; then
249                 echo "usage: $0 <devname>" 1>&2
250                 return -1
251         fi
252
253         $OBDCTL name2dev $1
254 }
255
256 setup_mds() {
257         [ "$SETUP_MDS" = "y" ] || return 0
258
259         if [ -z "$MDSFS" -o -z "$MDSDEV" ]; then
260                 echo "error: setup_mds: MDSFS or MDSDEV unset" 1>&2
261                 return -1
262         fi
263
264         [ "$1" ] && DO_FS=$1
265         if [ "$DO_FS" != "new_fs" -a "$DO_FS" != "old_fs" ]; then
266                 echo "usage: setup_mds {new_fs|old_fs}" 1>&2
267                 return -1
268         fi
269
270         if $OBDCTL name2dev MDSDEV > /dev/null 2>&1; then
271                 echo "$0: MDSDEV is already configured"
272                 return 0
273         fi
274
275         $DO_FS ${MDSFS} ${MDSDEV} ${MDSSIZE}
276         MDS=${LOOPDEV}
277
278         $OBDCTL <<- EOF || return $?
279         newdev
280         attach mds MDSDEV
281         setup ${MDS} ${MDSFS}
282         quit
283         EOF
284 }
285
286 setup_ost() {
287         [ "$SETUP_OST" = "y" ] || return 0
288
289         if [ -z "$OSTTYPE" ]; then
290                 echo "error: setup_ost: OSTTYPE unset" 1>&2
291                 return -1
292         fi
293
294         case $OSTTYPE in
295         obdecho)        OBD=
296                         OBDARG=
297                         NEED_FS=n
298                 ;;
299         obdext2)        OBDARG=
300                         NEED_FS=y
301                 ;;
302         obdfilter)      OBDARG=$OSTFS
303                         NEED_FS=y
304                 ;;
305         *)      echo "error: setup_ost: unknown OSTTYPE '$OSTTYPE'" 1>&2
306                 return -1
307                 ;;
308         esac
309
310         if $OBDCTL name2dev OBDDEV > /dev/null 2>&1; then
311                 echo "$0: OBDDEV is already configured"
312                 return 0
313         fi
314
315         if [ "$NEED_FS" = "y" ]; then
316                 [ "$1" ] && DO_FS=$1
317                 if [ -z "$OSTFS" -o -z "$OSTDEV" ]; then
318                         echo "error: setup_ost: OSTFS or OSTDEV unset" 1>&2
319                         return -1
320                 fi
321
322                 if [ "$DO_FS" != "new_fs" -a "$DO_FS" != "old_fs" ]; then
323                         echo "usage: setup_ost {new_fs|old_fs}" 1>&2
324                         return -1
325                 fi
326
327                 $DO_FS ${OSTFS} ${OSTDEV} ${OSTSIZE}
328                 OBD=${LOOPDEV}
329         fi
330
331         $OBDCTL <<- EOF || return $?
332         newdev
333         attach ${OSTTYPE} OBDDEV
334         setup ${OBD} ${OBDARG}
335         quit
336         EOF
337         $OBDCTL <<- EOF || return $?
338         newdev
339         attach ost OSTDEV
340         setup \$OBDDEV
341         quit
342         EOF
343 }
344
345 setup_server() {
346         setup_mds $1 && setup_ost $1
347 }
348
349 setup_osc() {
350         set -vx
351         [ "$SETUP_OSC" != "y" ] && return 0
352         [ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
353
354         for THEOSC in $OSC_NAMES ; do 
355             OSCDEVNO=`find_devno $THEOSC`
356             if $OBDCTL name2dev $THEOSC > /dev/null 2>&1; then
357                 echo "$0: OSCDEV is already configured"
358                 return 0
359             fi
360
361         $OBDCTL <<- EOF || return $rc
362         newdev
363         attach osc $THEOSC
364         setup OSTDEV $OSTNODE
365         quit
366         EOF
367         done
368 }
369
370 setup_mdc() {
371         set -vx
372         [ "$SETUP_MDC" != "y" ] && return 0
373         [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
374
375         for THEMDC in $MDC_NAMES ; do 
376             MDCDEVNO=`find_devno $THEMDC`
377         if $OBDCTL name2dev $THEMDC > /dev/null 2>&1; then
378                 echo "$0: MDCDEV is already configured"
379                 return 0
380         fi
381
382         $OBDCTL <<- EOF || return $?
383         newdev
384         attach mdc $THEMDC
385         setup MDSDEV $MDSNODE
386         quit
387         EOF
388         done
389 }
390
391
392 setup_mount() {
393         set -vx
394         [ "$SETUP_MOUNT" != "y" ] && return 0
395         [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
396         [ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
397         [ -z "$MOUNT_LIST" -a "$OSCMT" ] && MOUNT_LIST="MT" && MT="$OSCMT OSCDEV MDCDEV"
398
399         [ "$MOUNT_LIST" ] || fail "error: $0: MOUNT_LIST unset"
400
401         for THEMOUNT in $MOUNT_LIST; do
402             eval "echo \$$THEMOUNT" | while read MTPT THEOSC THEMDC; do
403                 if mount | grep -q $MTPT; then
404                     echo "$0: $MTPT is already mounted"
405                     return 0
406                 fi
407
408                 [ ! -d $MTPT ] && mkdir $MTPT
409                 echo mount -t lustre_lite -o ost=`find_devno $THEOSC`,mds=`find_devno $THEMDC` none $MTPT
410                 mount -t lustre_lite -o ost=`find_devno $THEOSC`,mds=`find_devno $THEMDC` none $MTPT
411             done
412         done
413 }
414
415 setup_client() {
416         setup_osc && setup_mdc && setup_mount
417 }
418
419 DEBUG_ON="echo 0xffffffff > /proc/sys/portals/debug"
420 DEBUG_OFF="echo 0 > /proc/sys/portals/debug"
421
422 debug_server_off() {
423         [ "$MDS_RSH" ] && echo "Turn OFF debug on MDS" && $MDS_RSH "$DEBUG_OFF"
424         [ "$OST_RSH" ] && echo "Turn OFF debug on OST" && $OST_RSH "$DEBUG_OFF"
425 }
426
427 debug_server_on() {
428         [ "$MDS_RSH" ] && echo "Turn ON debug on MDS" && $MDS_RSH "$DEBUG_ON"
429         [ "$OST_RSH" ] && echo "Turn ON debug on OST" && $OST_RSH "$DEBUG_ON"
430 }
431
432 debug_client_off() {
433         echo "Turning OFF debug on client" && $OSC_RSH "$DEBUG_OFF"
434 }
435
436 debug_client_on() {
437         echo "Turning ON debug on client" && $OSC_RSH "$DEBUG_ON"
438 }
439
440 cleanup_portals() {
441         [ -z "$NETWORK" ] && NETWORK=tcp
442         $PTLCTL <<- EOF
443         setup $NETWORK
444         disconnect
445         del_uuid self
446         del_uuid $MDSNODE
447         del_uuid $OSTNODE
448         del_uuid $DLM
449         quit
450         EOF
451
452         rmmod kqswnal
453         rmmod ksocknal
454         rmmod portals
455 }
456
457 cleanup_lustre() {
458         killall acceptor
459
460         losetup -d ${LOOP}0
461         losetup -d ${LOOP}1
462         losetup -d ${LOOP}2
463
464         rmmod llite
465         rmmod mdc
466
467         rmmod mds_extN
468         rmmod mds_ext3
469         rmmod mds_ext2
470         rmmod mds
471         rmmod ost
472         rmmod osc
473         rmmod obdecho
474         rmmod obdfilter
475         rmmod obdext2
476         rmmod extN
477
478         rmmod ldlm
479         rmmod ptlrpc
480         rmmod obdclass
481 }
482
483 cleanup_ldlm() {
484         [ "$SETUP" -a -z "$SETUP_LDLM" ] && return 0
485
486         LDLMDEVNO=`find_devno LDLMDEV`
487         if [ "$LDLMDEVNO" ]; then
488                 $OBDCTL <<- EOF
489                 device $LDLMDEVNO
490                 cleanup
491                 detach
492                 quit
493                 EOF
494         fi
495 }
496
497 cleanup_mds() {
498         [ "$SETUP" -a -z "$SETUP_MDS" ] && return 0
499
500         MDSDEVNO=`find_devno MDSDEV`
501         if [ "$MDSDEVNO" ]; then
502                 $OBDCTL <<- EOF
503                 device $MDSDEVNO
504                 cleanup
505                 detach
506                 quit
507                 EOF
508         fi
509 }
510
511 cleanup_ost() {
512         [ "$SETUP" -a -z "$SETUP_OST" ] && return 0
513
514         OSTDEVNO=`find_devno OSTDEV`
515         if [ "$OSTDEVNO" ]; then
516                 $OBDCTL <<- EOF
517                 device $OSTDEVNO
518                 cleanup
519                 detach
520                 quit
521                 EOF
522         fi
523
524         OBDDEVNO=`find_devno OBDDEV`
525         if [ "$OBDDEVNO" ]; then
526                 $OBDCTL <<- EOF
527                 device $OBDDEVNO
528                 cleanup
529                 detach
530                 quit
531                 EOF
532         fi
533 }
534
535 cleanup_server() {
536         cleanup_ost && cleanup_mds
537 }
538
539 cleanup_mount() {
540         [ "$SETUP" -a -z "$SETUP_MOUNT" ] && return 0
541
542         [ "$OSCMT" ] || OSCMT=/mnt/lustre
543         for THEMOUNT in $OSCMT; do
544             if [ "`mount | grep $THEMOUNT`" ]; then
545                 umount $THEMOUNT || fail "unable to unmount $THEMOUNT"
546             fi
547         done
548 }
549
550 cleanup_osc() {
551         [ "$SETUP" -a -z "$SETUP_OSC" ] && return 0
552         [ "$OSC_NAMES" ] || OSC_NAMES=OSCDEV
553
554         for THEOSC in $OSC_NAMES ; do 
555             OSCDEVNO=`find_devno $THEOSC`
556             if [ "$OSCDEVNO" ]; then
557                 $OBDCTL <<- EOF
558                 device $OSCDEVNO
559                 cleanup
560                 detach
561                 quit
562                 EOF
563             fi
564         done
565 }
566
567 cleanup_mdc() {
568         [ "$SETUP" -a -z "$SETUP_MDC" ] && return 0
569         [ "$MDC_NAMES" ] || MDC_NAMES=MDCDEV
570
571         for THEMDC in $MDC_NAMES ; do 
572             MDCDEVNO=`find_devno $THEMDC`
573             if [ "$MDCDEVNO" ]; then
574                 $OBDCTL <<- EOF
575                 device $MDCDEVNO
576                 cleanup
577                 detach
578                 quit
579                 EOF
580             fi
581         done
582 }
583
584 cleanup_rpc() {
585         RPCDEVNO=`find_devno RPCDEV`
586         if [ "$RPCDEVNO" ]; then
587                 $OBDCTL <<- EOF
588                 device $RPCDEVNO
589                 cleanup
590                 detach
591                 quit
592                 EOF
593         fi
594 }
595
596 cleanup_client() {
597         cleanup_mount && cleanup_osc && cleanup_mdc && cleanup_rpc
598 }
599
600 fail() { 
601     echo "ERROR: $1" 1>&2
602     [ $2 ] && RC=$2 || RC=1
603     exit $RC
604 }