Whamcloud - gitweb
09eb8e9dcda8a336a57cf305c7897e766951879e
[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:-"35 32q 37 39"} # bugs 1360, 1504
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 OPENFILE=${OPENFILE:-openfile}
22 OPENUNLINK=${OPENUNLINK:-openunlink}
23 TOEXCL=${TOEXCL:-toexcl}
24 TRUNCATE=${TRUNCATE:-truncate}
25
26 if [ $UID -ne 0 ]; then
27         RUNAS_ID="$UID"
28         RUNAS=""
29 else
30         RUNAS_ID=${RUNAS_ID:-500}
31         RUNAS=${RUNAS:-"runas -u $RUNAS_ID"}
32 fi
33
34 export NAME=${NAME:-local}
35
36 SAVE_PWD=$PWD
37
38 clean() {
39         echo -n "cln.."
40         sh llmountcleanup.sh > /dev/null || exit 20
41 }
42 CLEAN=${CLEAN:-clean}
43
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 $DIR; 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 MOUNT="`mount | awk '/^'$NAME' .* lustre_lite / { print $3 }'`"
99 if [ -z "$MOUNT" ]; then
100         sh llmount.sh
101         MOUNT="`mount | awk '/^'$NAME' .* lustre_lite / { print $3 }'`"
102         [ -z "$MOUNT" ] && error "NAME=$NAME not mounted"
103         I_MOUNTED=yes
104 fi
105
106 [ `echo $MOUNT | wc -w` -gt 1 ] && error "NAME=$NAME mounted more than once"
107
108 DIR=${DIR:-$MOUNT}
109 [ -z "`echo $DIR | grep $MOUNT`" ] && echo "$DIR not in $MOUNT" && exit 99
110
111 rm -rf $DIR/[Rdfs][1-9]*
112
113 echo preparing for tests involving mounts
114 EXT2_DEV=${EXT2_DEV:-/tmp/SANITY.LOOP}
115 touch $EXT2_DEV
116 mke2fs -F $EXT2_DEV 1000 > /dev/null
117
118 test_0() {
119         touch $DIR/f
120         $CHECKSTAT -t file $DIR/f || error 
121         rm $DIR/f
122         $CHECKSTAT -a $DIR/f || error
123 }
124 run_test 0 "touch .../f ; rm .../f ============================="
125
126 test_1a() {
127         mkdir $DIR/d1
128         mkdir $DIR/d1/d2
129         $CHECKSTAT -t dir $DIR/d1/d2 || error
130 }
131 run_test 1a "mkdir .../d1; mkdir .../d1/d2 ====================="
132
133 test_1b() {
134         rmdir $DIR/d1/d2
135         rmdir $DIR/d1
136         $CHECKSTAT -a $DIR/d1 || error
137 }
138 run_test 1b "rmdir .../d1/d2; rmdir .../d1 ====================="
139
140 test_2a() {
141         mkdir $DIR/d2
142         touch $DIR/d2/f
143         $CHECKSTAT -t file $DIR/d2/f || error
144 }
145 run_test 2a "mkdir .../d2; touch .../d2/f ======================"
146
147 test_2b() {
148         rm -r $DIR/d2
149         $CHECKSTAT -a $DIR/d2 || error
150 }
151 run_test 2b "rm -r .../d2; touch .../d2/f ======================"
152
153 test_3a() {
154         mkdir $DIR/d3
155         $CHECKSTAT -t dir $DIR/d3 || error
156 }
157 run_test 3a "mkdir .../d3 ======================================"
158
159 test_3b() {
160         touch $DIR/d3/f
161         $CHECKSTAT -t file $DIR/d3/f || error
162 }
163 run_test 3b "touch .../d3/f ===================================="
164
165 test_3c() {
166         rm -r $DIR/d3
167         $CHECKSTAT -a $DIR/d3 || error
168 }
169 run_test 3c "rm -r .../d3 ======================================"
170
171 test_4a() {
172         mkdir $DIR/d4
173         $CHECKSTAT -t dir $DIR/d4 || error
174 }
175 run_test 4a "mkdir .../d4 ======================================"
176
177 test_4b() {
178         mkdir $DIR/d4/d2
179         $CHECKSTAT -t dir $DIR/d4/d2 || error
180 }
181 run_test 4b "mkdir .../d4/d2 ==================================="
182
183 test_5() {
184         mkdir $DIR/d5
185         mkdir $DIR/d5/d2
186         chmod 0707 $DIR/d5/d2
187         $CHECKSTAT -t dir -p 0707 $DIR/d5/d2 || error
188 }
189 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2 ============"
190
191 test_6a() {
192         touch $DIR/f6a
193         chmod 0666 $DIR/f6a || error
194         $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/f6a || error
195 }
196 run_test 6a "touch .../f6a; chmod .../f6a ======================"
197
198 test_6b() {
199         [ $RUNAS_ID -eq $UID ] && echo "skipping test 6b" && return
200         $RUNAS chmod 0444 $DIR/f6a && error
201         $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/f6a || error
202 }
203 run_test 6b "$RUNAS chmod .../f6a (should return error) =="
204
205 test_6c() {
206         [ $RUNAS_ID -eq $UID ] && echo "skipping test 6c" && return
207         touch $DIR/f6c
208         chown $RUNAS_ID $DIR/f6c || error
209         $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/f6c || error
210 }
211 run_test 6c "touch .../f6c; chown .../f6c ======================"
212
213 test_6d() {
214         [ $RUNAS_ID -eq $UID ] && echo "skipping test 6d" && return
215         $RUNAS chown $UID $DIR/f6c && error
216         $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/f6c || error
217 }
218 run_test 6d "$RUNAS chown .../f6c (should return error) =="
219
220 test_6e() {
221         [ $RUNAS_ID -eq $UID ] && echo "skipping test 6e" && return
222         touch $DIR/f6e
223         chgrp $RUNAS_ID $DIR/f6e || error
224         $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/f6e || error
225 }
226 run_test 6e "touch .../f6e; chgrp .../f6e ======================"
227
228 test_6f() {
229         [ $RUNAS_ID -eq $UID ] && echo "skipping test 6f" && return
230         $RUNAS chgrp $UID $DIR/f6e && error
231         $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/f6e || error
232 }
233 run_test 6f "$RUNAS chgrp .../f6e (should return error) =="
234
235 test_7a() {
236         mkdir $DIR/d7
237         $MCREATE $DIR/d7/f
238         chmod 0666 $DIR/d7/f
239         $CHECKSTAT -t file -p 0666 $DIR/d7/f || error
240 }
241 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
242
243 test_7b() {
244         $MCREATE $DIR/d7/f2
245         echo -n foo > $DIR/d7/f2
246         [ "`cat $DIR/d7/f2`" = "foo" ] || error
247         $CHECKSTAT -t file -s 3 $DIR/d7/f2 || error
248 }
249 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
250
251 test_8() {
252         mkdir $DIR/d8
253         touch $DIR/d8/f
254         chmod 0666 $DIR/d8/f
255         $CHECKSTAT -t file -p 0666 $DIR/d8/f || error
256 }
257 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
258
259 test_9() {
260         mkdir $DIR/d9
261         mkdir $DIR/d9/d2
262         mkdir $DIR/d9/d2/d3
263         $CHECKSTAT -t dir $DIR/d9/d2/d3 || error
264 }
265 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
266
267 test_10() {
268         mkdir $DIR/d10
269         mkdir $DIR/d10/d2
270         touch $DIR/d10/d2/f
271         $CHECKSTAT -t file $DIR/d10/d2/f || error
272 }
273 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
274
275 test_11() {
276         mkdir $DIR/d11
277         mkdir $DIR/d11/d2
278         chmod 0666 $DIR/d11/d2
279         chmod 0705 $DIR/d11/d2
280         $CHECKSTAT -t dir -p 0705 $DIR/d11/d2 || error
281 }
282 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
283
284 test_12() {
285         mkdir $DIR/d12
286         touch $DIR/d12/f
287         chmod 0666 $DIR/d12/f
288         chmod 0654 $DIR/d12/f
289         $CHECKSTAT -t file -p 0654 $DIR/d12/f || error
290 }
291 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
292
293 test_13() {
294         mkdir $DIR/d13
295         dd if=/dev/zero of=$DIR/d13/f count=10
296         >  $DIR/d13/f
297         $CHECKSTAT -t file -s 0 $DIR/d13/f || error
298 }
299 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
300
301 test_14() {
302         mkdir $DIR/d14
303         touch $DIR/d14/f
304         rm $DIR/d14/f
305         $CHECKSTAT -a $DIR/d14/f || error
306 }
307 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
308
309 test_15() {
310         mkdir $DIR/d15
311         touch $DIR/d15/f
312         mv $DIR/d15/f $DIR/d15/f2
313         $CHECKSTAT -t file $DIR/d15/f2 || error
314 }
315 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
316
317 test_16() {
318         mkdir $DIR/d16
319         touch $DIR/d16/f
320         rm -rf $DIR/d16/f
321         $CHECKSTAT -a $DIR/d16/f || error
322 }
323 run_test 16 "touch .../d16/f; rm -rf .../d16/f ================="
324
325 test_17a() {
326         mkdir $DIR/d17
327         touch $DIR/d17/f
328         ln -s $DIR/d17/f $DIR/d17/l-exist
329         ls -l $DIR/d17
330         $CHECKSTAT -l $DIR/d17/f $DIR/d17/l-exist || error
331         $CHECKSTAT -f -t f $DIR/d17/l-exist || error
332         rm -f $DIR/l-exist
333         $CHECKSTAT -a $DIR/l-exist || error
334 }
335 run_test 17a "symlinks: create, remove (real) =================="
336
337 test_17b() {
338         ln -s no-such-file $DIR/d17/l-dangle
339         ls -l $DIR/d17
340         $CHECKSTAT -l no-such-file $DIR/d17/l-dangle || error
341         $CHECKSTAT -fa $DIR/d17/l-dangle || error
342         rm -f $DIR/l-dangle
343         $CHECKSTAT -a $DIR/l-dangle || error
344 }
345 run_test 17b "symlinks: create, remove (dangling) =============="
346
347 test_18() {
348         touch $DIR/f
349         ls $DIR || error
350 }
351 run_test 18 "touch .../f ; ls ... =============================="
352
353 test_19() {
354         touch $DIR/f
355         ls -l $DIR
356         rm $DIR/f
357         $CHECKSTAT -a $DIR/f || error
358 }
359 run_test 19 "touch .../f ; ls -l ... ==========================="
360
361 test_20() {
362         touch $DIR/f
363         rm $DIR/f
364         log "1 done"
365         touch $DIR/f
366         rm $DIR/f
367         log "2 done"
368         touch $DIR/f
369         rm $DIR/f
370         log "3 done"
371         $CHECKSTAT -a $DIR/f || error
372 }
373 run_test 20 "touch .../f ; ls -l ... ==========================="
374
375 test_21() {
376         mkdir $DIR/d21
377         [ -f $DIR/d21/dangle ] && rm -f $DIR/d21/dangle
378         ln -s dangle $DIR/d21/link
379         echo foo >> $DIR/d21/link
380         cat $DIR/d21/dangle
381         $CHECKSTAT -t link $DIR/d21/link || error
382         $CHECKSTAT -f -t file $DIR/d21/link || error
383 }
384 run_test 21 "write to dangling link ============================"
385
386 test_22() {
387         mkdir $DIR/d22
388         chown $RUNAS_ID $DIR/d22
389         # Tar gets pissy if it can't access $PWD *sigh*
390         (cd /tmp;
391         $RUNAS tar cf - /etc/hosts /etc/sysconfig/network | \
392         $RUNAS tar xfC - $DIR/d22)
393         ls -lR $DIR/d22/etc
394         $CHECKSTAT -t dir $DIR/d22/etc || error
395         $CHECKSTAT -u \#$RUNAS_ID $DIR/d22/etc || error
396 }
397 run_test 22 "unpack tar archive as non-root user ==============="
398
399 test_23() {
400         mkdir $DIR/d23
401         $TOEXCL $DIR/d23/f23
402         $TOEXCL -e $DIR/d23/f23 || error
403 }
404 run_test 23 "O_CREAT|O_EXCL in subdir =========================="
405
406 test_24a() {
407         echo '== rename sanity =============================================='
408         echo '-- same directory rename'
409         mkdir $DIR/R1
410         touch $DIR/R1/f
411         mv $DIR/R1/f $DIR/R1/g
412         $CHECKSTAT -t file $DIR/R1/g || error
413 }
414 run_test 24a "touch .../R1/f; rename .../R1/f .../R1/g ========="
415
416 test_24b() {
417         mkdir $DIR/R2
418         touch $DIR/R2/{f,g}
419         mv $DIR/R2/f $DIR/R2/g
420         $CHECKSTAT -a $DIR/R2/f || error
421         $CHECKSTAT -t file $DIR/R2/g || error
422 }
423 run_test 24b "touch .../R2/{f,g}; rename .../R2/f .../R2/g ====="
424
425 test_24c() {
426         mkdir $DIR/R3
427         mkdir $DIR/R3/f
428         mv $DIR/R3/f $DIR/R3/g
429         $CHECKSTAT -a $DIR/R3/f || error
430         $CHECKSTAT -t dir $DIR/R3/g || error
431 }
432 run_test 24c "mkdir .../R3/f; rename .../R3/f .../R3/g ========="
433
434 test_24d() {
435         mkdir $DIR/R4
436         mkdir $DIR/R4/{f,g}
437         perl -e "rename \"$DIR/R4/f\", \"$DIR/R4/g\";"
438         $CHECKSTAT -a $DIR/R4/f || error
439         $CHECKSTAT -t dir $DIR/R4/g || error
440 }
441 run_test 24d "mkdir .../R4/{f,g}; rename .../R4/f .../R4/g ====="
442
443 test_24e() {
444         echo '-- cross directory renames --' 
445         mkdir $DIR/R5{a,b}
446         touch $DIR/R5a/f
447         mv $DIR/R5a/f $DIR/R5b/g
448         $CHECKSTAT -a $DIR/R5a/f || error
449         $CHECKSTAT -t file $DIR/R5b/g || error
450 }
451 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
452
453 test_24f() {
454         mkdir $DIR/R6{a,b}
455         touch $DIR/R6a/f $DIR/R6b/g
456         mv $DIR/R6a/f $DIR/R6b/g
457         $CHECKSTAT -a $DIR/R6a/f || error
458         $CHECKSTAT -t file $DIR/R6b/g || error
459 }
460 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
461
462 test_24g() {
463         mkdir $DIR/R7{a,b}
464         mkdir $DIR/R7a/d
465         mv $DIR/R7a/d $DIR/R7b/e
466         $CHECKSTAT -a $DIR/R7a/d || error
467         $CHECKSTAT -t dir $DIR/R7b/e || error
468 }
469 run_test 24g "mkdir .../R7a/d; rename .../R7a/d .../R5b/e ======"
470
471 test_24h() {
472         mkdir $DIR/R8{a,b}
473         mkdir $DIR/R8a/d $DIR/R8b/e
474         perl -e "rename \"$DIR/R8a/d\", \"$DIR/R8b/e\";"
475         $CHECKSTAT -a $DIR/R8a/d || error
476         $CHECKSTAT -t dir $DIR/R8b/e || error
477 }
478 run_test 24h "mkdir .../R8{a,b} R8a/{d,e}; mv .../R8a/d .../R8b/e"
479
480 test_24i() {
481         echo "-- rename error cases"
482         mkdir $DIR/R9
483         mkdir $DIR/R9/a
484         touch $DIR/R9/f
485         perl -e "rename \"$DIR/R9/f\", \"$DIR/R9/a\";"
486         $CHECKSTAT -t file $DIR/R9/f || error
487         $CHECKSTAT -t dir  $DIR/R9/a || error
488         $CHECKSTAT -a file $DIR/R9/a/f || error
489 }
490 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
491
492 test_24j() {
493         mkdir $DIR/R10
494         perl -e "rename \"$DIR/R10/f\", \"$DIR/R10/g\"" 
495         $CHECKSTAT -t dir $DIR/R10 || error
496         $CHECKSTAT -a $DIR/R10/f || error
497         $CHECKSTAT -a $DIR/R10/g || error
498 }
499 run_test 24j "source does not exist ============================" 
500
501 test_25a() {
502         echo '== symlink sanity ============================================='
503         mkdir $DIR/d25
504         ln -s d25 $DIR/s25
505         touch $DIR/s25/foo || error
506 }
507 run_test 25a "create file in symlinked directory ==============="
508
509 test_25b() {
510         $CHECKSTAT -t file $DIR/s25/foo || error
511 }
512 run_test 25b "lookup file in symlinked directory ==============="
513
514 test_26a() {
515         mkdir $DIR/d26
516         mkdir $DIR/d26/d26-2
517         ln -s d26/d26-2 $DIR/s26
518         touch $DIR/s26/foo || error
519 }
520 run_test 26a "multiple component symlink ======================="
521
522 test_26b() {
523         mkdir -p $DIR/d26b/d26-2
524         ln -s d26b/d26-2/foo $DIR/s26-2
525         touch $DIR/s26-2 || error
526 }
527 run_test 26b "multiple component symlink at end of lookup ======"
528
529 test_26c() {
530         mkdir $DIR/d26.2
531         touch $DIR/d26.2/foo
532         ln -s d26.2 $DIR/s26.2-1
533         ln -s s26.2-1 $DIR/s26.2-2
534         ln -s s26.2-2 $DIR/s26.2-3
535         chmod 0666 $DIR/s26.2-3/foo
536 }
537 run_test 26c "chain of symlinks ================================"
538
539 # recursive symlinks (bug 439)
540 test_26d() {
541         ln -s d26-3/foo $DIR/d26-3
542 }
543 run_test 26d "create multiple component recursive symlink ======"
544
545 test_26e() {
546         rm $DIR/d26-3
547 }
548 run_test 26e "unlink multiple component recursive symlink ======"
549
550 test_27a() {
551         echo '== stripe sanity =============================================='
552         mkdir $DIR/d27
553         $LSTRIPE $DIR/d27/f0 8192 0 1
554         $CHECKSTAT -t file $DIR/d27/f0
555         pass
556         log "== test_27b: write to one stripe file ========================="
557         cp /etc/hosts $DIR/d27/f0
558 }
559 run_test 27a "one stripe file =================================="
560
561 test_27c() {
562         $LSTRIPE $DIR/d27/f01 8192 0 2
563         pass
564         log "== test_27d: write to two stripe file file f01 ================"
565         dd if=/dev/zero of=$DIR/d27/f01 bs=4k count=4
566 }
567 run_test 27c "create two stripe file f01 ======================="
568
569 test_27d() {
570         $LSTRIPE $DIR/d27/fdef 0 -1 0
571         $CHECKSTAT -t file $DIR/d27/fdef
572         #dd if=/dev/zero of=$DIR/d27/fdef bs=4k count=4
573 }
574 run_test 27d "create file with default settings ================"
575
576 test_27e() {
577         $LSTRIPE $DIR/d27/f12 8192 1 2
578         $LSTRIPE $DIR/d27/f12 8192 1 2 && error
579         $CHECKSTAT -t file $DIR/d27/f12 || error
580         #dd if=/dev/zero of=$DIR/d27/f12 bs=4k count=4
581 }
582 run_test 27e "lstripe existing file (should return error) ======"
583
584
585 test_27f() {
586         $LSTRIPE $DIR/d27/fbad 100 1 2 || true
587         dd if=/dev/zero of=$DIR/d27/f12 bs=4k count=4
588         $LFIND $DIR/d27/fbad
589 }
590 run_test 27f "lstripe with bad stripe size (should return error on LOV)"
591
592 test_27g() {
593         $MCREATE $DIR/d27/fnone || error
594         pass
595         log "== test 27h: lfind ============================================"
596         $LFIND $DIR/d27/fnone | grep -q "Has no stripe info" || error
597 }
598 run_test 27g "mcreate file without objects to test lfind ======="
599
600 test_28() {
601         mkdir $DIR/d28
602         $CREATETEST $DIR/d28/ct || error
603 }
604 run_test 28 "create/mknod/mkdir with bad file types ============"
605
606 test_29() {
607         mkdir $DIR/d29
608         touch $DIR/d29/foo
609         log 'first d29'
610         ls -l $DIR/d29
611         MDCDIR=${MDCDIR:-/proc/fs/lustre/ldlm/ldlm/MDC_*}
612         LOCKCOUNTORIG=`cat $MDCDIR/lock_count`
613         LOCKUNUSEDCOUNTORIG=`cat $MDCDIR/lock_unused_count`
614         log 'second d29'
615         ls -l $DIR/d29
616         log 'done'
617         LOCKCOUNTCURRENT=`cat $MDCDIR/lock_count`
618         LOCKUNUSEDCOUNTCURRENT=`cat $MDCDIR/lock_unused_count`
619         if [ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]; then
620                 echo "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
621                 error
622         fi
623         if [ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]; then
624                 echo "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
625                 error
626         fi
627 }
628 run_test 29 "IT_GETATTR regression  ============================"
629
630 test_30() {
631         cp `which ls` $DIR
632         $DIR/ls /
633         rm $DIR/ls
634 }
635 run_test 30 "run binary from Lustre (execve) ==================="
636
637 test_31() {
638         $OPENUNLINK $DIR/f31 $DIR/f31 || error
639 }
640 run_test 31 "open-unlink file =================================="
641
642 test_32a() {
643         echo "== more mountpoints and symlinks ================="
644         [ -e $DIR/d32a ] && rm -fr $DIR/d32a
645         mkdir -p $DIR/d32a/ext2-mountpoint 
646         mount -t ext2 -o loop $EXT2_DEV $DIR/d32a/ext2-mountpoint || error
647         $CHECKSTAT -t dir $DIR/d32a/ext2-mountpoint/.. || error  
648         umount $DIR/d32a/ext2-mountpoint || error
649 }
650 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
651
652 test_32b() {
653         [ -e $DIR/d32b ] && rm -fr $DIR/d32b
654         mkdir -p $DIR/d32b/ext2-mountpoint 
655         mount -t ext2 -o loop $EXT2_DEV $DIR/d32b/ext2-mountpoint || error
656         ls -al $DIR/d32b/ext2-mountpoint/.. || error
657         umount $DIR/d32b/ext2-mountpoint || error
658 }
659 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
660  
661 test_32c() {
662         [ -e $DIR/d32c ] && rm -fr $DIR/d32c
663         mkdir -p $DIR/d32c/ext2-mountpoint 
664         mount -t ext2 -o loop $EXT2_DEV $DIR/d32c/ext2-mountpoint || error
665         mkdir -p $DIR/d32c/d2/test_dir    
666         $CHECKSTAT -t dir $DIR/d32c/ext2-mountpoint/../d2/test_dir || error
667         umount $DIR/d32c/ext2-mountpoint || error
668 }
669 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
670
671 test_32d() {
672         [ -e $DIR/d32d ] && rm -fr $DIR/d32d
673         mkdir -p $DIR/d32d/ext2-mountpoint 
674         mount -t ext2 -o loop $EXT2_DEV $DIR/d32d/ext2-mountpoint || error
675         mkdir -p $DIR/d32d/d2/test_dir    
676         ls -al $DIR/d32d/ext2-mountpoint/../d2/test_dir || error
677         umount $DIR/d32d/ext2-mountpoint || error
678 }
679 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir ========="
680
681 test_32e() {
682         [ -e $DIR/d32e ] && rm -fr $DIR/d32e
683         mkdir -p $DIR/d32e/tmp    
684         TMP_DIR=$DIR/d32e/tmp       
685         ln -s $DIR/d32e $TMP_DIR/symlink11 
686         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 
687         $CHECKSTAT -t link $DIR/d32e/tmp/symlink11 || error
688         $CHECKSTAT -t link $DIR/d32e/symlink01 || error
689 }
690 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir ===="
691
692 test_32f() {
693         [ -e $DIR/d32f ] && rm -fr $DIR/d32f
694         mkdir -p $DIR/d32f/tmp    
695         TMP_DIR=$DIR/d32f/tmp       
696         ln -s $DIR/d32f $TMP_DIR/symlink11 
697         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 
698         ls $DIR/d32f/tmp/symlink11  || error
699         ls $DIR/d32f/symlink01 || error
700 }
701 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir ===="
702
703 test_32g() {
704         [ -e $DIR/d32g ] && rm -fr $DIR/d32g
705         [ -e $DIR/test_dir ] && rm -fr $DIR/test_dir
706         mkdir -p $DIR/test_dir 
707         mkdir -p $DIR/d32g/tmp    
708         TMP_DIR=$DIR/d32g/tmp       
709         ln -s $DIR/test_dir $TMP_DIR/symlink12 
710         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 
711         $CHECKSTAT -t link $DIR/d32g/tmp/symlink12 || error
712         $CHECKSTAT -t link $DIR/d32g/symlink02 || error
713         $CHECKSTAT -t dir -f $DIR/d32g/tmp/symlink12 || error
714         $CHECKSTAT -t dir -f $DIR/d32g/symlink02 || error
715 }
716 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/test_dir"
717
718 test_32h() {
719         [ -e $DIR/d32h ] && rm -fr $DIR/d32h
720         [ -e $DIR/test_dir ] && rm -fr $DIR/test_dir
721         mkdir -p $DIR/test_dir 
722         mkdir -p $DIR/d32h/tmp    
723         TMP_DIR=$DIR/d32h/tmp       
724         ln -s $DIR/test_dir $TMP_DIR/symlink12 
725         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 
726         ls $DIR/d32h/tmp/symlink12 || error
727         ls $DIR/d32h/symlink02  || error
728 }
729 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/test_dir"
730
731 test_32i() {
732         [ -e $DIR/d32i ] && rm -fr $DIR/d32i
733         mkdir -p $DIR/d32i/ext2-mountpoint 
734         mount -t ext2 -o loop $EXT2_DEV $DIR/d32i/ext2-mountpoint || error
735         touch $DIR/d32i/test_file
736         $CHECKSTAT -t file $DIR/d32i/ext2-mountpoint/../test_file || error  
737         umount $DIR/d32i/ext2-mountpoint || error
738 }
739 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
740
741 test_32j() {
742         [ -e $DIR/d32j ] && rm -fr $DIR/d32j
743         mkdir -p $DIR/d32j/ext2-mountpoint 
744         mount -t ext2 -o loop $EXT2_DEV $DIR/d32j/ext2-mountpoint || error
745         touch $DIR/d32j/test_file
746         cat $DIR/d32j/ext2-mountpoint/../test_file || error
747         umount $DIR/d32j/ext2-mountpoint || error
748 }
749 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
750
751 test_32k() {
752         rm -fr $DIR/d32k
753         mkdir -p $DIR/d32k/ext2-mountpoint 
754         mount -t ext2 -o loop $EXT2_DEV $DIR/d32k/ext2-mountpoint  
755         mkdir -p $DIR/d32k/d2
756         touch $DIR/d32k/d2/test_file || error
757         $CHECKSTAT -t file $DIR/d32k/ext2-mountpoint/../d2/test_file || error
758         umount $DIR/d32k/ext2-mountpoint || error
759 }
760 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
761
762 test_32l() {
763         rm -fr $DIR/d32l
764         mkdir -p $DIR/d32l/ext2-mountpoint 
765         mount -t ext2 -o loop $EXT2_DEV $DIR/d32l/ext2-mountpoint || error
766         mkdir -p $DIR/d32l/d2
767         touch $DIR/d32l/d2/test_file
768         cat  $DIR/d32l/ext2-mountpoint/../d2/test_file || error
769         umount $DIR/d32l/ext2-mountpoint || error
770 }
771 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
772
773 test_32m() {
774         rm -fr $DIR/d32m
775         mkdir -p $DIR/d32m/tmp    
776         TMP_DIR=$DIR/d32m/tmp       
777         ln -s $DIR $TMP_DIR/symlink11 
778         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 
779         $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 || error
780         $CHECKSTAT -t link $DIR/d32m/symlink01 || error
781 }
782 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
783
784 test_32n() {
785         rm -fr $DIR/d32n
786         mkdir -p $DIR/d32n/tmp    
787         TMP_DIR=$DIR/d32n/tmp       
788         ln -s $DIR $TMP_DIR/symlink11 
789         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 
790         ls -l $DIR/d32n/tmp/symlink11  || error
791         ls -l $DIR/d32n/symlink01 || error
792 }
793 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
794
795 test_32o() {
796         rm -fr $DIR/d32o
797         rm -f $DIR/test_file
798         touch $DIR/test_file 
799         mkdir -p $DIR/d32o/tmp    
800         TMP_DIR=$DIR/d32o/tmp       
801         ln -s $DIR/test_file $TMP_DIR/symlink12 
802         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 
803         $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 || error
804         $CHECKSTAT -t link $DIR/d32o/symlink02 || error
805         $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 || error
806         $CHECKSTAT -t file -f $DIR/d32o/symlink02 || error
807 }
808 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/test_file"
809
810 test_32p() {
811         rm -fr $DIR/d32p
812         rm -f $DIR/test_file
813         touch $DIR/test_file 
814         mkdir -p $DIR/d32p/tmp    
815         TMP_DIR=$DIR/d32p/tmp       
816         ln -s $DIR/test_file $TMP_DIR/symlink12 
817         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 
818         cat $DIR/d32p/tmp/symlink12 || error
819         cat $DIR/d32p/symlink02  || error
820 }
821 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/test_file"
822
823 test_32q() {
824         [ -e $DIR/d32q ] && rm -fr $DIR/d32q
825         mkdir -p $DIR/d32q
826         mount -t ext2 -o loop $EXT2_DEV $DIR/d32q
827         ls $DIR/d32q || error
828         umount $DIR/d32q || error
829 }
830 run_test 32q "ls a mounted file system ========================="
831
832 #   chmod 444 /mnt/lustre/somefile
833 #   open(/mnt/lustre/somefile, O_RDWR)
834 #   Should return -1
835 test_33() {
836         rm -f $DIR/test_33_file
837         touch $DIR/test_33_file
838         chmod 444 $DIR/test_33_file
839         chown $RUNAS_ID $DIR/test_33_file
840         $RUNAS $OPENFILE -f O_RDWR $DIR/test_33_file && error || true
841 }
842 run_test 33 "write file with mode 444 (should return error) ===="
843
844 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
845 test_34a() {
846         rm -f $DIR/test_34_file
847         $MCREATE $DIR/test_34_file || error
848         $LFIND $DIR/test_34_file | grep -q "Has no stripe information" || error
849         $TRUNCATE $DIR/test_34_file $TEST_34_SIZE || error
850         $LFIND $DIR/test_34_file | grep -q "Has no stripe information" || error
851         $CHECKSTAT -s $TEST_34_SIZE $DIR/test_34_file || error
852 }
853 run_test 34a "truncate file that has not been opened ==========="
854
855 test_34b() {
856         $CHECKSTAT -s $TEST_34_SIZE $DIR/test_34_file || error
857         $OPENFILE -f O_RDONLY $DIR/test_34_file
858         $LFIND $DIR/test_34_file | grep -q "Has no stripe information" || error
859         $CHECKSTAT -s $TEST_34_SIZE $DIR/test_34_file || error
860 }
861 run_test 34b "O_RDONLY opening file doesn't create objects ====="
862
863 test_34c() {
864         $CHECKSTAT -s $TEST_34_SIZE $DIR/test_34_file || error
865         $OPENFILE -f O_RDWR $DIR/test_34_file
866         $LFIND $DIR/test_34_file | grep -q "Has no stripe information" && error
867         $CHECKSTAT -s $TEST_34_SIZE $DIR/test_34_file || error
868 }
869 run_test 34c "O_RDWR opening file-with-size works =============="
870
871 test_34d() {
872         dd if=/dev/zero of=$DIR/test_34_file conv=notrunc bs=4k count=1 || error
873         $CHECKSTAT -s $TEST_34_SIZE $DIR/test_34_file || error
874         rm $DIR/test_34_file
875 }
876 run_test 34d "write to sparse file ============================="
877
878 test_34e() {
879         rm -f $DIR/test_34_file
880         $MCREATE $DIR/test_34_file || error
881         $TRUNCATE $DIR/test_34_file 1000 || error
882         $CHECKSTAT -s 1000 $DIR/test_34_file || error
883         $OPENFILE -f O_RDWR $DIR/test_34_file
884         $CHECKSTAT -s 1000 $DIR/test_34_file || error
885 }
886 run_test 34e "create objects, some with size and some without =="
887
888 test_35() {
889         cp /bin/sh $DIR/test_35_file
890         chmod 444 $DIR/test_35_file
891         chown $RUNAS_ID $DIR/test_35_file
892         $DIR/test_35_file && error || true
893         rm $DIR/test_35_file
894 }
895 run_test 35 "exec file with mode 444 (should return error) ====="
896
897 test_36a() {
898         sleep 1         # we need a rest, or UMLs clock becomes skewed
899         rm -f $DIR/test_36_file
900         utime $DIR/test_36_file || error
901 }
902 run_test 36a "MDS utime check (mknod, utime) ==================="
903
904 test_36b() {
905         sleep 1
906         echo "" > $DIR/test_36_file
907         utime $DIR/test_36_file || error
908 }
909 run_test 36b "OST utime check (open, utime) ===================="
910
911 test_36c() {
912         sleep 1
913         rm -f $DIR/d36/test_36_file
914         mkdir $DIR/d36
915         chown $RUNAS_ID $DIR/d36
916         $RUNAS utime $DIR/d36/test_36_file || error
917 }
918 run_test 36c "non-root MDS utime check (mknod, utime) =========="
919
920 test_36d() {
921         sleep 1
922         echo "" > $DIR/d36/test_36_file
923         $RUNAS utime $DIR/d36/test_36_file || error
924 }
925 run_test 36d "non-root OST utime check (open, utime) ==========="
926
927 test_36e() {
928         sleep 1
929         [ $RUNAS_ID -eq $UID ] && return
930         touch $DIR/d36/test_36_file2
931         $RUNAS utime $DIR/d36/test_36_file2 && error || true
932 }
933 run_test 36e "utime on non-owned file (should return error) ===="
934
935 test_37() {
936         mkdir -p $DIR/dextra
937         echo f > $DIR/dextra/fbugfile
938         mount -t ext2 -o loop $EXT2_DEV $DIR/dextra
939         ls $DIR/dextra | grep "\<fbugfile\>" && error
940         umount $DIR/dextra || error
941         rm -f $DIR/dextra/fbugfile || error
942 }
943 run_test 37 "ls a mounted file system to check old content ====="
944
945 # open(file, O_DIRECTORY) will leak a request and not cleanup (bug 1501)
946 test_38() {
947         o_directory $DIR/test38
948 }
949 run_test 38 "open a regular file with O_DIRECTORY =============="
950
951 test_39() {
952         touch $DIR/test_39_file
953         touch $DIR/test_39_file2
954 #       ls -l  $DIR/test_39_file $DIR/test_39_file2
955 #       ls -lu  $DIR/test_39_file $DIR/test_39_file2
956 #       ls -lc  $DIR/test_39_file $DIR/test_39_file2
957         sleep 2
958         $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/test_39_file2
959 #       ls -l  $DIR/test_39_file $DIR/test_39_file2
960 #       ls -lu  $DIR/test_39_file $DIR/test_39_file2
961 #       ls -lc  $DIR/test_39_file $DIR/test_39_file2
962         [ $DIR/test_39_file2 -nt $DIR/test_39_file ] || error
963 }
964 run_test 39 "mtime changed on create ==========================="
965
966 test_40() {
967         dd if=/dev/zero of=$DIR/f40 bs=4096 count=1
968         $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/f40 && error
969         $CHECKSTAT -t file -s 4096 $DIR/f40 || error
970 }
971 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
972
973 test_41() {
974         # bug 1553
975         small_write $DIR/f41 18
976 }
977 run_test 41 "test small file write + fstat ====================="
978
979 # on the LLNL clusters, runas will still pick up root's $TMP settings,
980 # which will not be writable for the runas user, and then you get a CVS
981 # error message with a corrupt path string (CVS bug) and panic.
982 # We're not using much space, so just stick it in /tmp, which is safe.
983 OLDTMPDIR=$TMPDIR
984 OLDTMP=$TMP
985 TMPDIR=/tmp
986 TMP=/tmp
987 OLDHOME=$HOME
988 [ $RUNAS_ID -ne $UID ] && HOME=/tmp
989
990 test_99a() {
991         echo 99 "cvs operations ===================================="
992         mkdir -p $DIR/d99cvsroot
993         chown $RUNAS_ID $DIR/d99cvsroot
994         $RUNAS cvs -d $DIR/d99cvsroot init || error
995 }
996 run_test 99a "cvs init ========================================="
997
998 test_99b() {
999         cd /etc/init.d
1000         $RUNAS cvs -d $DIR/d99cvsroot import -m "nomesg" d99reposname vtag rtag
1001 }
1002 run_test 99b "cvs import ======================================="
1003
1004 test_99c() {
1005         cd $DIR
1006         mkdir -p $DIR/d99reposname
1007         chown $RUNAS_ID $DIR/d99reposname
1008         $RUNAS cvs -d $DIR/d99cvsroot co d99reposname
1009 }
1010 run_test 99c "cvs checkout ====================================="
1011
1012 test_99d() {
1013         cd $DIR/d99reposname
1014         $RUNAS touch foo99
1015         $RUNAS cvs add -m 'addmsg' foo99
1016 }
1017 run_test 99d "cvs add =========================================="
1018
1019 test_99e() {
1020         cd $DIR/d99reposname
1021         $RUNAS cvs update
1022 }
1023 run_test 99e "cvs update ======================================="
1024
1025 test_99f() {
1026         cd $DIR/d99reposname
1027         $RUNAS cvs commit -m 'nomsg' foo99
1028 }
1029 run_test 99f "cvs commit ======================================="
1030
1031 TMPDIR=$OLDTMPDIR
1032 TMP=$OLDTMP
1033 HOME=$OLDHOME
1034
1035 log "cleanup: ======================================================"
1036 rm -rf $DIR/[Rdfs][1-9]*
1037 if [ "$I_MOUNTED" = "yes" ]; then
1038         sh llmountcleanup.sh || error
1039 fi
1040
1041 echo '=========================== finished ==============================='