Whamcloud - gitweb
As long as we have lustre hack flags, let's at least compile with -O0,
[fs/lustre-release.git] / lustre / tests / sanity-gns.sh
1 #!/bin/bash
2 #
3 # Run select tests by setting ONLY, or as arguments to the script.
4 # Skip specific tests by setting EXCEPT.
5 #
6 # e.g. ONLY="22 23" or ONLY="`seq 32 39`" or EXCEPT="31"
7 set -e
8
9 ONLY=${ONLY:-"$*"}
10 ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"1b 1c"}
11 [ "$ALWAYS_EXCEPT$EXCEPT" ] && echo "Skipping tests: $ALWAYS_EXCEPT $EXCEPT"
12
13 SRCDIR=`dirname $0`
14 export PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
15 export SECURITY=${SECURITY:-"null"}
16
17 TMP=${TMP:-/tmp}
18 FSTYPE=${FSTYPE:-ext3}
19
20 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
21 CREATETEST=${CREATETEST:-createtest}
22 LFS=${LFS:-lfs}
23 LSTRIPE=${LSTRIPE:-"$LFS setstripe"}
24 LFIND=${LFIND:-"$LFS find"}
25 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
26 LCTL=${LCTL:-lctl}
27 MCREATE=${MCREATE:-mcreate}
28 OPENFILE=${OPENFILE:-openfile}
29 OPENUNLINK=${OPENUNLINK:-openunlink}
30 TOEXCL=${TOEXCL:-toexcl}
31 TRUNCATE=${TRUNCATE:-truncate}
32 MUNLINK=${MUNLINK:-munlink}
33 SOCKETSERVER=${SOCKETSERVER:-socketserver}
34 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
35 IOPENTEST1=${IOPENTEST1:-iopentest1}
36 IOPENTEST2=${IOPENTEST2:-iopentest2}
37 PTLDEBUG=${PTLDEBUG:-0}
38
39 . krb5_env.sh
40
41 export NAME=${NAME:-local}
42
43 SAVE_PWD=$PWD
44
45 clean() {
46         echo -n "cln.."
47         sh llmountcleanup.sh > /dev/null || exit 20
48         I_MOUNTED=no
49 }
50 CLEAN=${CLEAN:-clean}
51
52 start() {
53         echo -n "mnt.."
54         sh llrmount.sh > /dev/null || exit 10
55         I_MOUNTED=yes
56         echo "done"
57 }
58 START=${START:-start}
59
60 log() {
61         echo "$*"
62         lctl mark "$*" 2> /dev/null || true
63 }
64
65 trace() {
66         log "STARTING: $*"
67         strace -o $TMP/$1.strace -ttt $*
68         RC=$?
69         log "FINISHED: $*: rc $RC"
70         return 1
71 }
72 TRACE=${TRACE:-""}
73
74 check_kernel_version() {
75         VERSION_FILE=/proc/fs/lustre/kernel_version
76         WANT_VER=$1
77         [ ! -f $VERSION_FILE ] && echo "can't find kernel version" && return 1
78         GOT_VER=`cat $VERSION_FILE`
79         [ $GOT_VER -ge $WANT_VER ] && return 0
80         log "test needs at least kernel version $WANT_VER, running $GOT_VER"
81         return 1
82 }
83
84 run_one() {
85         if ! cat /proc/mounts | grep -q $DIR; then
86                 $START
87         fi
88         echo $PTLDEBUG >/proc/sys/portals/debug 
89         log "== test $1: $2"
90         export TESTNAME=test_$1
91         test_$1 || error "test_$1: exit with rc=$?"
92         unset TESTNAME
93         pass
94         cd $SAVE_PWD
95         $CLEAN
96 }
97
98 build_test_filter() {
99         for O in $ONLY; do
100             eval ONLY_${O}=true
101         done
102         for E in $EXCEPT $ALWAYS_EXCEPT; do
103             eval EXCEPT_${E}=true
104         done
105 }
106
107 _basetest() {
108     echo $*
109 }
110
111 basetest() {
112     IFS=abcdefghijklmnopqrstuvwxyz _basetest $1
113 }
114
115 run_test() {
116          base=`basetest $1`
117          if [ "$ONLY" ]; then
118                  testname=ONLY_$1
119                  if [ ${!testname}x != x ]; then
120                         run_one $1 "$2"
121                         return $?
122                  fi
123                  testname=ONLY_$base
124                  if [ ${!testname}x != x ]; then
125                          run_one $1 "$2"
126                          return $?
127                  fi
128                  echo -n "."
129                  return 0
130         fi
131         testname=EXCEPT_$1
132         if [ ${!testname}x != x ]; then
133                  echo "skipping excluded test $1"
134                  return 0
135         fi
136         testname=EXCEPT_$base
137         if [ ${!testname}x != x ]; then
138                  echo "skipping excluded test $1 (base $base)"
139                  return 0
140         fi
141         run_one $1 "$2"
142         return $?
143 }
144
145 [ "$SANITYLOG" ] && rm -f $SANITYLOG || true
146
147 error() { 
148         log "FAIL: $@"
149         if [ "$SANITYLOG" ]; then
150                 echo "FAIL: $TESTNAME $@" >> $SANITYLOG
151         else
152                 exit 1
153         fi
154 }
155
156 pass() { 
157         echo PASS
158 }
159
160 MOUNT="`mount | awk '/^'$NAME' .* lustre_lite / { print $3 }'`"
161 if [ -z "$MOUNT" ]; then
162         sh llmount.sh
163         MOUNT="`mount | awk '/^'$NAME' .* lustre_lite / { print $3 }'`"
164         [ -z "$MOUNT" ] && error "NAME=$NAME not mounted"
165         I_MOUNTED=yes
166 fi
167
168 [ `echo $MOUNT | wc -w` -gt 1 ] && error "NAME=$NAME mounted more than once"
169
170 DIR=${DIR:-$MOUNT}
171 [ -z "`echo $DIR | grep $MOUNT`" ] && echo "$DIR not in $MOUNT" && exit 99
172
173 rm -rf $DIR/[Rdfs][1-9]*
174 build_test_filter
175
176 echo preparing for tests involving mounts
177 EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
178 touch $EXT2_DEV
179 mke2fs -j -F $EXT2_DEV 8000 >/dev/null 2>&1
180
181 find_free_loop() {
182     local LOOP_DEV=""
183     test -b /dev/loop0 && 
184         base="/dev/loop" || base="/dev/loop/"
185
186     for ((i=0;i<256;i++)); do
187         test -b $base$i || continue
188         
189         losetup $base$i >/dev/null 2>&1 || {
190             LOOP_DEV="$base$i"
191             break
192         }
193     done
194     echo $LOOP_DEV
195 }
196
197 setup_loop() {
198     local LOOP_DEV=$1
199     local LOOP_FILE=$2
200     
201     echo "preparing loop device $LOOP_DEV <-> $LOOP_FILE..."
202     cleanup_loop $LOOP_DEV $LOOP_FILE
203     
204     dd if=/dev/zero of=$LOOP_FILE bs=1M count=10 2>/dev/null || 
205         return $?
206
207     losetup $LOOP_DEV $LOOP_FILE || {
208         rc=$?
209         cleanup_loop $LOOP_DEV $LOOP_FILE
210         return $rc
211     }
212     
213     mke2fs -F $LOOP_DEV >/dev/null 2>&1 || {
214         rc=$?
215         cleanup_loop $LOOP_DEV $LOOP_FILE
216         echo "cannot create test ext2 fs on $LOOP_DEV"
217         return $?
218     }
219     return 0
220 }
221
222 cleanup_loop() {
223     local LOOP_DEV=$1
224     local LOOP_FILE=$2
225     
226     losetup -d $LOOP_DEV >/dev/null 2>&1
227     rm -fr $LOOP_FILE >/dev/null 2>&1
228 }
229
230 setup_upcall() {
231     local INJECTION=""
232     local UPCALL=$1
233     local MODE=$2
234     local LOG=$3
235     local BG=$4
236     
237     echo "generating upcall $UPCALL"
238
239     test "x$BG" = "xBG" && 
240         BG="&" || BG=""
241     
242     test "x$MODE" = "xDEADLOCK" &&
243         INJECTION="touch \$MNTPATH/file"
244     
245     cat > $UPCALL <<- EOF
246 #!/bin/sh
247
248 MOUNT=\`which mount 2>/dev/null\`
249 test "x\$MOUNT" = "x" && MOUNT="/bin/mount"
250
251 OPTIONS=\$1
252 MNTPATH=\$2
253
254 test "x\$OPTIONS" = "x" || "x\$MNTPATH" = "x" &&
255 exit 1
256
257 $INJECTION
258 \$MOUNT \$OPTIONS \$MNTPATH > $LOG 2>&1 $BG
259 exit \$?
260 EOF
261     chmod +x $UPCALL
262
263     echo "$UPCALL" > /proc/fs/lustre/llite/fs0/gns_upcall || return $?
264     echo "upcall:  $(cat /proc/fs/lustre/llite/fs0/gns_upcall)"
265
266     echo "======================== upcall script ==========================="
267     cat $UPCALL 2>/dev/null || return $?
268     echo "=================================================================="
269    
270     return 0
271 }
272
273 cleanup_upcall() {
274     local UPCALL=$1
275     rm -fr $UPCALL
276 }
277
278 show_log() {
279     local LOG=$1
280     
281     test -f $LOG && {
282         echo "======================== upcall log ==========================="
283         cat $LOG
284         echo "==============================================================="
285     }
286 }
287
288 sleep_on()
289 {
290     local TIMOUT=$1
291     local TICK=$2
292     
293     local sleep_time=$TIMOUT
294     let sleep_time+=$TICK*2
295     sleep $sleep_time
296 }
297
298 check_mnt()
299 {
300     local OBJECT=$1
301     local MODE=$2
302     local TIMOUT=$3
303     local TICK=$4
304     
305     local res=0
306     local mnt=""
307     local p=""
308     local op
309     
310     test $MODE -eq 1 && op="mount" || op="umount"
311     echo -n "checking for $op $OBJECT: "
312
313     test $MODE -eq 0 && sleep_on $TIMOUT $TICK
314
315     OBJECT="`echo $OBJECT | sed 's/\/*$//'`"
316     mnt="`cat /proc/mounts | grep $OBJECT | awk '{print \$2}'`"
317     test -z "$mnt" && {
318         res=0
319     } || {
320         for p in $mnt; do
321             test "x$p" = "x$OBJECT" && {
322                 res=1
323                 break
324             }
325         done
326     }
327     
328     if test $MODE -eq 0; then
329         test $res -eq 1 && {
330             echo "failed"
331             return 1
332         }
333     else
334         test $res -eq 0 && {
335             echo "failed"
336             return 1
337         }
338     fi
339
340     echo "success"    
341     return 0
342 }
343
344 check_gns() {
345     local OBJECT1=$1
346     local OBJECT2=$2
347     local TIMOUT=$3
348     local TICK=$4
349     local MODE=$5
350     local OP=$6
351     local CHECK=$7
352     
353     local OLD_PWD=$(pwd)
354     echo "testing mount on $OP against $OBJECT1 in $MODE mode"
355     
356     case "$MODE" in
357         GENERIC)
358             case "$OP" in
359                 OPEN)
360                     echo -n "test data" > $OBJECT1/test_file1 >/dev/null 2>&1
361                     ;;
362                 LIST)
363                     ls -la $OBJECT1/
364                     ;;
365                 CHDIR)
366                     cd $OBJECT1 || return $?
367                     ;;
368                 *)
369                     echo "invalid testing operation $OP"
370                     return 1
371             esac
372             ;;
373         CONCUR1)
374             local i=1
375             local nr=20
376         
377             for ((;i<=$nr;i++)); do 
378                 case "$OP" in
379                     OPEN)
380                         echo -n "test data" > $OBJECT1/test_file$i >/dev/null 2>&1 &
381                         ;;
382                     LIST)
383                         ls -la $OBJECT1/
384                         ;;
385                     CHDIR)
386                         cd $OBJECT1 >/dev/null 2>&1 &
387                         ;;
388                     *)
389                         echo "invalid testing operation $OP"
390                         return 1
391                 esac
392             done
393         
394             wait
395             
396             local RETVAL=$?
397             
398             [ $RETVAL -eq 0 ] || 
399                 return $RETVAL
400             ;;
401         CONCUR2)
402             test "x$OBJECT2" = "x" && {
403                 echo "not defined object2 for concurrent2 testing"
404                 return 1
405             }
406             case "$OP" in
407                 OPEN)
408                     echo -n "test data" > $OBJECT1/test_file1 >/dev/null 2>&1 &
409                     echo -n "test data" > $OBJECT2/test_file1 >/dev/null 2>&1 &
410                     ;;
411                 LIST)
412                     ls -la $OBJECT1/
413                     ls -la $OBJECT2/
414                     ;;
415                 CHDIR)
416                     cd $OBJECT1 >/dev/null 2>&1 &
417                     cd $OBJECT2 >/dev/null 2>&1 &
418                     ;;
419                 *)
420                     echo "invalid testing operation $OP"
421                     return 1
422             esac
423             
424             wait
425             
426             local RETVAL=$?
427             
428             [ $RETVAL -eq 0 ] || 
429                 return $RETVAL
430             ;;
431         CONCUR3)
432             local i=1
433             local nr=20
434             
435             for ((;i<$nr;i++)); do
436                 case "$OP" in
437                     OPEN)
438                         touch $OBJECT1/file$i &
439                         echo -n "test data" > $OBJECT1/test_file$i >/dev/null 2>&1 &
440                         mkdir $OBJECT1/dir$i &
441                         ;;
442                     LIST)
443                         touch $OBJECT1/file &
444                         ls -la $OBJECT1/ &
445                         mkdir $OBJECT1/dir$i &
446                         ;;
447                     CHDIR)
448                         touch $OBJECT1/file$i &
449                         cd $OBJECT1 >/dev/null 2>&1 &
450                         mkdir $OBJECT1/dir$i &
451                         ;;
452                     *)
453                         echo "invalid testing operation $OP"
454                         return 1
455                 esac
456             done
457
458             wait
459             
460             local RETVAL=$?
461             
462             [ $RETVAL -eq 0 ] || 
463                 return $RETVAL
464             ;;
465         *)
466             echo "invalid testing mode $MODE"
467             return 1
468     esac
469
470     test "x$OP" = "xCHDIR" && cd $OLD_PWD
471
472     test $CHECK -eq 1 && {
473         # check if mount is here
474         check_mnt $OBJECT1 1 0 0 || return 1
475         if test "x$MODE" = "xCONCUR2"; then
476             check_mnt $OBJECT2 1 0 0 || return 1
477         fi
478     
479         # wait for $TIMEOUT and check for mount, it should go
480         check_mnt $OBJECT1 0 $TIMOUT $TICK || return 2
481         if test "x$MODE" = "xCONCUR2"; then
482             check_mnt $OBJECT2 0 $TIMOUT $TICK || return 2
483         fi
484     }
485     
486     return 0
487 }
488
489 setup_object() {
490     local OBJPATH=$1
491     local OBJECT=$2
492     local CONTENT=$3
493     
494     echo "preparing mount object at $OBJPATH..."
495     
496     mkdir -p $OBJPATH || return $?
497     echo -n $CONTENT > $OBJPATH/$OBJECT || return $?
498     
499     echo "======================== mount object ==========================="
500     cat $OBJPATH/$OBJECT
501     echo ""
502     echo "================================================================="
503     
504     chmod u+s $OBJPATH
505     return $?
506 }
507
508 cleanup_object() {
509     local OBJPATH=$1
510
511     chmod u-s $OBJPATH
512     umount $OBJPATH >/dev/null 2>&1
513     rm -fr $OBJPATH >/dev/null 2>&1
514 }
515
516 setup_gns() {
517     local OBJECT=$1
518     local TIMOUT=$2
519     local TICK=$3
520
521     echo "setting up GNS timeouts and mount object..."
522
523     echo "$OBJECT" > /proc/fs/lustre/llite/fs0/gns_object_name || error
524     echo "$TIMOUT" > /proc/fs/lustre/llite/fs0/gns_timeout || error
525     echo "$TICK" > /proc/fs/lustre/llite/fs0/gns_tick || error
526
527     echo ""
528     echo "timeout: $(cat /proc/fs/lustre/llite/fs0/gns_timeout)s"
529     echo "object:  $(cat /proc/fs/lustre/llite/fs0/gns_object_name)"
530     echo "tick:    $(cat /proc/fs/lustre/llite/fs0/gns_tick)s"
531     echo ""
532
533 }
534
535 enable_gns()
536 {
537     echo "1" > /proc/fs/lustre/llite/fs0/gns_enabled
538     test "x$(cat /proc/fs/lustre/llite/fs0/gns_enabled)" = "x1" || 
539         error "cannot enable GNS"
540 }
541
542 disable_gns()
543 {
544     echo "0" > /proc/fs/lustre/llite/fs0/gns_enabled
545     test "x$(cat /proc/fs/lustre/llite/fs0/gns_enabled)" = "x0" || 
546         error "cannot disable GNS"
547 }
548
549 test_1a() {
550     local LOOP_DEV=$(find_free_loop 2>/dev/null)
551     local UPCALL="$TMP/gns-upcall-1a.sh"
552     local LOOP_FILE="$TMP/gns_loop_1a"
553     local LOG="$TMP/gns-log"
554     local OBJECT=".mntinfo"
555     local TIMOUT=5
556     local TICK=1
557
558     disable_gns
559
560     test "x$LOOP_DEV" != "x" && test -b $LOOP_DEV ||
561         error "can't find free loop device"
562
563     setup_loop $LOOP_DEV $LOOP_FILE || 
564         error
565
566     setup_upcall $UPCALL GENERIC $LOG FG || {
567         cleanup_loop $LOOP_DEV $LOOP_FILE
568         error
569     }
570
571     setup_gns $OBJECT $TIMOUT $TICK || {
572         cleanup_loop $LOOP_DEV $LOOP_FILE
573         error
574     }
575     
576     setup_object $DIR/gns_test_1a $OBJECT "-t ext2 $LOOP_DEV" || {
577         cleanup_loop $LOOP_DEV $LOOP_FILE
578         error
579     }
580
581     enable_gns
582
583     echo ""
584     echo "testing GNS with GENERIC upcall 3 times on the row"
585     
586     for ((i=0;i<3;i++)); do
587         check_gns $DIR/gns_test_1a $DIR/gns_test_1a $TIMOUT $TICK GENERIC OPEN 1 || {
588             disable_gns
589             show_log $LOG
590             cleanup_object $DIR/gns_test_1a
591             cleanup_loop $LOOP_DEV $LOOP_FILE
592             error
593         }
594     done
595     
596     for ((i=0;i<3;i++)); do
597         check_gns $DIR/gns_test_1a $DIR/gns_test_1a $TIMOUT $TICK GENERIC CHDIR 1 || {
598             disable_gns
599             show_log $LOG
600             cleanup_object $DIR/gns_test_1a
601             cleanup_loop $LOOP_DEV $LOOP_FILE
602             error
603         }
604     done
605     
606     disable_gns
607     cleanup_object $DIR/gns_test_1a
608     cleanup_loop $LOOP_DEV $LOOP_FILE
609
610     return 0
611 }
612
613 run_test 1a " general GNS test - mount/umount (GENERIC) ================"
614
615 test_1b() {
616     local LOOP_DEV=$(find_free_loop 2>/dev/null)
617     local UPCALL="$TMP/gns-upcall-1b.sh"
618     local LOOP_FILE="$TMP/gns_loop_1b"
619     local LOG="$TMP/gns-log"
620     local OBJECT=".mntinfo"
621     local TIMOUT=5
622     local TICK=1
623
624     disable_gns
625
626     test "x$LOOP_DEV" != "x" && test -b $LOOP_DEV ||
627         error "can't find free loop device"
628
629     setup_loop $LOOP_DEV $LOOP_FILE || 
630         error
631
632     setup_upcall $UPCALL DEADLOCK $LOG FG || {
633         cleanup_loop $LOOP_DEV $LOOP_FILE
634         error
635     }
636
637     setup_gns $OBJECT $TIMOUT $TICK || {
638         cleanup_loop $LOOP_DEV $LOOP_FILE
639         error
640     }
641
642     setup_object $DIR/gns_test_1b $OBJECT "-t ext2 $LOOP_DEV" || {
643         cleanup_loop $LOOP_DEV $LOOP_FILE
644         error
645     }
646     
647     enable_gns
648
649     echo ""
650     echo "testing GNS with DEADLOCK upcall 3 times on the row"
651     
652     for ((i=0;i<3;i++)); do
653         check_gns $DIR/gns_test_1b $DIR/gns_test_1b $TIMOUT $TICK GENERIC OPEN 1
654     done
655     
656     disable_gns
657     cleanup_object $DIR/gns_test_1b
658     cleanup_loop $LOOP_DEV $LOOP_FILE
659
660     return 0
661 }
662
663 run_test 1b " general GNS test - mount/umount (DEADLOCK) ==============="
664
665 test_1c() {
666     local LOOP_DEV=$(find_free_loop 2>/dev/null)
667     local UPCALL="$TMP/gns-upcall-1c.sh"
668     local LOOP_FILE="$TMP/gns_loop_1c"
669     local LOG="$TMP/gns-log"
670     local OBJECT=".mntinfo"
671     local TIMOUT=5
672     local TICK=1
673
674     disable_gns
675
676     test "x$LOOP_DEV" != "x" && test -b $LOOP_DEV ||
677         error "can't find free loop device"
678
679     setup_loop $LOOP_DEV $LOOP_FILE || 
680         error
681
682     setup_gns $OBJECT $TIMOUT $TICK || {
683         cleanup_loop $LOOP_DEV $LOOP_FILE
684         error
685     }
686
687     setup_object $DIR/gns_test_1c $OBJECT "-t ext2 $LOOP_DEV" || {
688         cleanup_loop $LOOP_DEV $LOOP_FILE
689         error
690     }
691
692     enable_gns
693
694     echo ""
695     echo "testing GNS with GENERIC/DEADLOCK upcall 4 times on the row in GENERIC mode"
696     local i=0
697     
698     for ((;i<4;i++)); do
699         local UPCALL_MODE
700         
701         test $(($i%2)) -eq 1 && UPCALL_MODE="DEADLOCK" || 
702             UPCALL_MODE="GENERIC"
703             
704         setup_upcall $UPCALL $UPCALL_MODE $LOG FG || {
705             disable_gns
706             show_log $LOG
707             cleanup_object $DIR/gns_test_1c
708             cleanup_loop $LOOP_DEV $LOOP_FILE
709             error
710         }
711
712         check_gns $DIR/gns_test_1c $DIR/gns_test_1c $TIMOUT $TICK GENERIC OPEN 1 || {
713             disable_gns
714             show_log $LOG
715             cleanup_object $DIR/gns_test_1c
716             cleanup_loop $LOOP_DEV $LOOP_FILE
717             error
718         }
719     done
720     
721     disable_gns
722     cleanup_object $DIR/gns_test_1c
723     cleanup_loop $LOOP_DEV $LOOP_FILE
724
725     return 0
726 }
727
728 run_test 1c " general GNS test - mount/umount (GENERIC/DEADLOCK) ========"
729
730 test_1d() {
731     local LOOP_DEV=$(find_free_loop 2>/dev/null)
732     local UPCALL="$TMP/gns-upcall-1d.sh"
733     local LOOP_FILE="$TMP/gns_loop_1d"
734     local LOG="$TMP/gns-log"
735     local OBJECT=".mntinfo"
736     local TIMOUT=5
737     local TICK=1
738
739     disable_gns
740
741     test "x$LOOP_DEV" != "x" && test -b $LOOP_DEV ||
742         error "can't find free loop device"
743
744     setup_loop $LOOP_DEV $LOOP_FILE || 
745         error
746
747     setup_upcall $UPCALL GENERIC $LOG FG || {
748         cleanup_loop $LOOP_DEV $LOOP_FILE
749         error
750     }
751
752     setup_gns $OBJECT $TIMOUT $TICK || {
753         cleanup_loop $LOOP_DEV $LOOP_FILE
754         error
755     }
756
757     setup_object $DIR/gns_test_1d $OBJECT "-t ext2 $LOOP_DEV" || {
758         cleanup_loop $LOOP_DEV $LOOP_FILE
759         error
760     }
761     
762     enable_gns
763
764     echo ""
765     echo "testing GNS with GENERIC upcall 4 times on the row in CONCUR1 mode"
766     local i=0
767     
768     for ((;i<4;i++)); do
769         check_gns $DIR/gns_test_1d $DIR/gns_test_1d $TIMOUT $TICK CONCUR1 OPEN 1 || {
770             disable_gns
771             show_log $LOG
772             cleanup_object $DIR/gns_test_1d
773             cleanup_loop $LOOP_DEV $LOOP_FILE
774             error
775         }
776     done
777     
778     disable_gns
779     cleanup_object $DIR/gns_test_1d
780     cleanup_loop $LOOP_DEV $LOOP_FILE
781
782     return 0
783 }
784
785 run_test 1d " general GNS test - concurrent mount ======================="
786
787 test_1e() {
788     local LOOP_DEV=$(find_free_loop 2>/dev/null)
789     local UPCALL="$TMP/gns-upcall-1e.sh"
790     local LOOP_FILE="$TMP/gns_loop_1e"
791     local LOG="$TMP/gns-log"
792     local OBJECT=".mntinfo"
793     local TIMOUT=5
794     local TICK=1
795
796     disable_gns
797
798     test "x$LOOP_DEV" != "x" && test -b $LOOP_DEV ||
799         error "can't find free loop device"
800
801     setup_loop $LOOP_DEV $LOOP_FILE || 
802         error
803
804     setup_upcall $UPCALL GENERIC $LOG FG || {
805         cleanup_loop $LOOP_DEV $LOOP_FILE
806         error
807     }
808
809     setup_gns $OBJECT $TIMOUT $TICK || {
810         cleanup_loop $LOOP_DEV $LOOP_FILE
811         error
812     }
813
814     setup_object $DIR/gns_test_1e1 $OBJECT "-t ext2 $LOOP_DEV" || {
815         cleanup_loop $LOOP_DEV $LOOP_FILE
816         error
817     }
818     
819     setup_object $DIR/gns_test_1e2 $OBJECT "-t ext2 $LOOP_DEV" || {
820         cleanup_object $DIR/gns_test_1e1
821         cleanup_loop $LOOP_DEV $LOOP_FILE
822         error
823     }
824     
825     enable_gns
826
827     echo ""
828     echo "testing GNS with GENERIC upcall in CONCUR2 mode"
829     
830     check_gns $DIR/gns_test_1e1 $DIR/gns_test_1e2 $TIMOUT $TICK CONCUR2 OPEN 1 || {
831         disable_gns
832         show_log $LOG
833         cleanup_object $DIR/gns_test_1e1
834         cleanup_object $DIR/gns_test_1e2
835         cleanup_loop $LOOP_DEV $LOOP_FILE
836         error
837     }
838     
839     disable_gns
840     cleanup_object $DIR/gns_test_1e1
841     cleanup_object $DIR/gns_test_1e2
842     cleanup_loop $LOOP_DEV $LOOP_FILE
843
844     return 0
845 }
846
847 run_test 1e " general GNS test - concurrent mount of 2 GNS mounts ======="
848
849 test_2a() {
850     local UPCALL="$TMP/gns-upcall-2a.sh"
851     local LOG="$TMP/gns-log"
852     local OBJECT=".mntinfo"
853     local TIMOUT=5
854     local TICK=1
855
856     disable_gns
857
858     setup_gns $OBJECT $TIMOUT $TICK || 
859         error
860
861     setup_upcall $UPCALL GENERIC $LOG FG ||
862         error
863
864     echo "preparing mount object at $DIR/gns_test_2a/$OBJECT..."
865     mkdir -p $DIR/gns_test_2a
866     ln -s $DIR/gns_test_2a $DIR/gns_test_2a/$OBJECT
867     chmod u+s $DIR/gns_test_2a
868     
869     enable_gns
870
871     echo ""
872     echo "testing GNS with GENERIC upcall"
873     
874     check_gns $DIR/gns_test_2a $DIR/gns_test_2a $TIMOUT $TICK GENERIC OPEN 1
875     
876     disable_gns
877     chmod u-s $DIR/gns_test_2a
878     rm -fr $DIR/gns_test_2a
879
880     return 0
881 }
882
883 run_test 2a " odd conditions (mount object is symlink) ============="
884
885 test_2b() {
886     local UPCALL="$TMP/gns-upcall-2b.sh"
887     local LOG="$TMP/gns-log"
888     local OBJECT=".mntinfo"
889     local TIMOUT=5
890     local TICK=1
891
892     disable_gns
893
894     setup_gns $OBJECT $TIMOUT $TICK || 
895         error
896
897     setup_upcall $UPCALL GENERIC $LOG FG ||
898         error
899
900     echo "preparing mount object at $DIR/gns_test_2b/$OBJECT..."
901     mkdir -p $DIR/gns_test_2b/$OBJECT
902     chmod u+s $DIR/gns_test_2b
903     
904     enable_gns
905     
906     echo ""
907     echo "testing GNS with GENERIC upcall"
908     
909     check_gns $DIR/gns_test_2b $DIR/gns_test_2b $TIMOUT $TICK GENERIC OPEN 1
910     
911     disable_gns
912     chmod u-s $DIR/gns_test_2b
913     rm -fr $DIR/gns_test_2b
914
915     return 0
916 }
917
918 run_test 2b " odd conditions (mount object is directory) ==========="
919
920 test_2c() {
921     local UPCALL="$TMP/gns-upcall-2c.sh"
922     local LOG="$TMP/gns-log"
923     local OBJECT=".mntinfo"
924     local TIMOUT=5
925     local TICK=1
926
927     disable_gns
928
929     setup_gns $OBJECT $TIMOUT $TICK || 
930         error
931
932     setup_upcall $UPCALL GENERIC $LOG FG ||
933         error
934
935     echo "preparing mount object at $DIR/gns_test_2c/$OBJECT..."
936     mkdir -p $DIR/gns_test_2c/$OBJECT/$OBJECT/$OBJECT/$OBJECT
937     chmod u+s -R $DIR/gns_test_2c
938     
939     enable_gns
940     
941     echo ""
942     echo "testing GNS with GENERIC upcall"
943     
944     check_gns $DIR/gns_test_2c $DIR/gns_test_2c $TIMOUT $TICK GENERIC OPEN 1
945
946     disable_gns
947     chmod u-s -R $DIR/gns_test_2c
948     rm -fr $DIR/gns_test_2c
949
950     return 0
951 }
952
953 run_test 2c " odd conditions (mount object is recursive dir) ======="
954
955 test_2d() {
956     local UPCALL="$TMP/gns-upcall-2d.sh"
957     local LOG="$TMP/gns-log"
958     local OBJECT=".mntinfo"
959     local TIMOUT=5
960     local TICK=1
961
962     disable_gns
963
964     setup_gns $OBJECT $TIMOUT $TICK || 
965         error
966
967     setup_upcall $UPCALL GENERIC $LOG FG ||
968         error
969
970     echo "preparing mount object at $DIR/gns_test_2d/$OBJECT..."
971     mkdir -p $DIR/gns_test_2d
972     chmod u+s $DIR/gns_test_2d
973     
974     enable_gns
975
976     echo ""
977     echo "testing GNS with GENERIC upcall"
978     
979     check_gns $DIR/gns_test_2d $DIR/gns_test_2d $TIMOUT $TICK GENERIC OPEN 1
980     
981     disable_gns
982     chmod u-s $DIR/gns_test_2d
983     rm -fr $DIR/gns_test_2d
984
985     return 0
986 }
987
988 run_test 2d " odd conditions (mount object is absent) =============="
989
990 test_2e() {
991     local OBJECT=".mntinfo"
992     local TIMOUT=5
993     local TICK=1
994
995     echo "." > /proc/fs/lustre/llite/fs0/gns_object_name
996     test "x$(cat /proc/fs/lustre/llite/fs0/gns_object_name)" = "x." && 
997         error "'.' is set as mount object name"
998
999     echo ".." > /proc/fs/lustre/llite/fs0/gns_object_name
1000     test "x$(cat /proc/fs/lustre/llite/fs0/gns_object_name)" = "x.." && 
1001         error "'..' is set as mount object name"
1002
1003     echo ".a" > /proc/fs/lustre/llite/fs0/gns_object_name
1004     test "x$(cat /proc/fs/lustre/llite/fs0/gns_object_name)" = "x.a" || 
1005         error "'.a' is not set as mount object name"
1006
1007     echo "..a" > /proc/fs/lustre/llite/fs0/gns_object_name
1008     test "x$(cat /proc/fs/lustre/llite/fs0/gns_object_name)" = "x..a" || 
1009         error "'..a' is not set as mount object name"
1010
1011     return 0
1012 }
1013
1014 run_test 2e " odd conditions ('.' and '..' as mount object) ============="
1015
1016 test_2f() {
1017     local LOOP_DEV=$(find_free_loop 2>/dev/null)
1018     local UPCALL="$TMP/gns-upcall-2f.sh"
1019     local LOOP_FILE="$TMP/gns_loop_2f"
1020     local LOG="$TMP/gns-log"
1021     local OBJECT=".mntinfo"
1022     local TIMOUT=5
1023     local TICK=1
1024
1025     disable_gns
1026
1027     test "x$LOOP_DEV" != "x" && test -b $LOOP_DEV ||
1028         error "can't find free loop device"
1029
1030     setup_loop $LOOP_DEV $LOOP_FILE || 
1031         error
1032
1033     setup_upcall $UPCALL GENERIC $LOG FG || {
1034         cleanup_loop $LOOP_DEV $LOOP_FILE
1035         error
1036     }
1037
1038     setup_gns $OBJECT $TIMOUT $TICK || {
1039         cleanup_loop $LOOP_DEV $LOOP_FILE
1040         error
1041     }
1042
1043     setup_object $DIR/gns_test_2f $OBJECT "-t ext2 $LOOP_DEV" || {
1044         cleanup_loop $LOOP_DEV $LOOP_FILE
1045         error
1046     }
1047     
1048     enable_gns
1049
1050     echo ""
1051     echo "testing GNS with GENERIC upcall in CONCUR3 mode"
1052     
1053     check_gns $DIR/gns_test_2f $DIR/gns_test_2f $TIMOUT $TICK CONCUR3 OPEN 1 || {
1054         disable_gns
1055         show_log $LOG
1056         cleanup_object $DIR/gns_test_2f
1057         cleanup_loop $LOOP_DEV $LOOP_FILE
1058         error
1059     }
1060     
1061     disable_gns
1062     cleanup_object $DIR/gns_test_2f
1063     cleanup_loop $LOOP_DEV $LOOP_FILE
1064
1065     return 0
1066 }
1067
1068 run_test 2f " odd conditions (mount point is modifying during mount) ===="
1069
1070 test_2g() {
1071     local LOOP_DEV=$(find_free_loop 2>/dev/null)
1072     local UPCALL="$TMP/gns-upcall-2g.sh"
1073     local LOOP_FILE="$TMP/gns_loop_2g"
1074     local LOG="$TMP/gns-log"
1075     local OBJECT=".mntinfo"
1076     local TIMOUT=5
1077     local TICK=1
1078
1079     disable_gns
1080
1081     test "x$LOOP_DEV" != "x" && test -b $LOOP_DEV ||
1082         error "can't find free loop device"
1083
1084     setup_loop $LOOP_DEV $LOOP_FILE || 
1085         error
1086
1087     setup_upcall $UPCALL GENERIC $LOG FG || {
1088         cleanup_loop $LOOP_DEV $LOOP_FILE
1089         error
1090     }
1091
1092     setup_gns $OBJECT $TIMOUT $TICK || {
1093         cleanup_loop $LOOP_DEV $LOOP_FILE
1094         error
1095     }
1096
1097     setup_object $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT $OBJECT "-t ext2 $LOOP_DEV" || {
1098         cleanup_loop $LOOP_DEV $LOOP_FILE
1099         error
1100     }
1101     chmod u+s $DIR/gns_test_2g -R
1102
1103     enable_gns
1104
1105     echo ""
1106     echo "testing GNS with GENERIC upcall in GENERIC mode"
1107     
1108     check_gns $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT \
1109 $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT $TIMOUT $TICK GENERIC OPEN 1 || {
1110         disable_gns
1111         show_log $LOG
1112         cleanup_object $DIR/gns_test_2g
1113         cleanup_loop $LOOP_DEV $LOOP_FILE
1114         error "recursive mount point does not work"
1115     }
1116     
1117     disable_gns
1118
1119     echo ""
1120     echo "turning SUID on $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT off"
1121     chmod u-s $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT
1122
1123     enable_gns
1124
1125     check_gns $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT \
1126 $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT $TIMOUT $TICK GENERIC OPEN 1 && {
1127         disable_gns
1128         show_log $LOG
1129         cleanup_object $DIR/gns_test_2g
1130         cleanup_loop $LOOP_DEV $LOOP_FILE
1131         error "GNS works whereas mount point is not SUID marked dir"
1132     }
1133
1134     disable_gns
1135     cleanup_object $DIR/gns_test_2g
1136     cleanup_loop $LOOP_DEV $LOOP_FILE
1137
1138     return 0
1139 }
1140
1141 run_test 2g " odd conditions (mount point is recursive marked SUID dir) ="
1142
1143 test_2h() {
1144     local LOOP_DEV=$(find_free_loop 2>/dev/null)
1145     local UPCALL="$TMP/gns-upcall-2h.sh"
1146     local LOOP_FILE="$TMP/gns_loop_2h"
1147     local LOG="$TMP/gns-log"
1148     local OBJECT=".mntinfo"
1149     local TIMOUT=5
1150     local TICK=1
1151
1152     disable_gns
1153
1154     test "x$LOOP_DEV" != "x" && test -b $LOOP_DEV ||
1155         error "can't find free loop device"
1156
1157     setup_loop $LOOP_DEV $LOOP_FILE || 
1158         error
1159
1160     setup_upcall $UPCALL GENERIC $LOG BG || {
1161         cleanup_loop $LOOP_DEV $LOOP_FILE
1162         error
1163     }
1164
1165     setup_gns $OBJECT $TIMOUT $TICK || {
1166         cleanup_loop $LOOP_DEV $LOOP_FILE
1167         error
1168     }
1169
1170     setup_object $DIR/gns_test_2h $OBJECT "-t ext2 $LOOP_DEV" || {
1171         cleanup_loop $LOOP_DEV $LOOP_FILE
1172         error
1173     }
1174     
1175     enable_gns
1176
1177     echo ""
1178     echo "testing GNS with GENERIC upcall in GENERIC mode"
1179     
1180     check_gns $DIR/gns_test_2h $DIR/gns_test_2h $TIMOUT $TICK GENERIC OPEN 1 || {
1181         disable_gns
1182         show_log $LOG
1183         cleanup_object $DIR/gns_test_2h
1184         cleanup_loop $LOOP_DEV $LOOP_FILE
1185         error
1186     }
1187     
1188     disable_gns
1189     cleanup_object $DIR/gns_test_2h
1190     cleanup_loop $LOOP_DEV $LOOP_FILE
1191
1192     return 0
1193 }
1194
1195 run_test 2h " odd conditions (mounting in background) ==================="
1196
1197 test_3a() {
1198     local LOOP_DEV=$(find_free_loop 2>/dev/null)
1199     local UPCALL="$TMP/gns-upcall-3a.sh"
1200     local LOOP_FILE="$TMP/gns_loop_3a"
1201     local LOG="$TMP/gns-log"
1202     local OBJECT=".mntinfo"
1203     local TIMOUT=5
1204     local TICK=1
1205
1206     disable_gns
1207
1208     test "x$LOOP_DEV" != "x" && test -b $LOOP_DEV ||
1209         error "can't find free loop device"
1210
1211     setup_loop $LOOP_DEV $LOOP_FILE || 
1212         error
1213
1214     setup_upcall $UPCALL GENERIC $LOG FG || {
1215         cleanup_loop $LOOP_DEV $LOOP_FILE
1216         error
1217     }
1218
1219     setup_gns $OBJECT $TIMOUT $TICK || {
1220         cleanup_loop $LOOP_DEV $LOOP_FILE
1221         error
1222     }
1223
1224     setup_object $DIR/gns_test_3a $OBJECT "-t ext2 $LOOP_DEV" || {
1225         cleanup_loop $LOOP_DEV $LOOP_FILE
1226         error
1227     }
1228     
1229     enable_gns
1230
1231     echo ""
1232     echo "testing GNS with GENERIC upcall in GENERIC mode"
1233     
1234     check_gns $DIR/gns_test_3a $DIR/gns_test_3a $TIMOUT $TICK GENERIC OPEN 1 || {
1235         disable_gns
1236         show_log $LOG
1237         cleanup_object $DIR/gns_test_3a
1238         cleanup_loop $LOOP_DEV $LOOP_FILE
1239         error
1240     }
1241     
1242     chmod u-s $DIR/gns_test_3a || {
1243         disable_gns
1244         cleanup_object $DIR/gns_test_3a
1245         cleanup_loop $LOOP_DEV $LOOP_FILE
1246         error "can't chmod u-s $DIR/gns_test_3a"
1247     }
1248     
1249     check_mnt $DIR/gns_test_3a 0 0 0 || {
1250         disable_gns
1251         cleanup_object $DIR/gns_test_3a
1252         cleanup_loop $LOOP_DEV $LOOP_FILE
1253         error "chmod u-s $DIR/gns_test_3a caused mounting?"
1254     }
1255     
1256     disable_gns
1257     cleanup_object $DIR/gns_test_3a
1258     cleanup_loop $LOOP_DEV $LOOP_FILE
1259     
1260     return 0
1261 }
1262
1263 run_test 3a " removing mnt by chmod u-s ================================="
1264
1265 test_3b() {
1266     local LOOP_FILE1="$TMP/gns_loop_3b1"
1267     local LOOP_FILE2="$TMP/gns_loop_3b2"
1268     local LOOP_FILE3="$TMP/gns_loop_3b3"
1269     local OBJECT=".mntinfo"
1270     local LOOP_DEV1=""
1271     local LOOP_DEV2=""
1272     local LOOP_DEV3=""
1273     local TIMOUT=5
1274     local TICK=1
1275
1276     disable_gns
1277
1278     LOOP_DEV1=$(find_free_loop 2>/dev/null)
1279     test "x$LOOP_DEV1" != "x" && test -b $LOOP_DEV1 ||
1280         error "can't find free loop device"
1281
1282     echo "preparing loop device $LOOP_DEV1 <-> $LOOP_FILE1..."
1283     cleanup_loop $LOOP_DEV1 $LOOP_FILE1
1284     setup_loop $LOOP_DEV1 $LOOP_FILE1 || error
1285
1286     echo "preparing mount object at $DIR/gns_test_3b1/$OBJECT..."
1287     setup_object $DIR/gns_test_3b1 $OBJECT "-t ext2 $LOOP_DEV1" || {
1288         cleanup_loop $LOOP_DEV1 $LOOP_FILE1
1289         error
1290     }
1291     
1292     mkdir -p $TMP/mnt || error
1293     mount -t ext2 $LOOP_DEV1 $TMP/mnt || {
1294         cleanup_object $DIR/gns_test_3b1
1295         cleanup_loop $LOOP_DEV1 $LOOP_FILE1
1296         error "cannot mount $LOOP_DEV1"
1297     }
1298
1299     mkdir $TMP/mnt/gns_test_3b2 || {
1300         umount $TMP/mnt
1301         cleanup_object $DIR/gns_test_3b1
1302         cleanup_loop $LOOP_DEV1 $LOOP_FILE1
1303         error "can't create $TMP/mnt/gns_test_3b2"
1304     }
1305     
1306     umount $TMP/mnt || {
1307         cleanup_object $DIR/gns_test_3b1
1308         cleanup_loop $LOOP_DEV1 $LOOP_FILE1
1309         error "can't umount $TMP/mnt"
1310     }
1311
1312     echo "setting up GNS timeouts and mount object..."
1313     setup_gns $OBJECT $TIMOUT $TICK || {
1314         cleanup_object $DIR/gns_test_3b1
1315         cleanup_loop $LOOP_DEV1 $LOOP_FILE1
1316         error
1317     }
1318
1319     enable_gns
1320
1321     echo ""
1322     echo "testing GNS with GENERIC upcall in CONCUR2 mode"
1323     
1324     check_gns $DIR/gns_test_3b1/gns_test_3b2 $DIR/gns_test_3b1/gns_test_3b2 \
1325 $TIMOUT $TICK GENERIC LIST 0 || {
1326         disable_gns
1327         show_log $LOG
1328         cleanup_object $DIR/gns_test_3b1
1329         cleanup_loop $LOOP_DEV1 $LOOP_FILE1
1330         error
1331     }
1332     
1333     check_mnt $DIR/gns_test_3b1 1 0 0 || {
1334         disable_gns
1335         show_log $LOG
1336         cleanup_object $DIR/gns_test_3b1
1337         cleanup_loop $LOOP_DEV1 $LOOP_FILE1
1338         error
1339     }
1340     
1341     check_mnt $DIR/gns_test_3b1 0 $TIMOUT $TICK || {
1342         disable_gns
1343         show_log $LOG
1344         cleanup_object $DIR/gns_test_3b1
1345         cleanup_loop $LOOP_DEV1 $LOOP_FILE1
1346         error
1347     }
1348
1349     disable_gns
1350     cleanup_object $DIR/gns_test_3b1
1351     cleanup_loop $LOOP_DEV1 $LOOP_FILE1
1352
1353     return 0
1354 }
1355
1356 run_test 3b " readdir through mount point ==============================="
1357
1358 TMPDIR=$OLDTMPDIR
1359 TMP=$OLDTMP
1360 HOME=$OLDHOME
1361
1362 log "cleanup: ==========================================================="
1363 if [ "`mount | grep ^$NAME`" ]; then
1364         rm -rf $DIR/[Rdfs][1-9]*
1365         if [ "$I_MOUNTED" = "yes" ]; then
1366                 sh llmountcleanup.sh || error
1367         fi
1368 fi
1369
1370 echo '=========================== finished ==============================='
1371 [ -f "$SANITYLOG" ] && cat $SANITYLOG && exit 1 || true