Whamcloud - gitweb
Branch: HEAD
[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_loop() {
182     test -b /dev/loop0 && 
183         base="/dev/loop" || base="/dev/loop/"
184
185     for ((i=0;i<256;i++)); do
186         test -b $base$i || continue
187         
188         losetup $base$i >/dev/null 2>&1 || {
189             echo "$base$i"
190             break
191         }
192     done
193 }
194
195 cleanup_loop() {
196     local LOOP_DEV=$1
197     local LOOP_FILE=$2
198     
199     losetup -d $LOOP_DEV >/dev/null 2>&1
200     rm -fr $LOOP_FILE >/dev/null 2>&1
201 }
202
203 setup_loop() {
204     local LOOP_DEV=$(find_loop)
205     local LOOP_FILE=$1
206     
207     dd if=/dev/zero of=$LOOP_FILE bs=1M count=10 2>/dev/null ||
208         return $?
209
210     losetup $LOOP_DEV $LOOP_FILE || {
211         rc=$?
212         cleanup_loop $LOOP_DEV $LOOP_FILE
213         return $rc
214     }
215     
216     mke2fs -F $LOOP_DEV >/dev/null 2>&1 || {
217         rc=$?
218         cleanup_loop $LOOP_DEV $LOOP_FILE
219         return rc
220     }
221     
222     echo $LOOP_DEV
223     return 0
224 }
225
226 setup_upcall() {
227     local INJECTION=""
228     local UPCALL=$1
229     local MODE=$2
230     local LOG=$3
231     local BG=$4
232     
233     echo "generating upcall $UPCALL" >&2
234
235     test "x$BG" = "xBG" && 
236         BG="&" || BG=""
237     
238     test "x$MODE" = "xDEADLOCK" &&
239         INJECTION="touch \$MNTPATH/file"
240     
241     cat > $UPCALL <<- EOF
242 #!/bin/sh
243
244 MOUNT=\`which mount 2>/dev/null\`
245 test "x\$MOUNT" = "x" && MOUNT="/bin/mount"
246
247 OPTIONS=\$1
248 MNTPATH=\$2
249
250 test "x\$OPTIONS" = "x" || "x\$MNTPATH" = "x" &&
251 exit 1
252
253 $INJECTION
254 \$MOUNT \$OPTIONS \$MNTPATH > $LOG 2>&1 $BG
255 exit \$?
256 EOF
257     chmod +x $UPCALL
258
259     echo "$UPCALL" > /proc/fs/lustre/llite/fs0/gns_upcall || return $?
260     echo "upcall:  $(cat /proc/fs/lustre/llite/fs0/gns_upcall)"
261
262     echo "======================== upcall script ===========================" >&2
263     cat $UPCALL >&2
264     echo "==================================================================" >&2
265    
266     return 0
267 }
268
269 cleanup_upcall() {
270     local UPCALL=$1
271     rm -fr $UPCALL
272 }
273
274 show_log() {
275     local LOG=$1
276     
277     test -f $LOG && {
278         echo "======================== upcall log ===========================" >&2
279         cat $LOG >&2
280         echo "===============================================================" >&2
281     }
282 }
283
284 sleep_on()
285 {
286     local TIMOUT=$1
287     local TICK=$2
288     
289     local sleep_time=$TIMOUT
290     let sleep_time+=$TICK*2
291     sleep $sleep_time
292 }
293
294 check_mnt()
295 {
296     local OBJECT=$1
297     local MODE=$2
298     local TIMOUT=$3
299     local TICK=$4
300     
301     local res=0
302     local mnt=""
303     local p=""
304     local op
305     
306     test $MODE -eq 1 && op="mount" || op="umount"
307     echo -n "checking for $op $OBJECT: " >&2
308
309     test $MODE -eq 0 && sleep_on $TIMOUT $TICK
310
311     OBJECT="`echo $OBJECT | sed 's/\/*$//'`"
312     mnt="`cat /proc/mounts | grep $OBJECT | awk '{print \$2}'`"
313     test -z "$mnt" && {
314         res=0
315     } || {
316         for p in $mnt; do
317             test "x$p" = "x$OBJECT" && {
318                 res=1
319                 break
320             }
321         done
322     }
323     
324     if test $MODE -eq 0; then
325         test $res -eq 1 && {
326             echo "failed" >&2
327             return 1
328         }
329     else
330         test $res -eq 0 && {
331             echo "failed" >&2
332             return 1
333         }
334     fi
335
336     echo "success" >&2
337     return 0
338 }
339
340 check_gns() {
341     local OBJECT1=$1
342     local OBJECT2=$2
343     local TIMOUT=$3
344     local TICK=$4
345     local MODE=$5
346     local OP=$6
347     local CHECK=$7
348     
349     local OLD_PWD=$(pwd)
350     echo "testing mount on $OP against $OBJECT1 in $MODE mode" >&2
351     
352     case "$MODE" in
353         GENERIC)
354             case "$OP" in
355                 OPEN)
356                     echo -n "test data" > $OBJECT1/test_file1 >/dev/null 2>&1
357                     ;;
358                 LIST)
359                     ls -la $OBJECT1/
360                     ;;
361                 CHDIR)
362                     cd $OBJECT1 || return $?
363                     ;;
364                 *)
365                     echo "invalid testing operation $OP" >&2
366                     return 1
367             esac
368             ;;
369         CONCUR1)
370             local i=1
371             local nr=20
372         
373             for ((;i<=$nr;i++)); do 
374                 case "$OP" in
375                     OPEN)
376                         echo -n "test data" > $OBJECT1/test_file$i >/dev/null 2>&1 &
377                         ;;
378                     LIST)
379                         ls -la $OBJECT1/
380                         ;;
381                     CHDIR)
382                         cd $OBJECT1 >/dev/null 2>&1 &
383                         ;;
384                     *)
385                         echo "invalid testing operation $OP" >&2
386                         return 1
387                 esac
388             done
389         
390             wait
391             
392             local RETVAL=$?
393             
394             [ $RETVAL -eq 0 ] || 
395                 return $RETVAL
396             ;;
397         CONCUR2)
398             test "x$OBJECT2" = "x" && {
399                 echo "not defined object2 for concurrent2 testing" >&2
400                 return 1
401             }
402             case "$OP" in
403                 OPEN)
404                     echo -n "test data" > $OBJECT1/test_file1 >/dev/null 2>&1 &
405                     echo -n "test data" > $OBJECT2/test_file1 >/dev/null 2>&1 &
406                     ;;
407                 LIST)
408                     ls -la $OBJECT1/
409                     ls -la $OBJECT2/
410                     ;;
411                 CHDIR)
412                     cd $OBJECT1 >/dev/null 2>&1 &
413                     cd $OBJECT2 >/dev/null 2>&1 &
414                     ;;
415                 *)
416                     echo "invalid testing operation $OP" >&2
417                     return 1
418             esac
419             
420             wait
421             
422             local RETVAL=$?
423             
424             [ $RETVAL -eq 0 ] || 
425                 return $RETVAL
426             ;;
427         CONCUR3)
428             local i=1
429             local nr=20
430             
431             for ((;i<$nr;i++)); do
432                 case "$OP" in
433                     OPEN)
434                         touch $OBJECT1/file$i &
435                         echo -n "test data" > $OBJECT1/test_file$i >/dev/null 2>&1 &
436                         mkdir $OBJECT1/dir$i &
437                         ;;
438                     LIST)
439                         touch $OBJECT1/file &
440                         ls -la $OBJECT1/ &
441                         mkdir $OBJECT1/dir$i &
442                         ;;
443                     CHDIR)
444                         touch $OBJECT1/file$i &
445                         cd $OBJECT1 >/dev/null 2>&1 &
446                         mkdir $OBJECT1/dir$i &
447                         ;;
448                     *)
449                         echo "invalid testing operation $OP" >&2
450                         return 1
451                 esac
452             done
453
454             wait
455             
456             local RETVAL=$?
457             
458             [ $RETVAL -eq 0 ] || 
459                 return $RETVAL
460             ;;
461         *)
462             echo "invalid testing mode $MODE" >&2
463             return 1
464     esac
465
466     test "x$OP" = "xCHDIR" && cd $OLD_PWD
467
468     test $CHECK -eq 1 && {
469         # check if mount is here
470         check_mnt $OBJECT1 1 0 0 || return 1
471         if test "x$MODE" = "xCONCUR2"; then
472             check_mnt $OBJECT2 1 0 0 || return 1
473         fi
474     
475         # wait for $TIMEOUT and check for mount, it should go
476         check_mnt $OBJECT1 0 $TIMOUT $TICK || return 2
477         if test "x$MODE" = "xCONCUR2"; then
478             check_mnt $OBJECT2 0 $TIMOUT $TICK || return 2
479         fi
480     }
481     
482     return 0
483 }
484
485 setup_object() {
486     local OBJPATH=$1
487     local OBJECT=$2
488     local CONTENT=$3
489     
490     echo "preparing mount object at $OBJPATH..." >&2
491     
492     mkdir -p $OBJPATH || return $?
493     echo -n $CONTENT > $OBJPATH/$OBJECT || return $?
494     
495     echo "======================== mount object ===========================" >&2
496     cat $OBJPATH/$OBJECT >&2
497     echo "" >&2
498     echo "=================================================================" >&2
499     
500     chmod u+s $OBJPATH
501     return $?
502 }
503
504 cleanup_object() {
505     local OBJPATH=$1
506
507     chmod u-s $OBJPATH
508     umount $OBJPATH >/dev/null 2>&1
509     rm -fr $OBJPATH >/dev/null 2>&1
510 }
511
512 setup_gns() {
513     local OBJECT=$1
514     local TIMOUT=$2
515     local TICK=$3
516
517     echo "setting up GNS timeouts and mount object..." >&2
518
519     echo "$OBJECT" > /proc/fs/lustre/llite/fs0/gns_object_name || error
520     echo "$TIMOUT" > /proc/fs/lustre/llite/fs0/gns_timeout || error
521     echo "$TICK" > /proc/fs/lustre/llite/fs0/gns_tick || error
522
523     echo ""
524     echo "timeout: $(cat /proc/fs/lustre/llite/fs0/gns_timeout)s"
525     echo "object:  $(cat /proc/fs/lustre/llite/fs0/gns_object_name)"
526     echo "tick:    $(cat /proc/fs/lustre/llite/fs0/gns_tick)s"
527     echo ""
528
529 }
530
531 enable_gns()
532 {
533     echo "1" > /proc/fs/lustre/llite/fs0/gns_enabled
534     test "x$(cat /proc/fs/lustre/llite/fs0/gns_enabled)" = "x1" || 
535         error "cannot enable GNS"
536 }
537
538 disable_gns()
539 {
540     echo "0" > /proc/fs/lustre/llite/fs0/gns_enabled
541     test "x$(cat /proc/fs/lustre/llite/fs0/gns_enabled)" = "x0" || 
542         error "cannot disable GNS"
543 }
544
545 test_1a() {
546     local UPCALL="$TMP/gns-upcall-1a.sh"
547     local LOOP_FILE="$TMP/gns_loop_1a"
548     local LOG="$TMP/gns-log"
549     local OBJECT=".mntinfo"
550     local LOOP_DEV=""
551     local TIMOUT=5
552     local TICK=1
553
554     disable_gns
555
556     LOOP_DEV=$(setup_loop $LOOP_FILE)
557     test "x$LOOP_DEV" = "x" && 
558         error "can't find valid (free) loop device"
559
560     setup_upcall $UPCALL GENERIC $LOG FG || {
561         cleanup_loop $LOOP_DEV $LOOP_FILE
562         error
563     }
564
565     setup_gns $OBJECT $TIMOUT $TICK || {
566         cleanup_loop $LOOP_DEV $LOOP_FILE
567         error
568     }
569     
570     setup_object $DIR/gns_test_1a $OBJECT "-t ext2 $LOOP_DEV" || {
571         cleanup_loop $LOOP_DEV $LOOP_FILE
572         error
573     }
574
575     enable_gns
576
577     for ((i=0;i<3;i++)); do
578         check_gns $DIR/gns_test_1a $DIR/gns_test_1a $TIMOUT $TICK GENERIC OPEN 1 || {
579             disable_gns
580             show_log $LOG
581             cleanup_object $DIR/gns_test_1a
582             cleanup_loop $LOOP_DEV $LOOP_FILE
583             error
584         }
585     done
586     
587     for ((i=0;i<3;i++)); do
588         check_gns $DIR/gns_test_1a $DIR/gns_test_1a $TIMOUT $TICK GENERIC CHDIR 1 || {
589             disable_gns
590             show_log $LOG
591             cleanup_object $DIR/gns_test_1a
592             cleanup_loop $LOOP_DEV $LOOP_FILE
593             error
594         }
595     done
596     
597     disable_gns
598     cleanup_object $DIR/gns_test_1a
599     cleanup_loop $LOOP_DEV $LOOP_FILE
600
601     return 0
602 }
603
604 run_test 1a " general GNS test - mount/umount (GENERIC) ================"
605
606 test_1b() {
607     local UPCALL="$TMP/gns-upcall-1b.sh"
608     local LOOP_FILE="$TMP/gns_loop_1b"
609     local LOG="$TMP/gns-log"
610     local OBJECT=".mntinfo"
611     local LOOP_DEV=""
612     local TIMOUT=5
613     local TICK=1
614
615     disable_gns
616
617     LOOP_DEV=$(setup_loop $LOOP_FILE)
618     test "x$LOOP_DEV" = "x" && 
619         error "can't find valid (free) loop device"
620
621     setup_upcall $UPCALL DEADLOCK $LOG FG || {
622         cleanup_loop $LOOP_DEV $LOOP_FILE
623         error
624     }
625
626     setup_gns $OBJECT $TIMOUT $TICK || {
627         cleanup_loop $LOOP_DEV $LOOP_FILE
628         error
629     }
630
631     setup_object $DIR/gns_test_1b $OBJECT "-t ext2 $LOOP_DEV" || {
632         cleanup_loop $LOOP_DEV $LOOP_FILE
633         error
634     }
635     
636     enable_gns
637
638     for ((i=0;i<3;i++)); do
639         check_gns $DIR/gns_test_1b $DIR/gns_test_1b $TIMOUT $TICK GENERIC OPEN 1
640     done
641     
642     disable_gns
643     cleanup_object $DIR/gns_test_1b
644     cleanup_loop $LOOP_DEV $LOOP_FILE
645
646     return 0
647 }
648
649 run_test 1b " general GNS test - mount/umount (DEADLOCK) ==============="
650
651 test_1c() {
652     local UPCALL="$TMP/gns-upcall-1c.sh"
653     local LOOP_FILE="$TMP/gns_loop_1c"
654     local LOG="$TMP/gns-log"
655     local OBJECT=".mntinfo"
656     local LOOP_DEV=""
657     local TIMOUT=5
658     local TICK=1
659
660     disable_gns
661
662     LOOP_DEV=$(setup_loop $LOOP_FILE)
663     test "x$LOOP_DEV" = "x" && 
664         error "can't find valid (free) loop device"
665
666     setup_gns $OBJECT $TIMOUT $TICK || {
667         cleanup_loop $LOOP_DEV $LOOP_FILE
668         error
669     }
670
671     setup_object $DIR/gns_test_1c $OBJECT "-t ext2 $LOOP_DEV" || {
672         cleanup_loop $LOOP_DEV $LOOP_FILE
673         error
674     }
675
676     enable_gns
677
678     local i=0
679     
680     for ((;i<4;i++)); do
681         local UPCALL_MODE
682         
683         test $(($i%2)) -eq 1 && UPCALL_MODE="DEADLOCK" || 
684             UPCALL_MODE="GENERIC"
685             
686         setup_upcall $UPCALL $UPCALL_MODE $LOG FG || {
687             disable_gns
688             show_log $LOG
689             cleanup_object $DIR/gns_test_1c
690             cleanup_loop $LOOP_DEV $LOOP_FILE
691             error
692         }
693
694         check_gns $DIR/gns_test_1c $DIR/gns_test_1c $TIMOUT $TICK GENERIC OPEN 1 || {
695             disable_gns
696             show_log $LOG
697             cleanup_object $DIR/gns_test_1c
698             cleanup_loop $LOOP_DEV $LOOP_FILE
699             error
700         }
701     done
702     
703     disable_gns
704     cleanup_object $DIR/gns_test_1c
705     cleanup_loop $LOOP_DEV $LOOP_FILE
706
707     return 0
708 }
709
710 run_test 1c " general GNS test - mount/umount (GENERIC/DEADLOCK) ========"
711
712 test_1d() {
713     local UPCALL="$TMP/gns-upcall-1d.sh"
714     local LOOP_FILE="$TMP/gns_loop_1d"
715     local LOG="$TMP/gns-log"
716     local OBJECT=".mntinfo"
717     local LOOP_DEV=""
718     local TIMOUT=5
719     local TICK=1
720
721     disable_gns
722
723     LOOP_DEV=$(setup_loop $LOOP_FILE)
724     test "x$LOOP_DEV" = "x" && 
725         error "can't find valid (free) loop device"
726
727     setup_upcall $UPCALL GENERIC $LOG FG || {
728         cleanup_loop $LOOP_DEV $LOOP_FILE
729         error
730     }
731
732     setup_gns $OBJECT $TIMOUT $TICK || {
733         cleanup_loop $LOOP_DEV $LOOP_FILE
734         error
735     }
736
737     setup_object $DIR/gns_test_1d $OBJECT "-t ext2 $LOOP_DEV" || {
738         cleanup_loop $LOOP_DEV $LOOP_FILE
739         error
740     }
741     
742     enable_gns
743
744     local i=0
745     
746     for ((;i<4;i++)); do
747         check_gns $DIR/gns_test_1d $DIR/gns_test_1d $TIMOUT $TICK CONCUR1 OPEN 1 || {
748             disable_gns
749             show_log $LOG
750             cleanup_object $DIR/gns_test_1d
751             cleanup_loop $LOOP_DEV $LOOP_FILE
752             error
753         }
754     done
755     
756     disable_gns
757     cleanup_object $DIR/gns_test_1d
758     cleanup_loop $LOOP_DEV $LOOP_FILE
759
760     return 0
761 }
762
763 run_test 1d " general GNS test - concurrent mount ======================="
764
765 test_1e() {
766     local UPCALL="$TMP/gns-upcall-1e.sh"
767     local LOOP_FILE="$TMP/gns_loop_1e"
768     local LOG="$TMP/gns-log"
769     local OBJECT=".mntinfo"
770     local LOOP_DEV=""
771     local TIMOUT=5
772     local TICK=1
773
774     disable_gns
775
776     LOOP_DEV=$(setup_loop $LOOP_FILE)
777     test "x$LOOP_DEV" = "x" && 
778         error "can't find valid (free) loop device"
779
780     setup_upcall $UPCALL GENERIC $LOG FG || {
781         cleanup_loop $LOOP_DEV $LOOP_FILE
782         error
783     }
784
785     setup_gns $OBJECT $TIMOUT $TICK || {
786         cleanup_loop $LOOP_DEV $LOOP_FILE
787         error
788     }
789
790     setup_object $DIR/gns_test_1e1 $OBJECT "-t ext2 $LOOP_DEV" || {
791         cleanup_loop $LOOP_DEV $LOOP_FILE
792         error
793     }
794     
795     setup_object $DIR/gns_test_1e2 $OBJECT "-t ext2 $LOOP_DEV" || {
796         cleanup_object $DIR/gns_test_1e1
797         cleanup_loop $LOOP_DEV $LOOP_FILE
798         error
799     }
800     
801     enable_gns
802
803     check_gns $DIR/gns_test_1e1 $DIR/gns_test_1e2 $TIMOUT $TICK CONCUR2 OPEN 1 || {
804         disable_gns
805         show_log $LOG
806         cleanup_object $DIR/gns_test_1e1
807         cleanup_object $DIR/gns_test_1e2
808         cleanup_loop $LOOP_DEV $LOOP_FILE
809         error
810     }
811     
812     disable_gns
813     cleanup_object $DIR/gns_test_1e1
814     cleanup_object $DIR/gns_test_1e2
815     cleanup_loop $LOOP_DEV $LOOP_FILE
816
817     return 0
818 }
819
820 run_test 1e " general GNS test - concurrent mount of 2 GNS mounts ======="
821
822 test_2a() {
823     local UPCALL="$TMP/gns-upcall-2a.sh"
824     local LOG="$TMP/gns-log"
825     local OBJECT=".mntinfo"
826     local TIMOUT=5
827     local TICK=1
828
829     disable_gns
830
831     setup_gns $OBJECT $TIMOUT $TICK || 
832         error
833
834     setup_upcall $UPCALL GENERIC $LOG FG ||
835         error
836
837     mkdir -p $DIR/gns_test_2a
838     ln -s $DIR/gns_test_2a $DIR/gns_test_2a/$OBJECT
839     chmod u+s $DIR/gns_test_2a
840     
841     enable_gns
842
843     check_gns $DIR/gns_test_2a $DIR/gns_test_2a $TIMOUT $TICK GENERIC OPEN 1
844     
845     disable_gns
846     chmod u-s $DIR/gns_test_2a
847     rm -fr $DIR/gns_test_2a
848
849     return 0
850 }
851
852 run_test 2a " odd conditions (mount object is symlink) ============="
853
854 test_2b() {
855     local UPCALL="$TMP/gns-upcall-2b.sh"
856     local LOG="$TMP/gns-log"
857     local OBJECT=".mntinfo"
858     local TIMOUT=5
859     local TICK=1
860
861     disable_gns
862
863     setup_gns $OBJECT $TIMOUT $TICK || 
864         error
865
866     setup_upcall $UPCALL GENERIC $LOG FG ||
867         error
868
869     mkdir -p $DIR/gns_test_2b/$OBJECT
870     chmod u+s $DIR/gns_test_2b
871     
872     enable_gns
873     
874     echo ""
875     echo "testing GNS with GENERIC upcall"
876     
877     check_gns $DIR/gns_test_2b $DIR/gns_test_2b $TIMOUT $TICK GENERIC OPEN 1
878     
879     disable_gns
880     chmod u-s $DIR/gns_test_2b
881     rm -fr $DIR/gns_test_2b
882
883     return 0
884 }
885
886 run_test 2b " odd conditions (mount object is directory) ==========="
887
888 test_2c() {
889     local UPCALL="$TMP/gns-upcall-2c.sh"
890     local LOG="$TMP/gns-log"
891     local OBJECT=".mntinfo"
892     local TIMOUT=5
893     local TICK=1
894
895     disable_gns
896
897     setup_gns $OBJECT $TIMOUT $TICK || 
898         error
899
900     setup_upcall $UPCALL GENERIC $LOG FG ||
901         error
902
903     mkdir -p $DIR/gns_test_2c/$OBJECT/$OBJECT/$OBJECT/$OBJECT
904     chmod u+s -R $DIR/gns_test_2c
905     
906     enable_gns
907     
908     check_gns $DIR/gns_test_2c $DIR/gns_test_2c $TIMOUT $TICK GENERIC OPEN 1
909
910     disable_gns
911     chmod u-s -R $DIR/gns_test_2c
912     rm -fr $DIR/gns_test_2c
913
914     return 0
915 }
916
917 run_test 2c " odd conditions (mount object is recursive dir) ======="
918
919 test_2d() {
920     local UPCALL="$TMP/gns-upcall-2d.sh"
921     local LOG="$TMP/gns-log"
922     local OBJECT=".mntinfo"
923     local TIMOUT=5
924     local TICK=1
925
926     disable_gns
927
928     setup_gns $OBJECT $TIMOUT $TICK || 
929         error
930
931     setup_upcall $UPCALL GENERIC $LOG FG ||
932         error
933
934     mkdir -p $DIR/gns_test_2d
935     chmod u+s $DIR/gns_test_2d
936     
937     enable_gns
938
939     check_gns $DIR/gns_test_2d $DIR/gns_test_2d $TIMOUT $TICK GENERIC OPEN 1
940     
941     disable_gns
942     chmod u-s $DIR/gns_test_2d
943     rm -fr $DIR/gns_test_2d
944
945     return 0
946 }
947
948 run_test 2d " odd conditions (mount object is absent) =============="
949
950 test_2e() {
951     local OBJECT=".mntinfo"
952     local TIMOUT=5
953     local TICK=1
954
955     echo "." > /proc/fs/lustre/llite/fs0/gns_object_name
956     test "x$(cat /proc/fs/lustre/llite/fs0/gns_object_name)" = "x." && 
957         error "'.' is set as mount object name"
958
959     echo ".." > /proc/fs/lustre/llite/fs0/gns_object_name
960     test "x$(cat /proc/fs/lustre/llite/fs0/gns_object_name)" = "x.." && 
961         error "'..' is set as mount object name"
962
963     echo ".a" > /proc/fs/lustre/llite/fs0/gns_object_name
964     test "x$(cat /proc/fs/lustre/llite/fs0/gns_object_name)" = "x.a" || 
965         error "'.a' is not set as mount object name"
966
967     echo "..a" > /proc/fs/lustre/llite/fs0/gns_object_name
968     test "x$(cat /proc/fs/lustre/llite/fs0/gns_object_name)" = "x..a" || 
969         error "'..a' is not set as mount object name"
970
971     return 0
972 }
973
974 run_test 2e " odd conditions ('.' and '..' as mount object) ============="
975
976 test_2f() {
977     local UPCALL="$TMP/gns-upcall-2f.sh"
978     local LOOP_FILE="$TMP/gns_loop_2f"
979     local LOG="$TMP/gns-log"
980     local OBJECT=".mntinfo"
981     local LOOP_DEV=""
982     local TIMOUT=5
983     local TICK=1
984
985     disable_gns
986
987     LOOP_DEV=$(setup_loop $LOOP_FILE)
988     test "x$LOOP_DEV" = "x" && 
989         error "can't find valid (free) loop device"
990
991     setup_upcall $UPCALL GENERIC $LOG FG || {
992         cleanup_loop $LOOP_DEV $LOOP_FILE
993         error
994     }
995
996     setup_gns $OBJECT $TIMOUT $TICK || {
997         cleanup_loop $LOOP_DEV $LOOP_FILE
998         error
999     }
1000
1001     setup_object $DIR/gns_test_2f $OBJECT "-t ext2 $LOOP_DEV" || {
1002         cleanup_loop $LOOP_DEV $LOOP_FILE
1003         error
1004     }
1005     
1006     enable_gns
1007
1008     check_gns $DIR/gns_test_2f $DIR/gns_test_2f $TIMOUT $TICK CONCUR3 OPEN 1 || {
1009         disable_gns
1010         show_log $LOG
1011         cleanup_object $DIR/gns_test_2f
1012         cleanup_loop $LOOP_DEV $LOOP_FILE
1013         error
1014     }
1015     
1016     disable_gns
1017     cleanup_object $DIR/gns_test_2f
1018     cleanup_loop $LOOP_DEV $LOOP_FILE
1019
1020     return 0
1021 }
1022
1023 run_test 2f " odd conditions (mount point is modifying during mount) ===="
1024
1025 test_2g() {
1026     local UPCALL="$TMP/gns-upcall-2g.sh"
1027     local LOOP_FILE="$TMP/gns_loop_2g"
1028     local LOG="$TMP/gns-log"
1029     local OBJECT=".mntinfo"
1030     local LOOP_DEV=""
1031     local TIMOUT=5
1032     local TICK=1
1033
1034     disable_gns
1035
1036     LOOP_DEV=$(setup_loop $LOOP_FILE)
1037     test "x$LOOP_DEV" = "x" && 
1038         error "can't find valid (free) loop device"
1039
1040     setup_upcall $UPCALL GENERIC $LOG FG || {
1041         cleanup_loop $LOOP_DEV $LOOP_FILE
1042         error
1043     }
1044
1045     setup_gns $OBJECT $TIMOUT $TICK || {
1046         cleanup_loop $LOOP_DEV $LOOP_FILE
1047         error
1048     }
1049
1050     setup_object $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT $OBJECT "-t ext2 $LOOP_DEV" || {
1051         cleanup_loop $LOOP_DEV $LOOP_FILE
1052         error
1053     }
1054     chmod u+s $DIR/gns_test_2g -R
1055
1056     enable_gns
1057
1058     check_gns $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT \
1059 $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT $TIMOUT $TICK GENERIC OPEN 1 || {
1060         disable_gns
1061         show_log $LOG
1062         cleanup_object $DIR/gns_test_2g
1063         cleanup_loop $LOOP_DEV $LOOP_FILE
1064         error "recursive mount point does not work"
1065     }
1066     
1067     disable_gns
1068
1069     echo ""
1070     echo "turning SUID on $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT off"
1071     chmod u-s $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT
1072
1073     enable_gns
1074
1075     check_gns $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT \
1076 $DIR/gns_test_2g/$OBJECT/$OBJECT/$OBJECT $TIMOUT $TICK GENERIC OPEN 1 && {
1077         disable_gns
1078         show_log $LOG
1079         cleanup_object $DIR/gns_test_2g
1080         cleanup_loop $LOOP_DEV $LOOP_FILE
1081         error "GNS works whereas mount point is not SUID marked dir"
1082     }
1083
1084     disable_gns
1085     cleanup_object $DIR/gns_test_2g
1086     cleanup_loop $LOOP_DEV $LOOP_FILE
1087
1088     return 0
1089 }
1090
1091 run_test 2g " odd conditions (mount point is recursive marked SUID dir) ="
1092
1093 test_2h() {
1094     local UPCALL="$TMP/gns-upcall-2h.sh"
1095     local LOOP_FILE="$TMP/gns_loop_2h"
1096     local LOG="$TMP/gns-log"
1097     local OBJECT=".mntinfo"
1098     local LOOP_DEV=""
1099     local TIMOUT=5
1100     local TICK=1
1101
1102     disable_gns
1103
1104     LOOP_DEV=$(setup_loop $LOOP_FILE)
1105     test "x$LOOP_DEV" = "x" && 
1106         error "can't find valid (free) loop device"
1107
1108     setup_upcall $UPCALL GENERIC $LOG BG || {
1109         cleanup_loop $LOOP_DEV $LOOP_FILE
1110         error
1111     }
1112
1113     setup_gns $OBJECT $TIMOUT $TICK || {
1114         cleanup_loop $LOOP_DEV $LOOP_FILE
1115         error
1116     }
1117
1118     setup_object $DIR/gns_test_2h $OBJECT "-t ext2 $LOOP_DEV" || {
1119         cleanup_loop $LOOP_DEV $LOOP_FILE
1120         error
1121     }
1122     
1123     enable_gns
1124
1125     check_gns $DIR/gns_test_2h $DIR/gns_test_2h $TIMOUT $TICK GENERIC OPEN 1 || {
1126         disable_gns
1127         show_log $LOG
1128         cleanup_object $DIR/gns_test_2h
1129         cleanup_loop $LOOP_DEV $LOOP_FILE
1130         error
1131     }
1132     
1133     disable_gns
1134     cleanup_object $DIR/gns_test_2h
1135     cleanup_loop $LOOP_DEV $LOOP_FILE
1136
1137     return 0
1138 }
1139
1140 run_test 2h " odd conditions (mounting in background) ==================="
1141
1142 test_3a() {
1143     local UPCALL="$TMP/gns-upcall-3a.sh"
1144     local LOOP_FILE="$TMP/gns_loop_3a"
1145     local LOG="$TMP/gns-log"
1146     local OBJECT=".mntinfo"
1147     local LOOP_DEV=""
1148     local TIMOUT=5
1149     local TICK=1
1150
1151     disable_gns
1152
1153     LOOP_DEV=$(setup_loop $LOOP_FILE)
1154     test "x$LOOP_DEV" = "x" && 
1155         error "can't find valid (free) loop device"
1156
1157     setup_upcall $UPCALL GENERIC $LOG FG || {
1158         cleanup_loop $LOOP_DEV $LOOP_FILE
1159         error
1160     }
1161
1162     setup_gns $OBJECT $TIMOUT $TICK || {
1163         cleanup_loop $LOOP_DEV $LOOP_FILE
1164         error
1165     }
1166
1167     setup_object $DIR/gns_test_3a $OBJECT "-t ext2 $LOOP_DEV" || {
1168         cleanup_loop $LOOP_DEV $LOOP_FILE
1169         error
1170     }
1171     
1172     enable_gns
1173
1174     check_gns $DIR/gns_test_3a $DIR/gns_test_3a $TIMOUT $TICK GENERIC OPEN 1 || {
1175         disable_gns
1176         show_log $LOG
1177         cleanup_object $DIR/gns_test_3a
1178         cleanup_loop $LOOP_DEV $LOOP_FILE
1179         error
1180     }
1181     
1182     chmod u-s $DIR/gns_test_3a || {
1183         disable_gns
1184         cleanup_object $DIR/gns_test_3a
1185         cleanup_loop $LOOP_DEV $LOOP_FILE
1186         error "can't chmod u-s $DIR/gns_test_3a"
1187     }
1188     
1189     check_mnt $DIR/gns_test_3a 0 0 0 || {
1190         disable_gns
1191         cleanup_object $DIR/gns_test_3a
1192         cleanup_loop $LOOP_DEV $LOOP_FILE
1193         error "chmod u-s $DIR/gns_test_3a caused mounting?"
1194     }
1195     
1196     disable_gns
1197     cleanup_object $DIR/gns_test_3a
1198     cleanup_loop $LOOP_DEV $LOOP_FILE
1199     
1200     return 0
1201 }
1202
1203 run_test 3a " removing mnt by chmod u-s ================================="
1204
1205 test_3b() {
1206     local LOOP_FILE="$TMP/gns_loop_3b"
1207     local UPCALL="$TMP/gns-upcall-3b.sh"
1208     local LOG="$TMP/gns-log"
1209     local OBJECT=".mntinfo"
1210     local LOOP_DEV=""
1211     local TIMOUT=5
1212     local TICK=1
1213
1214     disable_gns
1215
1216     LOOP_DEV=$(setup_loop $LOOP_FILE)
1217     test "x$LOOP_DEV" = "x" && 
1218         error "can't find valid (free) loop device"
1219
1220     setup_upcall $UPCALL GENERIC $LOG FG || {
1221         cleanup_loop $LOOP_DEV $LOOP_FILE
1222         error
1223     }
1224
1225     setup_object $DIR/gns_test_3b1 $OBJECT "-t ext2 $LOOP_DEV" || {
1226         cleanup_loop $LOOP_DEV $LOOP_FILE
1227         error
1228     }
1229     
1230     mkdir -p $TMP/mnt || error
1231     mount -t ext2 $LOOP_DEV $TMP/mnt || {
1232         cleanup_object $DIR/gns_test_3b1
1233         cleanup_loop $LOOP_DEV $LOOP_FILE
1234         error "cannot mount $LOOP_DEV"
1235     }
1236
1237     mkdir $TMP/mnt/gns_test_3b2 || {
1238         umount $TMP/mnt
1239         cleanup_object $DIR/gns_test_3b1
1240         cleanup_loop $LOOP_DEV $LOOP_FILE
1241         error "can't create $TMP/mnt/gns_test_3b2"
1242     }
1243     
1244     umount $TMP/mnt || {
1245         cleanup_object $DIR/gns_test_3b1
1246         cleanup_loop $LOOP_DEV $LOOP_FILE
1247         error "can't umount $TMP/mnt"
1248     }
1249
1250     setup_gns $OBJECT $TIMOUT $TICK || {
1251         cleanup_object $DIR/gns_test_3b1
1252         cleanup_loop $LOOP_DEV $LOOP_FILE
1253         error
1254     }
1255
1256     enable_gns
1257
1258     check_gns $DIR/gns_test_3b1/gns_test_3b2 $DIR/gns_test_3b1/gns_test_3b2 \
1259 $TIMOUT $TICK GENERIC LIST 0 || {
1260         disable_gns
1261         show_log $LOG
1262         cleanup_object $DIR/gns_test_3b1
1263         cleanup_loop $LOOP_DEV $LOOP_FILE
1264         error
1265     }
1266     
1267     check_mnt $DIR/gns_test_3b1 1 0 0 || {
1268         disable_gns
1269         show_log $LOG
1270         cleanup_object $DIR/gns_test_3b1
1271         cleanup_loop $LOOP_DEV $LOOP_FILE
1272         error
1273     }
1274     
1275     check_mnt $DIR/gns_test_3b1 0 $TIMOUT $TICK || {
1276         disable_gns
1277         show_log $LOG
1278         cleanup_object $DIR/gns_test_3b1
1279         cleanup_loop $LOOP_DEV $LOOP_FILE
1280         error
1281     }
1282
1283     disable_gns
1284     cleanup_object $DIR/gns_test_3b1
1285     cleanup_loop $LOOP_DEV $LOOP_FILE
1286
1287     return 0
1288 }
1289
1290 run_test 3b " readdir through mount point ==============================="
1291
1292 TMPDIR=$OLDTMPDIR
1293 TMP=$OLDTMP
1294 HOME=$OLDHOME
1295
1296 log "cleanup: ==========================================================="
1297 if [ "`mount | grep ^$NAME`" ]; then
1298         rm -rf $DIR/[Rdfs][1-9]*
1299         if [ "$I_MOUNTED" = "yes" ]; then
1300                 sh llmountcleanup.sh || error
1301         fi
1302 fi
1303
1304 echo '=========================== finished ==============================='
1305 [ -f "$SANITYLOG" ] && cat $SANITYLOG && exit 1 || true