Whamcloud - gitweb
merge b_devel into HEAD (20030703)
[fs/lustre-release.git] / lustre / tests / sanity.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:-"34 35"} # bugs 1365 and 1360 respectively
11
12 SRCDIR=`dirname $0`
13 PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
14
15 CHECKSTAT=${CHECKSTAT:-"./checkstat -v"}
16 CREATETEST=${CREATETEST:-createtest}
17 LFIND=${LFIND:-lfind}
18 LSTRIPE=${LSTRIPE:-lstripe}
19 LCTL=${LCTL:-lctl}
20 MCREATE=${MCREATE:-mcreate}
21 TOEXCL=${TOEXCL:-toexcl}
22 TRUNCATE=${TRUNCATE:-truncate}
23
24 if [ $UID -ne 0 ]; then
25         RUNAS_ID="$UID"
26         RUNAS=""
27 else
28         RUNAS_ID=${RUNAS_ID:-500}
29         RUNAS=${RUNAS:-"runas -u $RUNAS_ID"}
30 fi
31
32 MOUNT=${MOUNT:-/mnt/lustre}
33 DIR=${DIR:-$MOUNT}
34 export NAME=$NAME
35
36 SAVE_PWD=$PWD
37
38 clean() {
39         echo -n "cln.."
40         sh llmountcleanup.sh > /dev/null || exit 20
41 }
42
43 CLEAN=${CLEAN:-clean}
44 start() {
45         echo -n "mnt.."
46         sh llrmount.sh > /dev/null || exit 10
47         echo "done"
48 }
49 START=${START:-start}
50
51 log() {
52         echo "$*"
53         lctl mark "$*" || true
54 }
55
56 run_one() {
57         if ! mount | grep -q $MOUNT; then
58                 $START
59         fi
60         log "== test $1: $2"
61         test_$1 || error
62         pass
63         cd $SAVE_PWD
64         $CLEAN
65 }
66
67 run_test() {
68         for O in $ONLY; do
69                 if [ "`echo $1 | grep '\<'$O'[a-z]*\>'`" ]; then
70                         echo ""
71                         run_one $1 "$2"
72                         return $?
73                 else
74                         echo -n "."
75                 fi
76         done
77         for X in $EXCEPT $ALWAYS_EXCEPT; do
78                 if [ "`echo $1 | grep '\<'$X'[a-z]*\>'`" ]; then
79                         echo "skipping excluded test $1"
80                         return 0
81                 fi
82         done
83         if [ -z "$ONLY" ]; then
84                 run_one $1 "$2"
85                 return $?
86         fi
87 }
88
89 error() { 
90     echo FAIL
91     exit 1
92 }
93
94 pass() { 
95     echo PASS
96 }
97
98 if ! mount | grep $MOUNT; then
99         sh llmount.sh
100         I_MOUNTED=yes
101 fi
102
103 echo preparing for tests involving mounts
104 EXT2_DEV=/tmp/SANITY.LOOP
105 dd if=/dev/zero of=$EXT2_DEV bs=1k seek=1000 count=1 > /dev/null
106 mke2fs -F $EXT2_DEV > /dev/null
107
108 test_0() {
109         touch $DIR/f
110         $CHECKSTAT -t file $DIR/f || error 
111         rm $DIR/f
112         $CHECKSTAT -a $DIR/f || error
113 }
114 run_test 0 "touch .../f ; rm .../f ============================="
115
116 test_1a() {
117         mkdir $DIR/d1
118         mkdir $DIR/d1/d2
119         $CHECKSTAT -t dir $DIR/d1/d2 || error
120 }
121 run_test 1a "mkdir .../d1; mkdir .../d1/d2 ====================="
122
123 test_1b() {
124         rmdir $DIR/d1/d2
125         rmdir $DIR/d1
126         $CHECKSTAT -a $DIR/d1 || error
127 }
128 run_test 1b "rmdir .../d1/d2; rmdir .../d1 ====================="
129
130 test_2a() {
131         mkdir $DIR/d2
132         touch $DIR/d2/f
133         $CHECKSTAT -t file $DIR/d2/f || error
134 }
135 run_test 2a "mkdir .../d2; touch .../d2/f ======================"
136
137 test_2b() {
138         rm -r $DIR/d2
139         $CHECKSTAT -a $DIR/d2 || error
140 }
141 run_test 2b "rm -r .../d2; touch .../d2/f ======================"
142
143 test_3a() {
144         mkdir $DIR/d3
145         $CHECKSTAT -t dir $DIR/d3 || error
146 }
147 run_test 3a "mkdir .../d3 ======================================"
148
149 test_3b() {
150         touch $DIR/d3/f
151         $CHECKSTAT -t file $DIR/d3/f || error
152 }
153 run_test 3b "touch .../d3/f ===================================="
154
155 test_3c() {
156         rm -r $DIR/d3
157         $CHECKSTAT -a $DIR/d3 || error
158 }
159 run_test 3c "rm -r .../d3 ======================================"
160
161 test_4a() {
162         mkdir $DIR/d4
163         $CHECKSTAT -t dir $DIR/d4 || error
164 }
165 run_test 4a "mkdir .../d4 ======================================"
166
167 test_4b() {
168         mkdir $DIR/d4/d2
169         $CHECKSTAT -t dir $DIR/d4/d2 || error
170 }
171 run_test 4b "mkdir .../d4/d2 ==================================="
172
173 test_5() {
174         mkdir $DIR/d5
175         mkdir $DIR/d5/d2
176         chmod 0707 $DIR/d5/d2
177         $CHECKSTAT -t dir -p 0707 $DIR/d5/d2 || error
178 }
179 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2 ============"
180
181 test_6() {
182         touch $DIR/f6
183         chmod 0666 $DIR/f6
184         $CHECKSTAT -t file -p 0666 $DIR/f6 || error
185 }
186 run_test 6 "touch .../f6; chmod .../f6 ========================="
187
188 test_7a() {
189         mkdir $DIR/d7
190         $MCREATE $DIR/d7/f
191         chmod 0666 $DIR/d7/f
192         $CHECKSTAT -t file -p 0666 $DIR/d7/f || error
193 }
194 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
195
196 test_7b() {
197         $MCREATE $DIR/d7/f2
198         echo -n foo > $DIR/d7/f2
199         [ "`cat $DIR/d7/f2`" = "foo" ] || error
200         $CHECKSTAT -t file -s 3 $DIR/d7/f2 || error
201 }
202 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
203
204 test_8() {
205         mkdir $DIR/d8
206         touch $DIR/d8/f
207         chmod 0666 $DIR/d8/f
208         $CHECKSTAT -t file -p 0666 $DIR/d8/f || error
209 }
210 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
211
212 test_9() {
213         mkdir $DIR/d9
214         mkdir $DIR/d9/d2
215         mkdir $DIR/d9/d2/d3
216         $CHECKSTAT -t dir $DIR/d9/d2/d3 || error
217 }
218 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
219
220 test_10() {
221         mkdir $DIR/d10
222         mkdir $DIR/d10/d2
223         touch $DIR/d10/d2/f
224         $CHECKSTAT -t file $DIR/d10/d2/f || error
225 }
226 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
227
228 test_11() {
229         mkdir $DIR/d11
230         mkdir $DIR/d11/d2
231         chmod 0666 $DIR/d11/d2
232         chmod 0705 $DIR/d11/d2
233         $CHECKSTAT -t dir -p 0705 $DIR/d11/d2 || error
234 }
235 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
236
237 test_12() {
238         mkdir $DIR/d12
239         touch $DIR/d12/f
240         chmod 0666 $DIR/d12/f
241         chmod 0654 $DIR/d12/f
242         $CHECKSTAT -t file -p 0654 $DIR/d12/f || error
243 }
244 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
245
246 test_13() {
247         mkdir $DIR/d13
248         dd if=/dev/zero of=$DIR/d13/f count=10
249         >  $DIR/d13/f
250         $CHECKSTAT -t file -s 0 $DIR/d13/f || error
251 }
252 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
253
254 test_14() {
255         mkdir $DIR/d14
256         touch $DIR/d14/f
257         rm $DIR/d14/f
258         $CHECKSTAT -a $DIR/d14/f || error
259 }
260 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
261
262 test_15() {
263         mkdir $DIR/d15
264         touch $DIR/d15/f
265         mv $DIR/d15/f $DIR/d15/f2
266         $CHECKSTAT -t file $DIR/d15/f2 || error
267 }
268 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
269
270 test_16() {
271         mkdir $DIR/d16
272         touch $DIR/d16/f
273         rm -rf $DIR/d16/f
274         $CHECKSTAT -a $DIR/d16/f || error
275 }
276 run_test 16 "touch .../d16/f; rm -rf .../d16/f ================="
277
278 test_17a() {
279         mkdir $DIR/d17
280         touch $DIR/d17/f
281         ln -s $DIR/d17/f $DIR/d17/l-exist
282         ls -l $DIR/d17
283         $CHECKSTAT -l $DIR/d17/f $DIR/d17/l-exist || error
284         $CHECKSTAT -f -t f $DIR/d17/l-exist || error
285         rm -f $DIR/l-exist
286         $CHECKSTAT -a $DIR/l-exist || error
287 }
288 run_test 17a "symlinks: create, remove (real) =================="
289
290 test_17b() {
291         ln -s no-such-file $DIR/d17/l-dangle
292         ls -l $DIR/d17
293         $CHECKSTAT -l no-such-file $DIR/d17/l-dangle || error
294         $CHECKSTAT -fa $DIR/d17/l-dangle || error
295         rm -f $DIR/l-dangle
296         $CHECKSTAT -a $DIR/l-dangle || error
297 }
298 run_test 17b "symlinks: create, remove (dangling) =============="
299
300 test_18() {
301         touch $DIR/f
302         ls $DIR || error
303 }
304 run_test 18 "touch .../f ; ls ... =============================="
305
306 test_19() {
307         touch $DIR/f
308         ls -l $DIR
309         rm $DIR/f
310         $CHECKSTAT -a $DIR/f || error
311 }
312 run_test 19 "touch .../f ; ls -l ... ==========================="
313
314 test_20() {
315         touch $DIR/f
316         rm $DIR/f
317         log "1 done"
318         touch $DIR/f
319         rm $DIR/f
320         log "2 done"
321         touch $DIR/f
322         rm $DIR/f
323         log "3 done"
324         $CHECKSTAT -a $DIR/f || error
325 }
326 run_test 20 "touch .../f ; ls -l ... ==========================="
327
328 test_21() {
329         mkdir $DIR/d21
330         [ -f $DIR/d21/dangle ] && rm -f $DIR/d21/dangle
331         ln -s dangle $DIR/d21/link
332         echo foo >> $DIR/d21/link
333         cat $DIR/d21/dangle
334         $CHECKSTAT -t link $DIR/d21/link || error
335         $CHECKSTAT -f -t file $DIR/d21/link || error
336 }
337 run_test 21 "write to dangling link ============================"
338
339 test_22() {
340         mkdir $DIR/d22
341         chown $RUNAS_ID $DIR/d22
342         # Tar gets pissy if it can't access $PWD *sigh*
343         (cd /tmp;
344         $RUNAS tar cf - /etc/hosts /etc/sysconfig/network | \
345         $RUNAS tar xfC - $DIR/d22)
346         ls -lR $DIR/d22/etc
347         $CHECKSTAT -t dir $DIR/d22/etc || error
348         $CHECKSTAT -u \#$RUNAS_ID $DIR/d22/etc || error
349 }
350 run_test 22 "unpack tar archive as non-root user ==============="
351
352 test_23() {
353         mkdir $DIR/d23
354         $TOEXCL $DIR/d23/f23
355         $TOEXCL -e $DIR/d23/f23 || error
356 }
357 run_test 23 "O_CREAT|O_EXCL in subdir =========================="
358
359 test_24a() {
360         echo '============ rename sanity ================================='
361         echo '-- same directory rename'
362         mkdir $DIR/R1
363         touch $DIR/R1/f
364         mv $DIR/R1/f $DIR/R1/g
365         $CHECKSTAT -t file $DIR/R1/g || error
366 }
367 run_test 24a "touch .../R1/f; rename .../R1/f .../R1/g ========="
368
369 test_24b() {
370         mkdir $DIR/R2
371         touch $DIR/R2/{f,g}
372         mv $DIR/R2/f $DIR/R2/g
373         $CHECKSTAT -a $DIR/R2/f || error
374         $CHECKSTAT -t file $DIR/R2/g || error
375 }
376 run_test 24b "touch .../R2/{f,g}; rename .../R2/f .../R2/g ====="
377
378 test_24c() {
379         mkdir $DIR/R3
380         mkdir $DIR/R3/f
381         mv $DIR/R3/f $DIR/R3/g
382         $CHECKSTAT -a $DIR/R3/f || error
383         $CHECKSTAT -t dir $DIR/R3/g || error
384 }
385 run_test 24c "mkdir .../R3/f; rename .../R3/f .../R3/g ========="
386
387 test_24d() {
388         mkdir $DIR/R4
389         mkdir $DIR/R4/{f,g}
390         perl -e "rename \"$DIR/R4/f\", \"$DIR/R4/g\";"
391         $CHECKSTAT -a $DIR/R4/f || error
392         $CHECKSTAT -t dir $DIR/R4/g || error
393 }
394 run_test 24d "mkdir .../R4/{f,g}; rename .../R4/f .../R4/g ====="
395
396 test_24e() {
397         echo '-- cross directory renames --' 
398         mkdir $DIR/R5{a,b}
399         touch $DIR/R5a/f
400         mv $DIR/R5a/f $DIR/R5b/g
401         $CHECKSTAT -a $DIR/R5a/f || error
402         $CHECKSTAT -t file $DIR/R5b/g || error
403 }
404 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
405
406 test_24f() {
407         mkdir $DIR/R6{a,b}
408         touch $DIR/R6a/f $DIR/R6b/g
409         mv $DIR/R6a/f $DIR/R6b/g
410         $CHECKSTAT -a $DIR/R6a/f || error
411         $CHECKSTAT -t file $DIR/R6b/g || error
412 }
413 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
414
415 test_24g() {
416         mkdir $DIR/R7{a,b}
417         mkdir $DIR/R7a/d
418         mv $DIR/R7a/d $DIR/R7b/e
419         $CHECKSTAT -a $DIR/R7a/d || error
420         $CHECKSTAT -t dir $DIR/R7b/e || error
421 }
422 run_test 24g "mkdir .../R7a/d; rename .../R7a/d .../R5b/e ======"
423
424 test_24h() {
425         mkdir $DIR/R8{a,b}
426         mkdir $DIR/R8a/d $DIR/R8b/e
427         perl -e "rename \"$DIR/R8a/d\", \"$DIR/R8b/e\";"
428         $CHECKSTAT -a $DIR/R8a/d || error
429         $CHECKSTAT -t dir $DIR/R8b/e || error
430 }
431 run_test 24h "mkdir .../R8{a,b} R8a/{d,e}; mv .../R8a/d .../R8b/e"
432
433 test_24i() {
434         echo "-- rename error cases"
435         mkdir $DIR/R9
436         mkdir $DIR/R9/a
437         touch $DIR/R9/f
438         perl -e "rename \"$DIR/R9/f\", \"$DIR/R9/a\";"
439         $CHECKSTAT -t file $DIR/R9/f || error
440         $CHECKSTAT -t dir  $DIR/R9/a || error
441         $CHECKSTAT -a file $DIR/R9/a/f || error
442 }
443 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a ====="
444
445 test_24j() {
446         mkdir $DIR/R10
447         perl -e "rename \"$DIR/R10/f\", \"$DIR/R10/g\"" 
448         $CHECKSTAT -t dir $DIR/R10 || error
449         $CHECKSTAT -a $DIR/R10/f || error
450         $CHECKSTAT -a $DIR/R10/g || error
451 }
452 run_test 24j "source does not exist ============================" 
453
454 test_25a() {
455         echo '== symlink sanity ======================================='
456         mkdir $DIR/d25
457         ln -s d25 $DIR/s25
458         touch $DIR/s25/foo || error
459 }
460 run_test 25a "create file in symlinked directory ==============="
461
462 test_25b() {
463         $CHECKSTAT -t file $DIR/s25/foo || error
464 }
465 run_test 25b "lookup file in symlinked directory ==============="
466
467 test_26a() {
468         mkdir $DIR/d26
469         mkdir $DIR/d26/d26-2
470         ln -s d26/d26-2 $DIR/s26
471         touch $DIR/s26/foo || error
472 }
473 run_test 26a "multiple component symlink ======================="
474
475 test_26b() {
476         ln -s d26/d26-2/foo $DIR/s26-2
477         touch $DIR/s26-2 || error
478 }
479 run_test 26b "multiple component symlink at end of lookup ======"
480
481 test_26c() {
482         mkdir $DIR/d26.2
483         touch $DIR/d26.2/foo
484         ln -s d26.2 $DIR/s26.2-1
485         ln -s s26.2-1 $DIR/s26.2-2
486         ln -s s26.2-2 $DIR/s26.2-3
487         chmod 0666 $DIR/s26.2-3/foo
488 }
489 run_test 26c "chain of symlinks ================================"
490
491 # recursive symlinks (bug 439)
492 test_26d() {
493         ln -s d26-3/foo $DIR/d26-3
494 }
495 run_test 26d "create multiple component recursive symlink ======"
496
497 test_26e() {
498         rm $DIR/d26-3
499 }
500 run_test 26e "unlink multiple component recursive symlink ======"
501
502 test_27a() {
503         echo '== stripe sanity ========================================'
504         mkdir $DIR/d27
505         $LSTRIPE $DIR/d27/f0 8192 0 1
506         $CHECKSTAT -t file $DIR/d27/f0
507         pass
508         log "test_27b: write to one stripe file ========================="
509         cp /etc/hosts $DIR/d27/f0
510 }
511 run_test 27a "one stripe file =================================="
512
513 test_27c() {
514         $LSTRIPE $DIR/d27/f01 8192 0 2
515         pass
516         log "test_27d: write to two stripe file file f01 ================"
517         dd if=/dev/zero of=$DIR/d27/f01 bs=4k count=4
518 }
519 run_test 27c "create two stripe file f01 ======================="
520
521 test_27d() {
522         $LSTRIPE $DIR/d27/fdef 0 -1 0
523         $CHECKSTAT -t file $DIR/d27/fdef
524         #dd if=/dev/zero of=$DIR/d27/fdef bs=4k count=4
525 }
526 run_test 27d "create file with default settings ================"
527
528 test_27e() {
529         $LSTRIPE $DIR/d27/f12 8192 1 2
530         $LSTRIPE $DIR/d27/f12 8192 1 2 && error
531         $CHECKSTAT -t file $DIR/d27/f12 || error
532         #dd if=/dev/zero of=$DIR/d27/f12 bs=4k count=4
533 }
534 run_test 27e "lstripe existing file (should return error) ======"
535
536
537 test_27f() {
538         $LSTRIPE $DIR/d27/fbad 100 1 2 || true
539         dd if=/dev/zero of=$DIR/d27/f12 bs=4k count=4
540 }
541 run_test 27f "lstripe with bad stripe size (should return error on LOV)"
542
543 test_27g() {
544         $MCREATE $DIR/d27/fnone || error
545         pass
546         log "test 27.9: lfind ============================================"
547         $LFIND $DIR/d27
548 }
549 run_test 27g "mcreate file without objects to test lfind ======="
550
551 test_28() {
552         mkdir $DIR/d28
553         $CREATETEST $DIR/d28/ct || error
554 }
555 run_test 28 "create/mknod/mkdir with bad file types ============"
556
557 test_29() {
558         mkdir $DIR/d29
559         touch $DIR/d29/foo
560         log 'first d29'
561         ls -l $DIR/d29
562         MDCDIR=${MDCDIR:-/proc/fs/lustre/ldlm/ldlm/MDC_*}
563         LOCKCOUNTORIG=`cat $MDCDIR/lock_count`
564         LOCKUNUSEDCOUNTORIG=`cat $MDCDIR/lock_unused_count`
565         log 'second d29'
566         ls -l $DIR/d29
567         log 'done'
568         LOCKCOUNTCURRENT=`cat $MDCDIR/lock_count`
569         LOCKUNUSEDCOUNTCURRENT=`cat $MDCDIR/lock_unused_count`
570         if [ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]; then
571                 echo "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
572                 error
573         fi
574         if [ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]; then
575                 echo "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
576                 error
577         fi
578 }
579 run_test 29 "IT_GETATTR regression  ============================"
580
581 test_30() {
582         cp `which ls` $DIR
583         $DIR/ls /
584         rm $DIR/ls
585 }
586 run_test 30 "run binary from Lustre (execve) ==================="
587
588 test_31() {
589         ./openunlink $DIR/f31 $DIR/f31 || error
590 }
591 run_test 31 "open-unlink file =================================="
592
593 test_32a() {
594         echo "== more mountpoints and symlinks ================="
595         [ -e $DIR/d32a ] && rm -fr $DIR/d32a
596         mkdir -p $DIR/d32a/ext2-mountpoint 
597         mount -t ext2 -o loop $EXT2_DEV $DIR/d32a/ext2-mountpoint || error
598         $CHECKSTAT -t dir $DIR/d32a/ext2-mountpoint/.. || error  
599         umount $DIR/d32a/ext2-mountpoint || error
600 }
601 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
602
603 test_32b() {
604         [ -e $DIR/d32b ] && rm -fr $DIR/d32b
605         mkdir -p $DIR/d32b/ext2-mountpoint 
606         mount -t ext2 -o loop $EXT2_DEV $DIR/d32b/ext2-mountpoint || error
607         ls -al $DIR/d32b/ext2-mountpoint/.. || error
608         umount $DIR/d32b/ext2-mountpoint || error
609 }
610 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
611  
612 test_32c() {
613         [ -e $DIR/d32c ] && rm -fr $DIR/d32c
614         mkdir -p $DIR/d32c/ext2-mountpoint 
615         mount -t ext2 -o loop $EXT2_DEV $DIR/d32c/ext2-mountpoint || error
616         mkdir -p $DIR/d32c/d2/test_dir    
617         $CHECKSTAT -t dir $DIR/d32c/ext2-mountpoint/../d2/test_dir || error
618         umount $DIR/d32c/ext2-mountpoint || error
619 }
620 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
621
622 test_32d() {
623         [ -e $DIR/d32d ] && rm -fr $DIR/d32d
624         mkdir -p $DIR/d32d/ext2-mountpoint 
625         mount -t ext2 -o loop $EXT2_DEV $DIR/d32d/ext2-mountpoint || error
626         mkdir -p $DIR/d32d/d2/test_dir    
627         ls -al $DIR/d32d/ext2-mountpoint/../d2/test_dir || error
628         umount $DIR/d32d/ext2-mountpoint || error
629 }
630 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir =========="
631
632 test_32e() {
633         [ -e $DIR/d32e ] && rm -fr $DIR/d32e
634         mkdir -p $DIR/d32e/tmp    
635         TMP_DIR=$DIR/d32e/tmp       
636         ln -s $DIR/d32e $TMP_DIR/symlink11 
637         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 
638         $CHECKSTAT -t link $DIR/d32e/tmp/symlink11 || error
639         $CHECKSTAT -t link $DIR/d32e/symlink01 || error
640 }
641 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir ====="
642
643 test_32f() {
644         [ -e $DIR/d32f ] && rm -fr $DIR/d32f
645         mkdir -p $DIR/d32f/tmp    
646         TMP_DIR=$DIR/d32f/tmp       
647         ln -s $DIR/d32f $TMP_DIR/symlink11 
648         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 
649         ls $DIR/d32f/tmp/symlink11  || error
650         ls $DIR/d32f/symlink01 || error
651 }
652 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir ====="
653
654 test_32g() {
655         [ -e $DIR/d32g ] && rm -fr $DIR/d32g
656         [ -e $DIR/test_dir ] && rm -fr $DIR/test_dir
657         mkdir -p $DIR/test_dir 
658         mkdir -p $DIR/d32g/tmp    
659         TMP_DIR=$DIR/d32g/tmp       
660         ln -s $DIR/test_dir $TMP_DIR/symlink12 
661         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 
662         $CHECKSTAT -t link $DIR/d32g/tmp/symlink12 || error
663         $CHECKSTAT -t link $DIR/d32g/symlink02 || error
664         $CHECKSTAT -t dir -f $DIR/d32g/tmp/symlink12 || error
665         $CHECKSTAT -t dir -f $DIR/d32g/symlink02 || error
666 }
667 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/test_dir"
668
669 test_32h() {
670         [ -e $DIR/d32h ] && rm -fr $DIR/d32h
671         [ -e $DIR/test_dir ] && rm -fr $DIR/test_dir
672         mkdir -p $DIR/test_dir 
673         mkdir -p $DIR/d32h/tmp    
674         TMP_DIR=$DIR/d32h/tmp       
675         ln -s $DIR/test_dir $TMP_DIR/symlink12 
676         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 
677         ls $DIR/d32h/tmp/symlink12 || error
678         ls $DIR/d32h/symlink02  || error
679 }
680 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/test_dir"
681
682 test_32i() {
683         [ -e $DIR/d32i ] && rm -fr $DIR/d32i
684         mkdir -p $DIR/d32i/ext2-mountpoint 
685         mount -t ext2 -o loop $EXT2_DEV $DIR/d32i/ext2-mountpoint || error
686         touch $DIR/d32i/test_file
687         $CHECKSTAT -t file $DIR/d32i/ext2-mountpoint/../test_file || error  
688         umount $DIR/d32i/ext2-mountpoint || error
689 }
690 run_test 32i "stat d32i/ext2-mountpoint/../test_file ============"
691
692 test_32j() {
693         [ -e $DIR/d32j ] && rm -fr $DIR/d32j
694         mkdir -p $DIR/d32j/ext2-mountpoint 
695         mount -t ext2 -o loop $EXT2_DEV $DIR/d32j/ext2-mountpoint || error
696         touch $DIR/d32j/test_file
697         cat $DIR/d32j/ext2-mountpoint/../test_file || error
698         umount $DIR/d32j/ext2-mountpoint || error
699 }
700 run_test 32j "open d32j/ext2-mountpoint/../test_file ============"
701
702 test_32k() {
703         [ -e $DIR/d32k ] && rm -fr $DIR/d32k
704         mkdir -p $DIR/d32k/ext2-mountpoint 
705         mount -t ext2 -o loop $EXT2_DEV $DIR/d32k/ext2-mountpoint  
706         mkdir -p $DIR/d32k/d2
707         touch $DIR/d32k/d2/test_file || error
708         $CHECKSTAT -t file $DIR/d32k/ext2-mountpoint/../d2/test_file || error
709         umount $DIR/d32k/ext2-mountpoint || error
710 }
711 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========="
712
713 test_32l() {
714         [ -e $DIR/d32l ] && rm -fr $DIR/d32l
715         mkdir -p $DIR/d32l/ext2-mountpoint 
716         mount -t ext2 -o loop $EXT2_DEV $DIR/d32l/ext2-mountpoint || error
717         mkdir -p $DIR/d32l/d2
718         touch $DIR/d32l/d2/test_file
719         cat  $DIR/d32l/ext2-mountpoint/../d2/test_file || error
720         umount $DIR/d32l/ext2-mountpoint || error
721 }
722 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========="
723
724 test_32m() {
725         [ -e $DIR/d32m ] && rm -fr $DIR/d32m
726         mkdir -p $DIR/d32m/tmp    
727         TMP_DIR=$DIR/d32m/tmp       
728         ln -s $DIR $TMP_DIR/symlink11 
729         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 
730         $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 || error
731         $CHECKSTAT -t link $DIR/d32m/symlink01 || error
732 }
733 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======="
734
735 test_32n() {
736         [ -e $DIR/d32n ] && rm -fr $DIR/d32n
737         mkdir -p $DIR/d32n/tmp    
738         TMP_DIR=$DIR/d32n/tmp       
739         ln -s $DIR $TMP_DIR/symlink11 
740         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 
741         ls -l $DIR/d32n/tmp/symlink11  || error
742         ls -l $DIR/d32n/symlink01 || error
743 }
744 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======="
745
746 test_32o() {
747         [ -e $DIR/d32o ] && rm -fr $DIR/d32o
748         [ -e $DIR/test_file ] && rm -fr $DIR/test_file
749         touch $DIR/test_file 
750         mkdir -p $DIR/d32o/tmp    
751         TMP_DIR=$DIR/d32o/tmp       
752         ln -s $DIR/test_file $TMP_DIR/symlink12 
753         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 
754         $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 || error
755         $CHECKSTAT -t link $DIR/d32o/symlink02 || error
756         $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 || error
757         $CHECKSTAT -t file -f $DIR/d32o/symlink02 || error
758 }
759 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/test_file"
760
761 test_32p() {
762         [ -e $DIR/d32p ] && rm -fr $DIR/d32p
763         [ -e $DIR/test_file ] && rm -fr $DIR/test_file
764         touch $DIR/test_file 
765         mkdir -p $DIR/d32p/tmp    
766         TMP_DIR=$DIR/d32p/tmp       
767         ln -s $DIR/test_file $TMP_DIR/symlink12 
768         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 
769         cat $DIR/d32p/tmp/symlink12 || error
770         cat $DIR/d32p/symlink02  || error
771 }
772 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/test_file"
773
774 #   chmod 444 /mnt/lustre/somefile
775 #   open(/mnt/lustre/somefile, O_RDWR)
776 #   Should return -1
777 test_33() {
778         [ -e $DIR/test_33_file ] && rm -fr $DIR/test_33_file
779         touch $DIR/test_33_file
780         chmod 444 $DIR/test_33_file
781         chown $RUNAS_ID $DIR/test_33_file
782         $RUNAS openfile -f O_RDWR $DIR/test_33_file && error || true
783 }
784 run_test 33 "write file with mode 444 (should return error) ===="
785
786 test_34() {
787         $MCREATE $DIR/f
788         $TRUNCATE $DIR/f 100
789         rm $DIR/f
790 }
791 run_test 34 "truncate file that has not been opened ============"
792
793 test_35() {
794         [ -e $DIR/test_35_file ] && rm -fr $DIR/test_35_file
795         cp /bin/sh $DIR/test_35_file
796         chmod 444 $DIR/test_35_file
797         chown $RUNAS_ID $DIR/test_35_file
798         $DIR/test_35_file && error
799         return 0
800 }
801 run_test 35 "exec file with mode 444 (should return error) ====="
802
803 test_36a() {
804         log 36  "cvs operations ===================================="
805         mkdir -p $DIR/cvsroot
806         chown $RUNAS_ID $DIR/cvsroot
807         $RUNAS cvs -d $DIR/cvsroot init 
808 }
809 run_test 36a "cvs init ========================================="
810
811 test_36b() {
812         # on the LLNL clusters, runas will still pick up root's $TMP settings,
813         # which will not be writable for the runas user, and then you get a CVS
814         # error message with a corrupt path string (CVS bug) and panic.
815         # We're not using much space, so just stick it in /tmp, which is
816         # safe.
817         OLDTMPDIR=$TMPDIR
818         OLDTMP=$TMP
819         TMPDIR=/tmp
820         TMP=/tmp
821
822         cd /etc/init.d
823         $RUNAS cvs -d $DIR/cvsroot import -m "nomesg"  reposname vtag rtag
824
825         TMPDIR=$OLDTMPDIR
826         TMP=$OLDTMP
827 }
828 run_test 36b "cvs import ======================================="
829
830 test_36c() {
831         cd $DIR
832         mkdir -p $DIR/reposname
833         chown $RUNAS_ID $DIR/reposname
834         $RUNAS cvs -d $DIR/cvsroot co reposname
835 }
836 run_test 36c "cvs checkout ====================================="
837
838 test_36d() {
839         cd $DIR/reposname
840         $RUNAS touch foo36
841         $RUNAS cvs add -m 'addmsg' foo36
842 }
843 run_test 36d "cvs add =========================================="
844
845 test_36e() {
846         cd $DIR/reposname
847         $RUNAS cvs update
848 }
849 run_test 36e "cvs update ======================================="
850
851 # XXX change this: use a non root user
852 test_36f() {
853         cd $DIR/reposname
854         $RUNAS cvs commit -m 'nomsg' foo36
855 }
856 run_test 36f "cvs commit ======================================="
857
858 test_37() {
859         mkdir -p $DIR/dextra
860         echo f > $DIR/dextra/fbugfile
861         mount -t ext2 -o loop /$EXT2_DEV $DIR/dextra
862         ls $DIR/dextra |grep "\<fbugfile\>" && error
863         umount /$EXT2_DEV
864         rm -f DIR/dextra/fbugfile
865 }
866 run_test 37 "ls a mounted file system to check the old contents ====="
867
868 # open(file, O_DIRECTORY) will leak a request and not cleanup (bug 1501)
869 test_38() {
870         o_directory $DIR/test38
871 }
872 run_test 38 "open a regular file with O_DIRECTORY =============="
873         
874
875 log "cleanup: ======================================================"
876 rm -r $DIR/[Rdfs][1-9]*
877 if [ "$I_MOUNTED" = "yes" ]; then
878         sh llmountcleanup.sh || error
879 fi
880
881 echo '=========================== finished ==============================='