Whamcloud - gitweb
Branch b1_6
[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 # bug number for skipped test: 4900 4900 2108 9789 3637 9789 3561 5188/5749 10764
11 ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"27o 27q  42a  42b  42c  42d  45   68        75"}
12 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
13
14 [ "$SLOW" = "no" ] && EXCEPT="$EXCEPT 24o 27m 36f 36g 51b 51c 60c 63 64b 71 73 101 103 115 120g"
15
16 # Tests that fail on uml, maybe elsewhere, FIXME
17 CPU=`awk '/model/ {print $4}' /proc/cpuinfo`
18 #                                    buffer i/o errs             sock spc runas
19 [ "$CPU" = "UML" ] && EXCEPT="$EXCEPT 27m 27n 27o 27p 27q 27r 31d 54a  64b 99a 99b 99c 99d 99e 99f 101"
20
21 case `uname -r` in
22 2.4*) FSTYPE=${FSTYPE:-ext3};    ALWAYS_EXCEPT="$ALWAYS_EXCEPT 76"
23         [ "$CPU" = "UML" ] && ALWAYS_EXCEPT="$ALWAYS_EXCEPT 105a";;
24 2.6*) FSTYPE=${FSTYPE:-ldiskfs}; ALWAYS_EXCEPT="$ALWAYS_EXCEPT " ;;
25 *) error "unsupported kernel" ;;
26 esac
27
28 SRCDIR=`dirname $0`
29 export PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH:/sbin
30
31 TMP=${TMP:-/tmp}
32
33 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
34 CREATETEST=${CREATETEST:-createtest}
35 LFS=${LFS:-lfs}
36 SETSTRIPE=${SETSTRIPE:-"$LFS setstripe"}
37 GETSTRIPE=${GETSTRIPE:-"$LFS getstripe"}
38 LSTRIPE=${LSTRIPE:-"$LFS setstripe"}
39 LFIND=${LFIND:-"$LFS find"}
40 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
41 LSTRIPEINFO=${LSTRIPEINFO:-ll_getstripe_info}
42 LCTL=${LCTL:-lctl}
43 MCREATE=${MCREATE:-mcreate}
44 OPENFILE=${OPENFILE:-openfile}
45 OPENUNLINK=${OPENUNLINK:-openunlink}
46 RANDOM_READS=${RANDOM_READS:-"random-reads"}
47 TOEXCL=${TOEXCL:-toexcl}
48 TRUNCATE=${TRUNCATE:-truncate}
49 MUNLINK=${MUNLINK:-munlink}
50 SOCKETSERVER=${SOCKETSERVER:-socketserver}
51 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
52 IOPENTEST1=${IOPENTEST1:-iopentest1}
53 IOPENTEST2=${IOPENTEST2:-iopentest2}
54 MEMHOG=${MEMHOG:-memhog}
55 DIRECTIO=${DIRECTIO:-directio}
56 ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
57 UMOUNT=${UMOUNT:-"umount -d"}
58
59 if [ $UID -ne 0 ]; then
60         echo "Warning: running as non-root uid $UID"
61         RUNAS_ID="$UID"
62         RUNAS=""
63 else
64         RUNAS_ID=${RUNAS_ID:-500}
65         RUNAS=${RUNAS:-"runas -u $RUNAS_ID"}
66
67         # $RUNAS_ID may get set incorrectly somewhere else
68         if [ $RUNAS_ID -eq 0 ]; then
69                 echo "Error: \$RUNAS_ID set to 0, but \$UID is also 0!"
70                 exit 1
71         fi
72 fi
73
74 SANITYLOG=${SANITYLOG:-$TMP/sanity.log}
75
76 export NAME=${NAME:-local}
77
78 SAVE_PWD=$PWD
79
80 LUSTRE=${LUSTRE:-`dirname $0`/..}
81 . $LUSTRE/tests/test-framework.sh
82 init_test_env $@
83 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
84
85 cleanup() {
86         echo -n "cln.."
87         pgrep ll_sa > /dev/null && { echo "There are ll_sa thread not exit!"; exit 20; }
88         cleanupall ${FORCE} $* || { echo "FAILed to clean up"; exit 20; }
89 }
90 CLEANUP=${CLEANUP:-:}
91
92 setup() {
93         echo -n "mnt.."
94         load_modules
95         setupall || exit 10
96         echo "done"
97 }
98 SETUP=${SETUP:-:}
99
100 log() {
101         echo "$*"
102         $LCTL mark "$*" 2> /dev/null || true
103 }
104
105 trace() {
106         log "STARTING: $*"
107         strace -o $TMP/$1.strace -ttt $*
108         RC=$?
109         log "FINISHED: $*: rc $RC"
110         return 1
111 }
112 TRACE=${TRACE:-""}
113
114 check_kernel_version() {
115         VERSION_FILE=$LPROC/version
116         WANT_VER=$1
117         [ ! -f $VERSION_FILE ] && echo "can't find kernel version" && return 1
118         GOT_VER=$(awk '/kernel:/ {print $2}' $VERSION_FILE)
119         [ $GOT_VER == "patchless" ] && return 0
120         [ $GOT_VER -ge $WANT_VER ] && return 0
121         log "test needs at least kernel version $WANT_VER, running $GOT_VER"
122         return 1
123 }
124
125 _basetest() {
126     echo $*
127 }
128
129 basetest() {
130     IFS=abcdefghijklmnopqrstuvwxyz _basetest $1
131 }
132
133 run_one() {
134         if ! grep -q $DIR /proc/mounts; then
135                 $SETUP
136         fi
137         testnum=$1
138         message=$2
139         BEFORE=`date +%s`
140         log "== test $testnum: $message= `date +%H:%M:%S` ($BEFORE)"
141         export TESTNAME=test_$testnum
142         export tfile=f${testnum}
143         export tdir=d${base}
144         test_${testnum} || error "exit with rc=$?"
145         unset TESTNAME
146         pass "($((`date +%s` - $BEFORE))s)"
147         cd $SAVE_PWD
148         $CLEANUP
149 }
150
151 build_test_filter() {
152         [ "$ALWAYS_EXCEPT$EXCEPT$SANITY_EXCEPT" ] && \
153             echo "Skipping tests: `echo $ALWAYS_EXCEPT $EXCEPT $SANITY_EXCEPT`"
154
155         for O in $ONLY; do
156             eval ONLY_${O}=true
157         done
158         for E in $EXCEPT $ALWAYS_EXCEPT $SANITY_EXCEPT; do
159             eval EXCEPT_${E}=true
160         done
161 }
162
163 _basetest() {
164         echo $*
165 }
166
167 basetest() {
168         IFS=abcdefghijklmnopqrstuvwxyz _basetest $1
169 }
170
171 run_test() {
172          export base=`basetest $1`
173          if [ "$ONLY" ]; then
174                  testname=ONLY_$1
175                  if [ ${!testname}x != x ]; then
176                         run_one $1 "$2"
177                         return $?
178                  fi
179                  testname=ONLY_$base
180                  if [ ${!testname}x != x ]; then
181                          run_one $1 "$2"
182                          return $?
183                  fi
184                  echo -n "."
185                  return 0
186         fi
187         testname=EXCEPT_$1
188         if [ ${!testname}x != x ]; then
189                  TESTNAME=test_$1 skip "skipping excluded test $1"
190                  return 0
191         fi
192         testname=EXCEPT_$base
193         if [ ${!testname}x != x ]; then
194                  TESTNAME=test_$1 skip "skipping excluded test $1 (base $base)"
195                  return 0
196         fi
197         run_one $1 "$2"
198         return $?
199 }
200
201 [ "$SANITYLOG" ] && rm -f $SANITYLOG || true
202
203 error() { 
204         sysctl -w lustre.fail_loc=0
205         log "$0: FAIL: $TESTNAME $@"
206         $LCTL dk $TMP/lustre-log-$TESTNAME.log
207         if [ "$SANITYLOG" ]; then
208                 echo "$0: FAIL: $TESTNAME $@" >> $SANITYLOG
209         else
210                 exit 1
211         fi
212 }
213
214 pass() { 
215         echo PASS $@
216 }
217
218 skip () {
219         log "$0: SKIP: $TESTNAME $@"
220         [ "$SANITYLOG" ] && echo "$0: SKIP: $TESTNAME $@" >> $SANITYLOG
221
222 }
223
224 mounted_lustre_filesystems() {
225         awk '($3 ~ "lustre" && $1 ~ ":") { print $2 }' /proc/mounts
226 }
227
228 MOUNTED="`mounted_lustre_filesystems`"
229 if [ -z "$MOUNTED" ]; then
230         formatall
231         setupall
232         MOUNTED="`mounted_lustre_filesystems`"
233         [ -z "$MOUNTED" ] && error "NAME=$NAME not mounted"
234         I_MOUNTED=yes
235 fi
236
237 DIR=${DIR:-$MOUNT}
238 [ -z "`echo $DIR | grep $MOUNT`" ] && echo "$DIR not in $MOUNT" && exit 99
239
240 LOVNAME=`cat $LPROC/llite/*/lov/common_name | tail -n 1`
241 OSTCOUNT=`cat $LPROC/lov/$LOVNAME/numobd`
242 STRIPECOUNT=`cat $LPROC/lov/$LOVNAME/stripecount`
243 STRIPESIZE=`cat $LPROC/lov/$LOVNAME/stripesize`
244 ORIGFREE=`cat $LPROC/lov/$LOVNAME/kbytesavail`
245 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
246 MDS=$(\ls $LPROC/mds 2> /dev/null | grep -v num_refs | tail -n 1)
247
248 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
249 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
250 rm -rf $DIR/[Rdfs][1-9]*
251
252 build_test_filter
253
254 echo "preparing for tests involving mounts"
255 EXT2_DEV=${EXT2_DEV:-$TMP/SANITY.LOOP}
256 touch $EXT2_DEV
257 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
258 echo # add a newline after mke2fs.
259
260 umask 077
261
262 OLDDEBUG="`sysctl lnet.debug 2> /dev/null`"
263 sysctl -w lnet.debug=-1 2> /dev/null || true
264 test_0() {
265         touch $DIR/$tfile
266         $CHECKSTAT -t file $DIR/$tfile || error
267         rm $DIR/$tfile
268         $CHECKSTAT -a $DIR/$tfile || error
269 }
270 run_test 0 "touch .../$tfile ; rm .../$tfile ====================="
271
272 test_0b() {
273         chmod 0755 $DIR || error
274         $CHECKSTAT -p 0755 $DIR || error
275 }
276 run_test 0b "chmod 0755 $DIR ============================="
277
278 test_1a() {
279         mkdir $DIR/d1
280         mkdir $DIR/d1/d2
281         $CHECKSTAT -t dir $DIR/d1/d2 || error
282 }
283 run_test 1a "mkdir .../d1; mkdir .../d1/d2 ====================="
284
285 test_1b() {
286         rmdir $DIR/d1/d2
287         rmdir $DIR/d1
288         $CHECKSTAT -a $DIR/d1 || error
289 }
290 run_test 1b "rmdir .../d1/d2; rmdir .../d1 ====================="
291
292 test_2a() {
293         mkdir $DIR/d2
294         touch $DIR/d2/f
295         $CHECKSTAT -t file $DIR/d2/f || error
296 }
297 run_test 2a "mkdir .../d2; touch .../d2/f ======================"
298
299 test_2b() {
300         rm -r $DIR/d2
301         $CHECKSTAT -a $DIR/d2 || error
302 }
303 run_test 2b "rm -r .../d2; checkstat .../d2/f ======================"
304
305 test_3a() {
306         mkdir $DIR/d3
307         $CHECKSTAT -t dir $DIR/d3 || error
308 }
309 run_test 3a "mkdir .../d3 ======================================"
310
311 test_3b() {
312         if [ ! -d $DIR/d3 ]; then
313                 mkdir $DIR/d3
314         fi
315         touch $DIR/d3/f
316         $CHECKSTAT -t file $DIR/d3/f || error
317 }
318 run_test 3b "touch .../d3/f ===================================="
319
320 test_3c() {
321         rm -r $DIR/d3
322         $CHECKSTAT -a $DIR/d3 || error
323 }
324 run_test 3c "rm -r .../d3 ======================================"
325
326 test_4a() {
327         mkdir $DIR/d4
328         $CHECKSTAT -t dir $DIR/d4 || error
329 }
330 run_test 4a "mkdir .../d4 ======================================"
331
332 test_4b() {
333         if [ ! -d $DIR/d4 ]; then
334                 mkdir $DIR/d4
335         fi
336         mkdir $DIR/d4/d2
337         $CHECKSTAT -t dir $DIR/d4/d2 || error
338 }
339 run_test 4b "mkdir .../d4/d2 ==================================="
340
341 test_5() {
342         mkdir $DIR/d5
343         mkdir $DIR/d5/d2
344         chmod 0707 $DIR/d5/d2
345         $CHECKSTAT -t dir -p 0707 $DIR/d5/d2 || error
346 }
347 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2 ============"
348
349 test_6a() {
350         touch $DIR/f6a
351         chmod 0666 $DIR/f6a || error
352         $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/f6a || error
353 }
354 run_test 6a "touch .../f6a; chmod .../f6a ======================"
355
356 test_6b() {
357         [ $RUNAS_ID -eq $UID ] && skip "RUNAS_ID = UID = $UID -- skipping" && return
358         if [ ! -f $DIR/f6a ]; then
359                 touch $DIR/f6a
360                 chmod 0666 $DIR/f6a
361         fi
362         $RUNAS chmod 0444 $DIR/f6a && error
363         $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/f6a || error
364 }
365 run_test 6b "$RUNAS chmod .../f6a (should return error) =="
366
367 test_6c() {
368         [ $RUNAS_ID -eq $UID ] && skip "RUNAS_ID = UID = $UID -- skipping" && return
369         touch $DIR/f6c
370         chown $RUNAS_ID $DIR/f6c || error
371         $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/f6c || error
372 }
373 run_test 6c "touch .../f6c; chown .../f6c ======================"
374
375 test_6d() {
376         [ $RUNAS_ID -eq $UID ] && skip "RUNAS_ID = UID = $UID -- skipping" && return
377         if [ ! -f $DIR/f6c ]; then
378                 touch $DIR/f6c
379                 chown $RUNAS_ID $DIR/f6c
380         fi
381         $RUNAS chown $UID $DIR/f6c && error
382         $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/f6c || error
383 }
384 run_test 6d "$RUNAS chown .../f6c (should return error) =="
385
386 test_6e() {
387         [ $RUNAS_ID -eq $UID ] && skip "RUNAS_ID = UID = $UID -- skipping" && return
388         touch $DIR/f6e
389         chgrp $RUNAS_ID $DIR/f6e || error
390         $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/f6e || error
391 }
392 run_test 6e "touch .../f6e; chgrp .../f6e ======================"
393
394 test_6f() {
395         [ $RUNAS_ID -eq $UID ] && skip "RUNAS_ID = UID = $UID -- skipping" && return
396         if [ ! -f $DIR/f6e ]; then
397                 touch $DIR/f6e
398                 chgrp $RUNAS_ID $DIR/f6e
399         fi
400         $RUNAS chgrp $UID $DIR/f6e && error
401         $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/f6e || error
402 }
403 run_test 6f "$RUNAS chgrp .../f6e (should return error) =="
404
405 test_6g() {
406         [ $RUNAS_ID -eq $UID ] && skip "RUNAS_ID = UID = $UID -- skipping" && return
407         mkdir $DIR/d6g || error
408         chmod 777 $DIR/d6g || error
409         $RUNAS mkdir $DIR/d6g/d || error
410         chmod g+s $DIR/d6g/d || error
411         mkdir $DIR/d6g/d/subdir
412         $CHECKSTAT -g \#$RUNAS_ID $DIR/d6g/d/subdir || error
413 }
414 run_test 6g "Is new dir in sgid dir inheriting group?"
415
416 test_6h() { # bug 7331
417         [ $RUNAS_ID -eq $UID ] && skip "RUNAS_ID = UID = $UID -- skipping" && return
418         touch $DIR/f6h || error "touch failed"
419         chown $RUNAS_ID:$RUNAS_ID $DIR/f6h || error "initial chown failed"
420         $RUNAS -G$RUNAS_ID chown $RUNAS_ID:0 $DIR/f6h && error "chown worked"
421         $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_ID $DIR/f6h || error
422 }
423 run_test 6h "$RUNAS chown RUNAS_ID.0 .../f6h (should return error)"
424
425 test_7a() {
426         mkdir $DIR/d7
427         $MCREATE $DIR/d7/f
428         chmod 0666 $DIR/d7/f
429         $CHECKSTAT -t file -p 0666 $DIR/d7/f || error
430 }
431 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
432
433 test_7b() {
434         if [ ! -d $DIR/d7 ]; then
435                 mkdir $DIR/d7
436         fi
437         $MCREATE $DIR/d7/f2
438         echo -n foo > $DIR/d7/f2
439         [ "`cat $DIR/d7/f2`" = "foo" ] || error
440         $CHECKSTAT -t file -s 3 $DIR/d7/f2 || error
441 }
442 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
443
444 test_8() {
445         mkdir $DIR/d8
446         touch $DIR/d8/f
447         chmod 0666 $DIR/d8/f
448         $CHECKSTAT -t file -p 0666 $DIR/d8/f || error
449 }
450 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
451
452 test_9() {
453         mkdir $DIR/d9
454         mkdir $DIR/d9/d2
455         mkdir $DIR/d9/d2/d3
456         $CHECKSTAT -t dir $DIR/d9/d2/d3 || error
457 }
458 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
459
460 test_10() {
461         mkdir $DIR/d10
462         mkdir $DIR/d10/d2
463         touch $DIR/d10/d2/f
464         $CHECKSTAT -t file $DIR/d10/d2/f || error
465 }
466 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
467
468 test_11() {
469         mkdir $DIR/d11
470         mkdir $DIR/d11/d2
471         chmod 0666 $DIR/d11/d2
472         chmod 0705 $DIR/d11/d2
473         $CHECKSTAT -t dir -p 0705 $DIR/d11/d2 || error
474 }
475 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
476
477 test_12() {
478         mkdir $DIR/d12
479         touch $DIR/d12/f
480         chmod 0666 $DIR/d12/f
481         chmod 0654 $DIR/d12/f
482         $CHECKSTAT -t file -p 0654 $DIR/d12/f || error
483 }
484 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
485
486 test_13() {
487         mkdir $DIR/d13
488         dd if=/dev/zero of=$DIR/d13/f count=10
489         >  $DIR/d13/f
490         $CHECKSTAT -t file -s 0 $DIR/d13/f || error
491 }
492 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
493
494 test_14() {
495         mkdir $DIR/d14
496         touch $DIR/d14/f
497         rm $DIR/d14/f
498         $CHECKSTAT -a $DIR/d14/f || error
499 }
500 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
501
502 test_15() {
503         mkdir $DIR/d15
504         touch $DIR/d15/f
505         mv $DIR/d15/f $DIR/d15/f2
506         $CHECKSTAT -t file $DIR/d15/f2 || error
507 }
508 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
509
510 test_16() {
511         mkdir $DIR/d16
512         touch $DIR/d16/f
513         rm -rf $DIR/d16/f
514         $CHECKSTAT -a $DIR/d16/f || error
515 }
516 run_test 16 "touch .../d16/f; rm -rf .../d16/f ================="
517
518 test_17a() {
519         mkdir -p $DIR/d17
520         touch $DIR/d17/f
521         ln -s $DIR/d17/f $DIR/d17/l-exist
522         ls -l $DIR/d17
523         $CHECKSTAT -l $DIR/d17/f $DIR/d17/l-exist || error
524         $CHECKSTAT -f -t f $DIR/d17/l-exist || error
525         rm -f $DIR/d17/l-exist
526         $CHECKSTAT -a $DIR/d17/l-exist || error
527 }
528 run_test 17a "symlinks: create, remove (real) =================="
529
530 test_17b() {
531         mkdir -p $DIR/d17
532         ln -s no-such-file $DIR/d17/l-dangle
533         ls -l $DIR/d17
534         $CHECKSTAT -l no-such-file $DIR/d17/l-dangle || error
535         $CHECKSTAT -fa $DIR/d17/l-dangle || error
536         rm -f $DIR/d17/l-dangle
537         $CHECKSTAT -a $DIR/d17/l-dangle || error
538 }
539 run_test 17b "symlinks: create, remove (dangling) =============="
540
541 test_17c() { # bug 3440 - don't save failed open RPC for replay
542         mkdir -p $DIR/d17
543         ln -s foo $DIR/d17/f17c
544         cat $DIR/d17/f17c && error "opened non-existent symlink" || true
545 }
546 run_test 17c "symlinks: open dangling (should return error) ===="
547
548 test_17d() {
549         mkdir -p $DIR/d17
550         ln -s foo $DIR/d17/f17d
551         touch $DIR/d17/f17d || error "creating to new symlink"
552 }
553 run_test 17d "symlinks: create dangling ========================"
554
555 test_18() {
556         touch $DIR/f
557         ls $DIR || error
558 }
559 run_test 18 "touch .../f ; ls ... =============================="
560
561 test_19a() {
562         touch $DIR/f19
563         ls -l $DIR
564         rm $DIR/f19
565         $CHECKSTAT -a $DIR/f19 || error
566 }
567 run_test 19a "touch .../f19 ; ls -l ... ; rm .../f19 ==========="
568
569 test_19b() {
570         ls -l $DIR/f19 && error || true
571 }
572 run_test 19b "ls -l .../f19 (should return error) =============="
573
574 test_19c() {
575         [ $RUNAS_ID -eq $UID ] && skip "RUNAS_ID = UID = $UID -- skipping" && return
576         $RUNAS touch $DIR/f19 && error || true
577 }
578 run_test 19c "$RUNAS touch .../f19 (should return error) =="
579
580 test_19d() {
581         cat $DIR/f19 && error || true
582 }
583 run_test 19d "cat .../f19 (should return error) =============="
584
585 test_20() {
586         touch $DIR/f
587         rm $DIR/f
588         log "1 done"
589         touch $DIR/f
590         rm $DIR/f
591         log "2 done"
592         touch $DIR/f
593         rm $DIR/f
594         log "3 done"
595         $CHECKSTAT -a $DIR/f || error
596 }
597 run_test 20 "touch .../f ; ls -l ... ==========================="
598
599 test_21() {
600         mkdir $DIR/d21
601         [ -f $DIR/d21/dangle ] && rm -f $DIR/d21/dangle
602         ln -s dangle $DIR/d21/link
603         echo foo >> $DIR/d21/link
604         cat $DIR/d21/dangle
605         $CHECKSTAT -t link $DIR/d21/link || error
606         $CHECKSTAT -f -t file $DIR/d21/link || error
607 }
608 run_test 21 "write to dangling link ============================"
609
610 test_22() {
611         WDIR=$DIR/$tdir
612         mkdir $WDIR
613         chown $RUNAS_ID $WDIR
614         (cd $WDIR || error "cd $WDIR failed";
615         $RUNAS tar cf - /etc/hosts /etc/sysconfig/network | \
616         $RUNAS tar xf -)
617         ls -lR $WDIR/etc || error "ls -lR $WDIR/etc failed"
618         $CHECKSTAT -t dir $WDIR/etc || error "checkstat -t dir failed"
619         $CHECKSTAT -u \#$RUNAS_ID $WDIR/etc || error "checkstat -u failed"
620 }
621 run_test 22 "unpack tar archive as non-root user ==============="
622
623 test_23() {
624         mkdir $DIR/d23
625         $TOEXCL $DIR/d23/f23
626         $TOEXCL -e $DIR/d23/f23 || error
627 }
628 run_test 23 "O_CREAT|O_EXCL in subdir =========================="
629
630 test_24a() {
631         echo '== rename sanity =============================================='
632         echo '-- same directory rename'
633         mkdir $DIR/R1
634         touch $DIR/R1/f
635         mv $DIR/R1/f $DIR/R1/g
636         $CHECKSTAT -t file $DIR/R1/g || error
637 }
638 run_test 24a "touch .../R1/f; rename .../R1/f .../R1/g ========="
639
640 test_24b() {
641         mkdir $DIR/R2
642         touch $DIR/R2/{f,g}
643         mv $DIR/R2/f $DIR/R2/g
644         $CHECKSTAT -a $DIR/R2/f || error
645         $CHECKSTAT -t file $DIR/R2/g || error
646 }
647 run_test 24b "touch .../R2/{f,g}; rename .../R2/f .../R2/g ====="
648
649 test_24c() {
650         mkdir $DIR/R3
651         mkdir $DIR/R3/f
652         mv $DIR/R3/f $DIR/R3/g
653         $CHECKSTAT -a $DIR/R3/f || error
654         $CHECKSTAT -t dir $DIR/R3/g || error
655 }
656 run_test 24c "mkdir .../R3/f; rename .../R3/f .../R3/g ========="
657
658 test_24d() {
659         mkdir $DIR/R4
660         mkdir $DIR/R4/{f,g}
661         mrename $DIR/R4/f $DIR/R4/g
662         $CHECKSTAT -a $DIR/R4/f || error
663         $CHECKSTAT -t dir $DIR/R4/g || error
664 }
665 run_test 24d "mkdir .../R4/{f,g}; rename .../R4/f .../R4/g ====="
666
667 test_24e() {
668         echo '-- cross directory renames --' 
669         mkdir $DIR/R5{a,b}
670         touch $DIR/R5a/f
671         mv $DIR/R5a/f $DIR/R5b/g
672         $CHECKSTAT -a $DIR/R5a/f || error
673         $CHECKSTAT -t file $DIR/R5b/g || error
674 }
675 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
676
677 test_24f() {
678         mkdir $DIR/R6{a,b}
679         touch $DIR/R6a/f $DIR/R6b/g
680         mv $DIR/R6a/f $DIR/R6b/g
681         $CHECKSTAT -a $DIR/R6a/f || error
682         $CHECKSTAT -t file $DIR/R6b/g || error
683 }
684 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
685
686 test_24g() {
687         mkdir $DIR/R7{a,b}
688         mkdir $DIR/R7a/d
689         mv $DIR/R7a/d $DIR/R7b/e
690         $CHECKSTAT -a $DIR/R7a/d || error
691         $CHECKSTAT -t dir $DIR/R7b/e || error
692 }
693 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R5b/e ======"
694
695 test_24h() {
696         mkdir $DIR/R8{a,b}
697         mkdir $DIR/R8a/d $DIR/R8b/e
698         mrename $DIR/R8a/d $DIR/R8b/e
699         $CHECKSTAT -a $DIR/R8a/d || error
700         $CHECKSTAT -t dir $DIR/R8b/e || error
701 }
702 run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
703
704 test_24i() {
705         echo "-- rename error cases"
706         mkdir $DIR/R9
707         mkdir $DIR/R9/a
708         touch $DIR/R9/f
709         mrename $DIR/R9/f $DIR/R9/a
710         $CHECKSTAT -t file $DIR/R9/f || error
711         $CHECKSTAT -t dir  $DIR/R9/a || error
712         $CHECKSTAT -a file $DIR/R9/a/f || error
713 }
714 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
715
716 test_24j() {
717         mkdir $DIR/R10
718         mrename $DIR/R10/f $DIR/R10/g
719         $CHECKSTAT -t dir $DIR/R10 || error
720         $CHECKSTAT -a $DIR/R10/f || error
721         $CHECKSTAT -a $DIR/R10/g || error
722 }
723 run_test 24j "source does not exist ============================" 
724
725 test_24k() {
726         mkdir $DIR/R11a $DIR/R11a/d
727         touch $DIR/R11a/f
728         mv $DIR/R11a/f $DIR/R11a/d
729         $CHECKSTAT -a $DIR/R11a/f || error
730         $CHECKSTAT -t file $DIR/R11a/d/f || error
731 }
732 run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
733
734 # bug 2429 - rename foo foo foo creates invalid file
735 test_24l() {
736         f="$DIR/f24l"
737         multiop $f OcNs || error
738 }
739 run_test 24l "Renaming a file to itself ========================"
740
741 test_24m() {
742         f="$DIR/f24m"
743         multiop $f OcLN ${f}2 ${f}2 || error "link ${f}2 ${f}2 failed"
744         # on ext3 this does not remove either the source or target files
745         # though the "expected" operation would be to remove the source
746         $CHECKSTAT -t file ${f} || error "${f} missing"
747         $CHECKSTAT -t file ${f}2 || error "${f}2 missing"
748 }
749 run_test 24m "Renaming a file to a hard link to itself ========="
750
751 test_24n() {
752     f="$DIR/f24n"
753     # this stats the old file after it was renamed, so it should fail
754     touch ${f}
755     $CHECKSTAT ${f}
756     mv ${f} ${f}.rename
757     $CHECKSTAT ${f}.rename
758     $CHECKSTAT -a ${f}
759 }
760 run_test 24n "Statting the old file after renaming (Posix rename 2)"
761
762 test_24o() {
763         check_kernel_version 37 || return 0
764         mkdir -p $DIR/d24o
765         rename_many -s random -v -n 10 $DIR/d24o
766 }
767 run_test 24o "rename of files during htree split ==============="
768
769 test_24p() {
770         mkdir $DIR/R12{a,b}
771         DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
772         mrename $DIR/R12a $DIR/R12b
773         $CHECKSTAT -a $DIR/R12a || error
774         $CHECKSTAT -t dir $DIR/R12b || error
775         DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
776         [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
777 }
778 run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
779
780 test_24q() {
781         mkdir $DIR/R13{a,b}
782         DIRINO=`ls -lid $DIR/R13a | awk '{ print $1 }'`
783         multiop $DIR/R13b D_c &
784         MULTIPID=$!
785         usleep 500
786
787         mrename $DIR/R13a $DIR/R13b
788         $CHECKSTAT -a $DIR/R13a || error
789         $CHECKSTAT -t dir $DIR/R13b || error
790         DIRINO2=`ls -lid $DIR/R13b | awk '{ print $1 }'`
791         [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
792         kill -USR1 $MULTIPID
793         wait $MULTIPID || error "multiop close failed"
794 }
795 run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
796
797 test_24r() { #bug 3789
798         mkdir $DIR/R14a $DIR/R14a/b
799         mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
800         $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
801         $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
802 }
803 run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
804
805 test_24s() {
806         mkdir $DIR/R15a $DIR/R15a/b $DIR/R15a/b/c
807         mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
808         $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
809         $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
810 }
811 run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
812 test_24t() {
813         mkdir $DIR/R16a $DIR/R16a/b $DIR/R16a/b/c
814         mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
815         $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
816         $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
817 }
818 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
819
820 test_25a() {
821         echo '== symlink sanity ============================================='
822
823         mkdir $DIR/d25
824         ln -s d25 $DIR/s25
825         touch $DIR/s25/foo || error
826 }
827 run_test 25a "create file in symlinked directory ==============="
828
829 test_25b() {
830         [ ! -d $DIR/d25 ] && test_25a
831         $CHECKSTAT -t file $DIR/s25/foo || error
832 }
833 run_test 25b "lookup file in symlinked directory ==============="
834
835 test_26a() {
836         mkdir $DIR/d26
837         mkdir $DIR/d26/d26-2
838         ln -s d26/d26-2 $DIR/s26
839         touch $DIR/s26/foo || error
840 }
841 run_test 26a "multiple component symlink ======================="
842
843 test_26b() {
844         mkdir -p $DIR/d26b/d26-2
845         ln -s d26b/d26-2/foo $DIR/s26-2
846         touch $DIR/s26-2 || error
847 }
848 run_test 26b "multiple component symlink at end of lookup ======"
849
850 test_26c() {
851         mkdir $DIR/d26.2
852         touch $DIR/d26.2/foo
853         ln -s d26.2 $DIR/s26.2-1
854         ln -s s26.2-1 $DIR/s26.2-2
855         ln -s s26.2-2 $DIR/s26.2-3
856         chmod 0666 $DIR/s26.2-3/foo
857 }
858 run_test 26c "chain of symlinks ================================"
859
860 # recursive symlinks (bug 439)
861 test_26d() {
862         ln -s d26-3/foo $DIR/d26-3
863 }
864 run_test 26d "create multiple component recursive symlink ======"
865
866 test_26e() {
867         [ ! -h $DIR/d26-3 ] && test_26d
868         rm $DIR/d26-3
869 }
870 run_test 26e "unlink multiple component recursive symlink ======"
871
872 # recursive symlinks (bug 7022)
873 test_26f() {
874         mkdir $DIR/$tfile        || error "mkdir $DIR/$tfile failed"
875         cd $DIR/$tfile           || error "cd $DIR/$tfile failed"
876         mkdir -p $tdir/bar1      || error "mkdir $tdir/bar1 failed"
877         mkdir $tfile             || error "mkdir $tfile failed"
878         cd $tfile                || error "cd $tfile failed"
879         ln -s .. dotdot          || error "ln dotdot failed"
880         ln -s dotdot/$tdir $tdir || error "ln $tdir failed"
881         cd ../..                 || error "cd ../.. failed"
882         output=`ls $tfile/$tfile/$tdir/bar1`
883         [ "$output" = bar1 ] && error "unexpected output"
884         rm -r $tfile             || error "rm $tfile failed"
885         $CHECKSTAT -a $DIR/$tfile || error "$tfile not gone"
886 }
887 run_test 26f "rm -r of a directory which has recursive symlink ="
888
889 test_27a() {
890         echo '== stripe sanity =============================================='
891         mkdir -p $DIR/d27 || error "mkdir failed"
892         $SETSTRIPE $DIR/d27/f0 65536 0 1 || error "lstripe failed"
893         $CHECKSTAT -t file $DIR/d27/f0 || error "checkstat failed"
894         pass
895         log "== test_27b: write to one stripe file ========================="
896         cp /etc/hosts $DIR/d27/f0 || error
897 }
898 run_test 27a "one stripe file =================================="
899
900 test_27c() {
901         [ "$OSTCOUNT" -lt "2" ] && skip "skipping 2-stripe test" && return
902         mkdir -p $DIR/d27
903         $SETSTRIPE $DIR/d27/f01 65536 0 2 || error "lstripe failed"
904         [ `$GETSTRIPE $DIR/d27/f01 | grep -A 10 obdidx | wc -l` -eq 4 ] ||
905                 error "two-stripe file doesn't have two stripes"
906         pass
907         log "== test_27d: write to two stripe file file f01 ================"
908         dd if=/dev/zero of=$DIR/d27/f01 bs=4k count=4 || error "dd failed"
909 }
910 run_test 27c "create two stripe file f01 ======================="
911
912 test_27d() {
913         mkdir -p $DIR/d27
914         $SETSTRIPE $DIR/d27/fdef 0 -1 0 || error "lstripe failed"
915         $CHECKSTAT -t file $DIR/d27/fdef || error "checkstat failed"
916         dd if=/dev/zero of=$DIR/d27/fdef bs=4k count=4 || error
917 }
918 run_test 27d "create file with default settings ================"
919
920 test_27e() {
921         mkdir -p $DIR/d27
922         $SETSTRIPE $DIR/d27/f12 65536 0 2 || error "lstripe failed"
923         $SETSTRIPE $DIR/d27/f12 65536 0 2 && error "lstripe succeeded twice"
924         $CHECKSTAT -t file $DIR/d27/f12 || error "checkstat failed"
925 }
926 run_test 27e "lstripe existing file (should return error) ======"
927
928 test_27f() {
929         mkdir -p $DIR/d27
930         $SETSTRIPE $DIR/d27/fbad 100 0 1 && error "lstripe failed"
931         dd if=/dev/zero of=$DIR/d27/f12 bs=4k count=4 || error "dd failed"
932         $GETSTRIPE $DIR/d27/fbad || error "lfs getstripe failed"
933 }
934 run_test 27f "lstripe with bad stripe size (should return error)"
935
936 test_27g() {
937         mkdir -p $DIR/d27
938         $MCREATE $DIR/d27/fnone || error "mcreate failed"
939         pass
940         log "== test 27h: lfs getstripe with no objects ===================="
941         $GETSTRIPE $DIR/d27/fnone 2>&1 | grep "no stripe info" || error "has object"
942         pass
943         log "== test 27i: lfs getstripe with some objects =================="
944         touch $DIR/d27/fsome || error "touch failed"
945         $GETSTRIPE $DIR/d27/fsome | grep obdidx || error "missing objects"
946 }
947 run_test 27g "test lfs getstripe ==========================================="
948
949 test_27j() {
950         mkdir -p $DIR/d27
951         $SETSTRIPE $DIR/d27/f27j 65536 $OSTCOUNT 1 && error "lstripe failed"||true
952 }
953 run_test 27j "lstripe with bad stripe offset (should return error)"
954
955 test_27k() { # bug 2844
956         mkdir -p $DIR/d27
957         FILE=$DIR/d27/f27k
958         LL_MAX_BLKSIZE=$((4 * 1024 * 1024))
959         [ ! -d $DIR/d27 ] && mkdir -p $DIR/d27
960         $SETSTRIPE $FILE 67108864 -1 0 || error "lstripe failed"
961         BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
962         [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "$BLKSIZE > $LL_MAX_BLKSIZE"
963         dd if=/dev/zero of=$FILE bs=4k count=1
964         BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
965         [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "$BLKSIZE > $LL_MAX_BLKSIZE"
966 }
967 run_test 27k "limit i_blksize for broken user apps ============="
968
969 test_27l() {
970         mkdir -p $DIR/d27
971         mcreate $DIR/f27l || error "creating file"
972         $RUNAS $SETSTRIPE $DIR/f27l 65536 -1 1 && \
973                 error "lstripe should have failed" || true
974 }
975 run_test 27l "check setstripe permissions (should return error)"
976
977 test_27m() {
978         [ "$OSTCOUNT" -lt "2" ] && skip "$OSTCOUNT < 2 OSTs -- skipping" && return
979         if [ $ORIGFREE -gt $MAXFREE ]; then
980                 skip "$ORIGFREE > $MAXFREE skipping out-of-space test on OST0"
981                 return
982         fi
983         mkdir -p $DIR/d27
984         $SETSTRIPE $DIR/d27/f27m_1 0 0 1
985         dd if=/dev/zero of=$DIR/d27/f27m_1 bs=1024 count=$MAXFREE && \
986                 error "dd should fill OST0"
987         i=2
988         while $SETSTRIPE $DIR/d27/f27m_$i 0 0 1 ; do
989                 i=`expr $i + 1`
990                 [ $i -gt 256 ] && break
991         done
992         i=`expr $i + 1`
993         touch $DIR/d27/f27m_$i
994         [ `$GETSTRIPE $DIR/d27/f27m_$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "0"` ] && \
995                 error "OST0 was full but new created file still use it"
996         i=`expr $i + 1`
997         touch $DIR/d27/f27m_$i
998         [ `$GETSTRIPE $DIR/d27/f27m_$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "0"` ] && \
999                 error "OST0 was full but new created file still use it"
1000         rm -r $DIR/d27
1001 }
1002 run_test 27m "create file while OST0 was full =================="
1003
1004 # osc's keep a NOSPC stick flag that gets unset with rmdir
1005 reset_enospc() {
1006         [ "$1" ] && FAIL_LOC=$1 || FAIL_LOC=0
1007         mkdir -p $DIR/d27/nospc
1008         rmdir $DIR/d27/nospc
1009         sysctl -w lustre.fail_loc=$FAIL_LOC
1010 }
1011
1012 exhaust_precreations() {
1013         OSTIDX=$1
1014         OST=$(grep ${OSTIDX}": " $LPROC/lov/${LOVNAME}/target_obd | \
1015             awk '{print $2}' | sed -e 's/_UUID$//')
1016         # on the mdt's osc
1017         last_id=$(cat $LPROC/osc/${OST}-osc/prealloc_last_id)
1018         next_id=$(cat $LPROC/osc/${OST}-osc/prealloc_next_id)
1019
1020         mkdir -p $DIR/d27/${OST}
1021         $SETSTRIPE $DIR/d27/${OST} 0 $OSTIDX 1
1022         #define OBD_FAIL_OST_ENOSPC 0x215
1023         sysctl -w lustre.fail_loc=0x215
1024         echo "Creating to objid $last_id on ost $OST..."
1025         createmany -o $DIR/d27/${OST}/f $next_id $((last_id - next_id + 2))
1026         grep '[0-9]' $LPROC/osc/${OST}-osc/prealloc*
1027         reset_enospc $2
1028 }
1029
1030 exhaust_all_precreations() {
1031         local i
1032         for (( i=0; i < OSTCOUNT; i++ )) ; do
1033                 exhaust_precreations $i 0x215
1034         done
1035         reset_enospc $1
1036 }
1037
1038 test_27n() {
1039         [ "$OSTCOUNT" -lt "2" -o -z "$MDS" ] && \
1040                 skip "too few OSTs, or remote MDS" && return
1041
1042         reset_enospc
1043         rm -f $DIR/d27/f27n
1044         exhaust_precreations 0 0x80000215
1045
1046         touch $DIR/d27/f27n || error
1047
1048         reset_enospc
1049 }
1050 run_test 27n "create file with some full OSTs =================="
1051
1052 test_27o() {
1053         [ "$OSTCOUNT" -lt "2" -o -z "$MDS" ] && \
1054                 skip "too few OSTs, or remote MDS" && return
1055
1056         reset_enospc
1057         rm -f $DIR/d27/f27o
1058         exhaust_all_precreations 0x215
1059         sleep 5
1060
1061         touch $DIR/d27/f27o && error "able to create $DIR/d27/f27o"
1062
1063         reset_enospc
1064 }
1065 run_test 27o "create file with all full OSTs (should error) ===="
1066
1067 test_27p() {
1068         [ "$OSTCOUNT" -lt "2" -o -z "$MDS" ] && \
1069                 skip "too few OSTs, or remote MDS" && return
1070
1071         reset_enospc
1072         rm -f $DIR/d27/f27p
1073
1074         $MCREATE $DIR/d27/f27p || error
1075         $TRUNCATE $DIR/d27/f27p 80000000 || error
1076         $CHECKSTAT -s 80000000 $DIR/d27/f27p || error
1077
1078         exhaust_precreations 0 0x80000215
1079         echo foo >> $DIR/d27/f27p || error
1080         $CHECKSTAT -s 80000004 $DIR/d27/f27p || error
1081
1082         reset_enospc
1083 }
1084 run_test 27p "append to a truncated file with some full OSTs ==="
1085
1086 test_27q() {
1087         [ "$OSTCOUNT" -lt "2" -o -z "$MDS" ] && \
1088                 skip "too few OSTs, or remote MDS" && return
1089
1090         reset_enospc
1091         rm -f $DIR/d27/f27q
1092
1093         $MCREATE $DIR/d27/f27q || error "mcreate $DIR/d27/f27q failed"
1094         $TRUNCATE $DIR/d27/f27q 80000000 ||error "truncate $DIR/d27/f27q failed"
1095         $CHECKSTAT -s 80000000 $DIR/d27/f27q || error "checkstat failed"
1096
1097         exhaust_all_precreations 0x215
1098
1099         echo foo >> $DIR/d27/f27q && error "append succeeded"
1100         $CHECKSTAT -s 80000000 $DIR/d27/f27q || error "checkstat 2 failed"
1101
1102         reset_enospc
1103 }
1104 run_test 27q "append to truncated file with all OSTs full (should error) ==="
1105
1106 test_27r() {
1107         [ "$OSTCOUNT" -lt "2" -o -z "$MDS" ] && \
1108                 skip "too few OSTs, or remote MDS" && return
1109
1110         reset_enospc
1111         rm -f $DIR/d27/f27r
1112         exhaust_precreations 0 0x80000215
1113
1114         $SETSTRIPE $DIR/d27/f27r 0 0 2 # && error
1115
1116         reset_enospc
1117 }
1118 run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ="
1119
1120 test_27s() { # bug 10725
1121         mkdir -p $DIR/$tdir
1122         $LSTRIPE $DIR/$tdir $((2048 * 1024 * 1024)) -1 2 && \
1123                 error "stripe width >= 2^32 succeeded" || true
1124 }
1125 run_test 27s "lsm_xfersize overflow (should error) (bug 10725)"
1126
1127 test_27t() { # bug 10864
1128         WDIR=`pwd`
1129         WLFS=`which lfs`
1130         cd $DIR
1131         touch $tfile
1132         $WLFS getstripe $tfile
1133         cd $WDIR
1134 }
1135 run_test 27t "check that utils parse path correctly"
1136
1137 test_27x() { # bug 10997
1138         mkdir -p $DIR/d27w || error "mkdir failed"
1139         $LSTRIPE $DIR/d27w/f0 -s 65536 || error "lstripe failed"
1140         size=`$LSTRIPEINFO $DIR/d27w/f0 | awk {'print $1'}`
1141         [ $size -ne 65536 ] && error "stripe size $size != 65536" || true
1142
1143         [ "$OSTCOUNT" -lt "2" ] && skip "skipping multiple stripe count/offset test" && return
1144         for i in `seq 1 $OSTCOUNT`; do
1145                 offset=$(($i-1))
1146                 $LSTRIPE $DIR/d27w/f$i -c $i -i $offset || error "lstripe -c $i -i $offset failed"
1147                 count=`$LSTRIPEINFO $DIR/d27w/f$i | awk {'print $2'}`
1148                 index=`$LSTRIPEINFO $DIR/d27w/f$i | awk {'print $3'}`
1149                 [ $count -ne $i ] && error "stripe count $count != $i" || true
1150                 [ $index -ne $offset ] && error "stripe offset $index != $offset" || true
1151         done
1152 }
1153 run_test 27x "check lfs setstripe -c -s -i options ============="
1154
1155 test_27u() { # bug 4900
1156         [ "$OSTCOUNT" -lt "2" -o -z "$MDS" ] && \
1157                 skip "too few OSTs, or remote MDS" && return
1158
1159         #define OBD_FAIL_MDS_OSC_PRECREATE      0x139
1160
1161         sysctl -w lustre.fail_loc=0x139
1162         mkdir -p $DIR/d27u
1163         createmany -o $DIR/d27u/t- 1000
1164         sysctl -w lustre.fail_loc=0
1165
1166         $LFS getstripe $DIR/d27u > $TMP/files
1167         OBJS=`cat $TMP/files | awk -vobjs=0 '($1 == 0) { objs += 1 } END { print objs;}'`
1168         unlinkmany $DIR/d27u/t- 1000
1169         [ $OBJS -gt 0 ] && \
1170                 error "Found $OBJS objects were created on OST-0" || pass
1171 }
1172 run_test 27u "skip object creation on OSC w/o objects =========="
1173
1174 test_27v() { # bug 4900
1175         [ "$OSTCOUNT" -lt "2" -o -z "$MDS" ] && \
1176                 skip "too few OSTs, or remote MDS" && return
1177
1178         exhaust_all_precreations
1179
1180         mkdir -p $DIR/$tdir
1181         lfs setstripe $DIR/$tdir 0 -1 1         # 1 stripe / file
1182
1183         touch $DIR/$tdir/$tfile
1184         #define OBD_FAIL_TGT_DELAY_PRECREATE     0x705
1185         sysctl -w lustre.fail_loc=0x705
1186         START=`date +%s`
1187         for F in `seq 1 32`; do
1188                 touch $DIR/$tdir/$tfile.$F
1189         done
1190         sysctl -w lustre.fail_loc=0
1191
1192         FINISH=`date +%s`
1193         TIMEOUT=`sysctl -n lustre.timeout`
1194         [ $((FINISH - START)) -ge $((TIMEOUT / 2)) ] && \
1195                error "$FINISH - $START >= $TIMEOUT / 2"
1196
1197         reset_enospc
1198 }
1199 run_test 27v "skip object creation on slow OST ================="
1200
1201 test_28() {
1202         mkdir $DIR/d28
1203         $CREATETEST $DIR/d28/ct || error
1204 }
1205 run_test 28 "create/mknod/mkdir with bad file types ============"
1206
1207 test_29() {
1208         cancel_lru_locks mdc
1209         mkdir $DIR/d29
1210         touch $DIR/d29/foo
1211         log 'first d29'
1212         ls -l $DIR/d29
1213         MDCDIR=${MDCDIR:-`find $LPROC/ldlm/namespaces | grep mdc | head -1`}
1214         LOCKCOUNTORIG=`cat $MDCDIR/lock_count`
1215         LOCKUNUSEDCOUNTORIG=`cat $MDCDIR/lock_unused_count`
1216         [ -z $"LOCKCOUNTORIG" ] && echo "No mdc lock count" && return 1
1217         log 'second d29'
1218         ls -l $DIR/d29
1219         log 'done'
1220         LOCKCOUNTCURRENT=`cat $MDCDIR/lock_count`
1221         LOCKUNUSEDCOUNTCURRENT=`cat $MDCDIR/lock_unused_count`
1222         if [ "$LOCKCOUNTCURRENT" -gt "$LOCKCOUNTORIG" ]; then
1223                 echo > $LPROC/ldlm/dump_namespaces
1224                 error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
1225                 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
1226                 log "dumped log to $TMP/test_29.dk (bug 5793)"
1227                 return 2
1228         fi
1229         if [ "$LOCKUNUSEDCOUNTCURRENT" -gt "$LOCKUNUSEDCOUNTORIG" ]; then
1230                 error "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
1231                 $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
1232                 log "dumped log to $TMP/test_29.dk (bug 5793)"
1233                 return 3
1234         fi
1235 }
1236 run_test 29 "IT_GETATTR regression  ============================"
1237
1238 test_30() {
1239         cp `which ls` $DIR
1240         $DIR/ls /
1241         rm $DIR/ls
1242 }
1243 run_test 30 "run binary from Lustre (execve) ==================="
1244
1245 test_31a() {
1246         $OPENUNLINK $DIR/f31 $DIR/f31 || error
1247         $CHECKSTAT -a $DIR/f31 || error
1248 }
1249 run_test 31a "open-unlink file =================================="
1250
1251 test_31b() {
1252         touch $DIR/f31 || error
1253         ln $DIR/f31 $DIR/f31b || error
1254         multiop $DIR/f31b Ouc || error
1255         $CHECKSTAT -t file $DIR/f31 || error
1256 }
1257 run_test 31b "unlink file with multiple links while open ======="
1258
1259 test_31c() {
1260         touch $DIR/f31 || error
1261         ln $DIR/f31 $DIR/f31c || error
1262         multiop $DIR/f31 O_uc &
1263         MULTIPID=$!
1264         multiop $DIR/f31c Ouc
1265         usleep 500
1266         kill -USR1 $MULTIPID
1267         wait $MULTIPID
1268 }
1269 run_test 31c "open-unlink file with multiple links ============="
1270
1271 test_31d() {
1272         opendirunlink $DIR/d31d $DIR/d31d || error
1273         $CHECKSTAT -a $DIR/d31d || error
1274 }
1275 run_test 31d "remove of open directory ========================="
1276
1277 test_31e() { # bug 2904
1278         check_kernel_version 34 || return 0
1279         openfilleddirunlink $DIR/d31e || error
1280 }
1281 run_test 31e "remove of open non-empty directory ==============="
1282
1283 test_31f() { # bug 4554
1284         set -vx
1285         mkdir $DIR/d31f
1286         lfs setstripe $DIR/d31f 1048576 -1 1
1287         cp /etc/hosts $DIR/d31f
1288         ls -l $DIR/d31f
1289         lfs getstripe $DIR/d31f/hosts
1290         multiop $DIR/d31f D_c &
1291         MULTIPID=$!
1292
1293         sleep 1
1294
1295         rm -rv $DIR/d31f || error "first of $DIR/d31f"
1296         mkdir $DIR/d31f
1297         lfs setstripe $DIR/d31f 1048576 -1 1
1298         cp /etc/hosts $DIR/d31f
1299         ls -l $DIR/d31f
1300         lfs getstripe $DIR/d31f/hosts
1301         multiop $DIR/d31f D_c &
1302         MULTIPID2=$!
1303
1304         sleep 6
1305
1306         kill -USR1 $MULTIPID || error "first opendir $MULTIPID not running"
1307         wait $MULTIPID || error "first opendir $MULTIPID failed"
1308
1309         sleep 6
1310
1311         kill -USR1 $MULTIPID2 || error "second opendir $MULTIPID not running"
1312         wait $MULTIPID2 || error "second opendir $MULTIPID2 failed"
1313         set +vx
1314 }
1315 run_test 31f "remove of open directory with open-unlink file ==="
1316
1317 test_32a() {
1318         echo "== more mountpoints and symlinks ================="
1319         [ -e $DIR/d32a ] && rm -fr $DIR/d32a
1320         mkdir -p $DIR/d32a/ext2-mountpoint 
1321         mount -t ext2 -o loop $EXT2_DEV $DIR/d32a/ext2-mountpoint || error
1322         $CHECKSTAT -t dir $DIR/d32a/ext2-mountpoint/.. || error  
1323         $UMOUNT $DIR/d32a/ext2-mountpoint || error
1324 }
1325 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
1326
1327 test_32b() {
1328         [ -e $DIR/d32b ] && rm -fr $DIR/d32b
1329         mkdir -p $DIR/d32b/ext2-mountpoint 
1330         mount -t ext2 -o loop $EXT2_DEV $DIR/d32b/ext2-mountpoint || error
1331         ls -al $DIR/d32b/ext2-mountpoint/.. || error
1332         $UMOUNT $DIR/d32b/ext2-mountpoint || error
1333 }
1334 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
1335  
1336 test_32c() {
1337         [ -e $DIR/d32c ] && rm -fr $DIR/d32c
1338         mkdir -p $DIR/d32c/ext2-mountpoint 
1339         mount -t ext2 -o loop $EXT2_DEV $DIR/d32c/ext2-mountpoint || error
1340         mkdir -p $DIR/d32c/d2/test_dir    
1341         $CHECKSTAT -t dir $DIR/d32c/ext2-mountpoint/../d2/test_dir || error
1342         $UMOUNT $DIR/d32c/ext2-mountpoint || error
1343 }
1344 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
1345
1346 test_32d() {
1347         [ -e $DIR/d32d ] && rm -fr $DIR/d32d
1348         mkdir -p $DIR/d32d/ext2-mountpoint 
1349         mount -t ext2 -o loop $EXT2_DEV $DIR/d32d/ext2-mountpoint || error
1350         mkdir -p $DIR/d32d/d2/test_dir    
1351         ls -al $DIR/d32d/ext2-mountpoint/../d2/test_dir || error
1352         $UMOUNT $DIR/d32d/ext2-mountpoint || error
1353 }
1354 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir ========="
1355
1356 test_32e() {
1357         [ -e $DIR/d32e ] && rm -fr $DIR/d32e
1358         mkdir -p $DIR/d32e/tmp    
1359         TMP_DIR=$DIR/d32e/tmp       
1360         ln -s $DIR/d32e $TMP_DIR/symlink11 
1361         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 
1362         $CHECKSTAT -t link $DIR/d32e/tmp/symlink11 || error
1363         $CHECKSTAT -t link $DIR/d32e/symlink01 || error
1364 }
1365 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir ===="
1366
1367 test_32f() {
1368         [ -e $DIR/d32f ] && rm -fr $DIR/d32f
1369         mkdir -p $DIR/d32f/tmp    
1370         TMP_DIR=$DIR/d32f/tmp       
1371         ln -s $DIR/d32f $TMP_DIR/symlink11 
1372         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 
1373         ls $DIR/d32f/tmp/symlink11  || error
1374         ls $DIR/d32f/symlink01 || error
1375 }
1376 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir ===="
1377
1378 test_32g() {
1379         TMP_DIR=$DIR/$tdir/tmp       
1380         mkdir -p $TMP_DIR $DIR/${tdir}2
1381         ln -s $DIR/${tdir}2 $TMP_DIR/symlink12 
1382         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 
1383         $CHECKSTAT -t link $TMP_DIR/symlink12 || error
1384         $CHECKSTAT -t link $DIR/$tdir/symlink02 || error
1385         $CHECKSTAT -t dir -f $TMP_DIR/symlink12 || error
1386         $CHECKSTAT -t dir -f $DIR/$tdir/symlink02 || error
1387 }
1388 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/${tdir}2"
1389
1390 test_32h() {
1391         rm -fr $DIR/$tdir $DIR/${tdir}2
1392         TMP_DIR=$DIR/$tdir/tmp       
1393         mkdir -p $TMP_DIR $DIR/${tdir}2 
1394         ln -s $DIR/${tdir}2 $TMP_DIR/symlink12 
1395         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 
1396         ls $TMP_DIR/symlink12 || error
1397         ls $DIR/$tdir/symlink02  || error
1398 }
1399 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/${tdir}2"
1400
1401 test_32i() {
1402         [ -e $DIR/d32i ] && rm -fr $DIR/d32i
1403         mkdir -p $DIR/d32i/ext2-mountpoint 
1404         mount -t ext2 -o loop $EXT2_DEV $DIR/d32i/ext2-mountpoint || error
1405         touch $DIR/d32i/test_file
1406         $CHECKSTAT -t file $DIR/d32i/ext2-mountpoint/../test_file || error  
1407         $UMOUNT $DIR/d32i/ext2-mountpoint || error
1408 }
1409 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
1410
1411 test_32j() {
1412         [ -e $DIR/d32j ] && rm -fr $DIR/d32j
1413         mkdir -p $DIR/d32j/ext2-mountpoint 
1414         mount -t ext2 -o loop $EXT2_DEV $DIR/d32j/ext2-mountpoint || error
1415         touch $DIR/d32j/test_file
1416         cat $DIR/d32j/ext2-mountpoint/../test_file || error
1417         $UMOUNT $DIR/d32j/ext2-mountpoint || error
1418 }
1419 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
1420
1421 test_32k() {
1422         rm -fr $DIR/d32k
1423         mkdir -p $DIR/d32k/ext2-mountpoint 
1424         mount -t ext2 -o loop $EXT2_DEV $DIR/d32k/ext2-mountpoint  
1425         mkdir -p $DIR/d32k/d2
1426         touch $DIR/d32k/d2/test_file || error
1427         $CHECKSTAT -t file $DIR/d32k/ext2-mountpoint/../d2/test_file || error
1428         $UMOUNT $DIR/d32k/ext2-mountpoint || error
1429 }
1430 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
1431
1432 test_32l() {
1433         rm -fr $DIR/d32l
1434         mkdir -p $DIR/d32l/ext2-mountpoint 
1435         mount -t ext2 -o loop $EXT2_DEV $DIR/d32l/ext2-mountpoint || error
1436         mkdir -p $DIR/d32l/d2
1437         touch $DIR/d32l/d2/test_file
1438         cat  $DIR/d32l/ext2-mountpoint/../d2/test_file || error
1439         $UMOUNT $DIR/d32l/ext2-mountpoint || error
1440 }
1441 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
1442
1443 test_32m() {
1444         rm -fr $DIR/d32m
1445         mkdir -p $DIR/d32m/tmp    
1446         TMP_DIR=$DIR/d32m/tmp       
1447         ln -s $DIR $TMP_DIR/symlink11 
1448         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 
1449         $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 || error
1450         $CHECKSTAT -t link $DIR/d32m/symlink01 || error
1451 }
1452 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
1453
1454 test_32n() {
1455         rm -fr $DIR/d32n
1456         mkdir -p $DIR/d32n/tmp    
1457         TMP_DIR=$DIR/d32n/tmp       
1458         ln -s $DIR $TMP_DIR/symlink11 
1459         ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01 
1460         ls -l $DIR/d32n/tmp/symlink11  || error
1461         ls -l $DIR/d32n/symlink01 || error
1462 }
1463 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
1464
1465 test_32o() {
1466         rm -fr $DIR/d32o $DIR/$tfile
1467         touch $DIR/$tfile 
1468         mkdir -p $DIR/d32o/tmp    
1469         TMP_DIR=$DIR/d32o/tmp       
1470         ln -s $DIR/$tfile $TMP_DIR/symlink12 
1471         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 
1472         $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 || error
1473         $CHECKSTAT -t link $DIR/d32o/symlink02 || error
1474         $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 || error
1475         $CHECKSTAT -t file -f $DIR/d32o/symlink02 || error
1476 }
1477 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/$tfile"
1478
1479 test_32p() {
1480     log 32p_1
1481         rm -fr $DIR/d32p
1482     log 32p_2
1483         rm -f $DIR/$tfile
1484     log 32p_3
1485         touch $DIR/$tfile 
1486     log 32p_4
1487         mkdir -p $DIR/d32p/tmp    
1488     log 32p_5
1489         TMP_DIR=$DIR/d32p/tmp       
1490     log 32p_6
1491         ln -s $DIR/$tfile $TMP_DIR/symlink12 
1492     log 32p_7
1493         ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02 
1494     log 32p_8
1495         cat $DIR/d32p/tmp/symlink12 || error
1496     log 32p_9
1497         cat $DIR/d32p/symlink02 || error
1498     log 32p_10
1499 }
1500 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile"
1501
1502 test_32q() {
1503         [ -e $DIR/d32q ] && rm -fr $DIR/d32q
1504         mkdir -p $DIR/d32q
1505         touch $DIR/d32q/under_the_mount
1506         mount -t ext2 -o loop $EXT2_DEV $DIR/d32q
1507         ls $DIR/d32q/under_the_mount && error || true
1508         $UMOUNT $DIR/d32q || error
1509 }
1510 run_test 32q "stat follows mountpoints in Lustre (should return error)"
1511
1512 test_32r() {
1513         [ -e $DIR/d32r ] && rm -fr $DIR/d32r
1514         mkdir -p $DIR/d32r
1515         touch $DIR/d32r/under_the_mount
1516         mount -t ext2 -o loop $EXT2_DEV $DIR/d32r
1517         ls $DIR/d32r | grep -q under_the_mount && error || true
1518         $UMOUNT $DIR/d32r || error
1519 }
1520 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
1521
1522 test_33() {
1523         rm -f $DIR/$tfile
1524         touch $DIR/$tfile
1525         chmod 444 $DIR/$tfile
1526         chown $RUNAS_ID $DIR/$tfile
1527         log 33_1
1528         $RUNAS $OPENFILE -f O_RDWR $DIR/$tfile && error || true
1529         log 33_2
1530 }
1531 run_test 33 "write file with mode 444 (should return error) ===="
1532
1533 test_33a() {
1534         rm -fr $DIR/d33
1535         mkdir -p $DIR/d33
1536         chown $RUNAS_ID $DIR/d33
1537         $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/d33/f33|| error "create"
1538         $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/d33/f33 && \
1539                 error "open RDWR" || true
1540 }
1541 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
1542
1543 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
1544 test_34a() {
1545         rm -f $DIR/f34
1546         $MCREATE $DIR/f34 || error
1547         $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" || error
1548         $TRUNCATE $DIR/f34 $TEST_34_SIZE || error
1549         $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" || error
1550         $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 || error
1551 }
1552 run_test 34a "truncate file that has not been opened ==========="
1553
1554 test_34b() {
1555         [ ! -f $DIR/f34 ] && test_34a
1556         $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 || error
1557         $OPENFILE -f O_RDONLY $DIR/f34
1558         $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" || error
1559         $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 || error
1560 }
1561 run_test 34b "O_RDONLY opening file doesn't create objects ====="
1562
1563 test_34c() {
1564         [ ! -f $DIR/f34 ] && test_34a 
1565         $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 || error
1566         $OPENFILE -f O_RDWR $DIR/f34
1567         $GETSTRIPE $DIR/f34 2>&1 | grep -q "no stripe info" && error
1568         $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 || error
1569 }
1570 run_test 34c "O_RDWR opening file-with-size works =============="
1571
1572 test_34d() {
1573         [ ! -f $DIR/f34 ] && test_34a 
1574         dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 || error
1575         $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 || error
1576         rm $DIR/f34
1577 }
1578 run_test 34d "write to sparse file ============================="
1579
1580 test_34e() {
1581         rm -f $DIR/f34e
1582         $MCREATE $DIR/f34e || error
1583         $TRUNCATE $DIR/f34e 1000 || error
1584         $CHECKSTAT -s 1000 $DIR/f34e || error
1585         $OPENFILE -f O_RDWR $DIR/f34e
1586         $CHECKSTAT -s 1000 $DIR/f34e || error
1587 }
1588 run_test 34e "create objects, some with size and some without =="
1589
1590 test_34f() { # bug 6242, 6243
1591         SIZE34F=48000
1592         rm -f $DIR/f34f
1593         $MCREATE $DIR/f34f || error
1594         $TRUNCATE $DIR/f34f $SIZE34F || error "truncating $DIR/f3f to $SIZE34F"
1595         dd if=$DIR/f34f of=$TMP/f34f
1596         $CHECKSTAT -s $SIZE34F $TMP/f34f || error "$TMP/f34f not $SIZE34F bytes"
1597         dd if=/dev/zero of=$TMP/f34fzero bs=$SIZE34F count=1
1598         cmp $DIR/f34f $TMP/f34fzero || error "$DIR/f34f not all zero"
1599         cmp $TMP/f34f $TMP/f34fzero || error "$TMP/f34f not all zero"
1600         rm $TMP/f34f $TMP/f34fzero $DIR/f34f
1601 }
1602 run_test 34f "read from a file with no objects until EOF ======="
1603
1604 test_35a() {
1605         cp /bin/sh $DIR/f35a
1606         chmod 444 $DIR/f35a
1607         chown $RUNAS_ID $DIR/f35a
1608         $RUNAS $DIR/f35a && error || true
1609         rm $DIR/f35a
1610 }
1611 run_test 35a "exec file with mode 444 (should return and not leak) ====="
1612
1613 test_36a() {
1614         rm -f $DIR/f36
1615         utime $DIR/f36 || error
1616 }
1617 run_test 36a "MDS utime check (mknod, utime) ==================="
1618
1619 test_36b() {
1620         echo "" > $DIR/f36
1621         utime $DIR/f36 || error
1622 }
1623 run_test 36b "OST utime check (open, utime) ===================="
1624
1625 test_36c() {
1626         rm -f $DIR/d36/f36
1627         mkdir $DIR/d36
1628         chown $RUNAS_ID $DIR/d36
1629         $RUNAS utime $DIR/d36/f36 || error
1630 }
1631 run_test 36c "non-root MDS utime check (mknod, utime) =========="
1632
1633 test_36d() {
1634         [ ! -d $DIR/d36 ] && test_36c
1635         echo "" > $DIR/d36/f36
1636         $RUNAS utime $DIR/d36/f36 || error
1637 }
1638 run_test 36d "non-root OST utime check (open, utime) ==========="
1639
1640 test_36e() {
1641         [ $RUNAS_ID -eq $UID ] && skip "RUNAS_ID = UID = $UID -- skipping" && return
1642         mkdir -p $DIR/$tdir
1643         touch $DIR/$tdir/$tfile
1644         $RUNAS utime $DIR/$tdir/$tfile && \
1645                 error "utime worked, expected failure" || true
1646 }
1647 run_test 36e "utime on non-owned file (should return error) ===="
1648
1649 test_36f() {
1650         export LANG=C LC_LANG=C # for date language
1651
1652         DATESTR="Dec 20  2000"
1653         mkdir -p $DIR/$tdir
1654         #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214
1655         sysctl -w lustre.fail_loc=0x80000214
1656         date; date +%s
1657         cp /etc/hosts $DIR/$tdir/$tfile
1658         sync & # write RPC generated with "current" inode timestamp, but delayed
1659         sleep 1
1660         touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past
1661         LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache
1662         cancel_lru_locks osc
1663         LS_AFTER="`ls -l $DIR/$tdir/$tfile`"  # timestamp from OST object
1664         date; date +%s
1665         [ "$LS_BEFORE" != "$LS_AFTER" ] && \
1666                 echo "BEFORE: $LS_BEFORE" && \
1667                 echo "AFTER : $LS_AFTER" && \
1668                 echo "WANT  : $DATESTR" && \
1669                 error "$DIR/$tdir/$tfile timestamps changed" || true
1670 }
1671 run_test 36f "utime on file racing with OST BRW write =========="
1672
1673 export FMD_MAX_AGE=`cat $LPROC/obdfilter/*/client_cache_seconds 2> /dev/null | head -n 1`
1674 test_36g() {
1675         [ -z "$FMD_MAX_AGE" ] && skip "skip test for remote OST" && return
1676         FMD_BEFORE="`awk '/ll_fmd_cache/ { print $2 }' /proc/slabinfo`"
1677         touch $DIR/d36/$tfile
1678         sleep $((FMD_MAX_AGE + 12))
1679         FMD_AFTER="`awk '/ll_fmd_cache/ { print $2 }' /proc/slabinfo`"
1680         [ "$FMD_AFTER" -gt "$FMD_BEFORE" ] && \
1681                 echo "AFTER : $FMD_AFTER > BEFORE $FMD_BEFORE" && \
1682                 error "fmd didn't expire after ping" || true
1683 }
1684 run_test 36g "filter mod data cache expiry ====================="
1685
1686 test_37() {
1687         mkdir -p $DIR/$tdir
1688         echo f > $DIR/$tdir/fbugfile
1689         mount -t ext2 -o loop $EXT2_DEV $DIR/$tdir
1690         ls $DIR/$tdir | grep "\<fbugfile\>" && error
1691         $UMOUNT $DIR/$tdir || error
1692         rm -f $DIR/$tdir/fbugfile || error
1693 }
1694 run_test 37 "ls a mounted file system to check old content ====="
1695
1696 test_38() {
1697         o_directory $DIR/$tfile
1698 }
1699 run_test 38 "open a regular file with O_DIRECTORY =============="
1700
1701 test_39() {
1702         touch $DIR/$tfile
1703         touch $DIR/${tfile}2
1704 #       ls -l  $DIR/$tfile $DIR/${tfile}2
1705 #       ls -lu  $DIR/$tfile $DIR/${tfile}2
1706 #       ls -lc  $DIR/$tfile $DIR/${tfile}2
1707         sleep 2
1708         $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/${tfile}2
1709         if [ ! $DIR/${tfile}2 -nt $DIR/$tfile ]; then
1710                 echo "mtime"
1711                 ls -l  $DIR/$tfile $DIR/${tfile}2
1712                 echo "atime"
1713                 ls -lu  $DIR/$tfile $DIR/${tfile}2
1714                 echo "ctime"
1715                 ls -lc  $DIR/$tfile $DIR/${tfile}2
1716                 error "O_TRUNC didn't change timestamps"
1717         fi
1718 }
1719 run_test 39 "mtime changed on create ==========================="
1720
1721 test_40() {
1722         dd if=/dev/zero of=$DIR/f40 bs=4096 count=1
1723         $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/f40 && error
1724         $CHECKSTAT -t file -s 4096 $DIR/f40 || error
1725 }
1726 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
1727
1728 test_41() {
1729         # bug 1553
1730         small_write $DIR/f41 18
1731 }
1732 run_test 41 "test small file write + fstat ====================="
1733
1734 count_ost_writes() {
1735         cat $LPROC/osc/*/stats |
1736             awk -vwrites=0 '/ost_write/ { writes += $2 } END { print writes; }'
1737 }
1738
1739 # decent default
1740 WRITEBACK_SAVE=500
1741 DIRTY_RATIO_SAVE=40
1742 MAX_DIRTY_RATIO=50
1743 BG_DIRTY_RATIO_SAVE=10
1744 MAX_BG_DIRTY_RATIO=25
1745
1746 start_writeback() {
1747         trap 0
1748         # in 2.6, restore /proc/sys/vm/dirty_writeback_centisecs,
1749         # dirty_ratio, dirty_background_ratio
1750         if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
1751                 echo $WRITEBACK_SAVE > /proc/sys/vm/dirty_writeback_centisecs
1752                 echo $BG_DIRTY_RATIO_SAVE > /proc/sys/vm/dirty_background_ratio
1753                 echo $DIRTY_RATIO_SAVE > /proc/sys/vm/dirty_ratio
1754         else
1755                 # if file not here, we are a 2.4 kernel
1756                 kill -CONT `pidof kupdated`
1757         fi
1758 }
1759
1760 stop_writeback() {
1761         # setup the trap first, so someone cannot exit the test at the
1762         # exact wrong time and mess up a machine
1763         trap start_writeback EXIT
1764         # in 2.6, save and 0 /proc/sys/vm/dirty_writeback_centisecs
1765         if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
1766                 WRITEBACK_SAVE=`cat /proc/sys/vm/dirty_writeback_centisecs`
1767                 echo 0 > /proc/sys/vm/dirty_writeback_centisecs
1768                 # save and increase /proc/sys/vm/dirty_ratio
1769                 DIRTY_RATIO_SAVE=`cat /proc/sys/vm/dirty_ratio`
1770                 echo $MAX_DIRTY_RATIO > /proc/sys/vm/dirty_ratio
1771                 # save and increase /proc/sys/vm/dirty_background_ratio
1772                 BG_DIRTY_RATIO_SAVE=`cat /proc/sys/vm/dirty_background_ratio`
1773                 echo $MAX_BG_DIRTY_RATIO > /proc/sys/vm/dirty_background_ratio
1774         else
1775                 # if file not here, we are a 2.4 kernel
1776                 kill -STOP `pidof kupdated`
1777         fi
1778 }
1779
1780 # ensure that all stripes have some grant before we test client-side cache
1781 setup_test42() {
1782         [ "$SETUP_TEST42" ] && return
1783         for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
1784                 dd if=/dev/zero of=$i bs=4k count=1
1785                 rm $i
1786         done
1787         SETUP_TEST42=DONE
1788 }
1789
1790 # Tests 42* verify that our behaviour is correct WRT caching, file closure,
1791 # file truncation, and file removal.
1792 test_42a() {
1793         setup_test42
1794         cancel_lru_locks osc
1795         stop_writeback
1796         sync; sleep 1; sync # just to be safe
1797         BEFOREWRITES=`count_ost_writes`
1798         grep "[0-9]" $LPROC/osc/*[oO][sS][cC][_-]*/cur_grant_bytes
1799         dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
1800         AFTERWRITES=`count_ost_writes`
1801         [ $BEFOREWRITES -eq $AFTERWRITES ] || \
1802                 error "$BEFOREWRITES < $AFTERWRITES"
1803         start_writeback
1804 }
1805 run_test 42a "ensure that we don't flush on close =============="
1806
1807 test_42b() {
1808         setup_test42
1809         cancel_lru_locks osc
1810         stop_writeback
1811         sync
1812         dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
1813         BEFOREWRITES=`count_ost_writes`
1814         $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
1815         AFTERWRITES=`count_ost_writes`
1816         if [ $BEFOREWRITES -lt $AFTERWRITES ]; then
1817                 error "$BEFOREWRITES < $AFTERWRITES on unlink"
1818         fi
1819         BEFOREWRITES=`count_ost_writes`
1820         sync || error "sync: $?"
1821         AFTERWRITES=`count_ost_writes`
1822         if [ $BEFOREWRITES -lt $AFTERWRITES ]; then
1823                 error "$BEFOREWRITES < $AFTERWRITES on sync"
1824         fi
1825         dmesg | grep 'error from obd_brw_async' && error 'error writing back'
1826         start_writeback
1827         return 0
1828 }
1829 run_test 42b "test destroy of file with cached dirty data ======"
1830
1831 # if these tests just want to test the effect of truncation,
1832 # they have to be very careful.  consider:
1833 # - the first open gets a {0,EOF}PR lock
1834 # - the first write conflicts and gets a {0, count-1}PW
1835 # - the rest of the writes are under {count,EOF}PW
1836 # - the open for truncate tries to match a {0,EOF}PR
1837 #   for the filesize and cancels the PWs.
1838 # any number of fixes (don't get {0,EOF} on open, match
1839 # composite locks, do smarter file size management) fix
1840 # this, but for now we want these tests to verify that
1841 # the cancellation with truncate intent works, so we
1842 # start the file with a full-file pw lock to match against
1843 # until the truncate.
1844 trunc_test() {
1845         test=$1
1846         file=$DIR/$test
1847         offset=$2
1848         cancel_lru_locks osc
1849         stop_writeback
1850         # prime the file with 0,EOF PW to match
1851         touch $file
1852         $TRUNCATE $file 0
1853         sync; sync
1854         # now the real test..
1855         dd if=/dev/zero of=$file bs=1024 count=100
1856         BEFOREWRITES=`count_ost_writes`
1857         $TRUNCATE $file $offset
1858         cancel_lru_locks osc
1859         AFTERWRITES=`count_ost_writes`
1860         start_writeback
1861 }
1862
1863 test_42c() {
1864         trunc_test 42c 1024
1865         [ $BEFOREWRITES -eq $AFTERWRITES ] && \
1866             error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
1867         rm $file
1868 }
1869 run_test 42c "test partial truncate of file with cached dirty data"
1870
1871 test_42d() {
1872         trunc_test 42d 0
1873         [ $BEFOREWRITES -eq $AFTERWRITES ] || \
1874             error "beforewrites $BEFOREWRITES != afterwrites $AFTERWRITES on truncate"
1875         rm $file
1876 }
1877 run_test 42d "test complete truncate of file with cached dirty data"
1878
1879 test_43() {
1880         mkdir $DIR/$tdir
1881         cp -p /bin/ls $DIR/$tdir/$tfile
1882         exec 100>> $DIR/$tdir/$tfile
1883         $DIR/$tdir/$tfile && error || true
1884         exec 100<&-
1885 }
1886 run_test 43 "execution of file opened for write should return -ETXTBSY"
1887
1888 test_43a() {
1889         mkdir -p $DIR/d43
1890         cp -p `which multiop` $DIR/d43/multiop
1891         $DIR/d43/multiop $TMP/test43.junk O_c &
1892         MULTIPID=$!
1893         sleep 1
1894         multiop $DIR/d43/multiop Oc && error "expected error, got success"
1895         kill -USR1 $MULTIPID || return 2
1896         wait $MULTIPID || return 3
1897         rm $TMP/test43.junk
1898 }
1899 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
1900
1901 test_43b() {
1902         mkdir -p $DIR/d43
1903         cp -p `which multiop` $DIR/d43/multiop
1904         $DIR/d43/multiop $TMP/test43.junk O_c &
1905         MULTIPID=$!
1906         sleep 1
1907         truncate $DIR/d43/multiop 0 && error "expected error, got success"
1908         kill -USR1 $MULTIPID || return 2
1909         wait $MULTIPID || return 3
1910         rm $TMP/test43.junk
1911 }
1912 run_test 43b "truncate of file being executed should return -ETXTBSY"
1913
1914 test_43c() {
1915         local testdir="$DIR/d43c"
1916         mkdir -p $testdir
1917         cp $SHELL $testdir/
1918         ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) | \
1919                 ( cd $testdir && md5sum -c)
1920 }
1921 run_test 43c "md5sum of copy into lustre========================"
1922
1923 test_44() {
1924         [  "$OSTCOUNT" -lt "2" ] && skip "skipping 2-stripe test" && return
1925         dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
1926         dd if=$DIR/f1 of=/dev/null bs=4k count=1
1927 }
1928 run_test 44 "zero length read from a sparse stripe ============="
1929
1930 test_44a() {
1931     local nstripe=`$LCTL lov_getconfig $DIR | grep default_stripe_count: | \
1932                          awk '{print $2}'`
1933     [ -z "$nstripe" ] && skip "can't get stripe info" && return
1934     [ "$nstripe" -gt "$OSTCOUNT" ] && skip "Wrong default_stripe_count: $nstripe (OSTCOUNT: $OSTCOUNT)" && return
1935     local stride=`$LCTL lov_getconfig $DIR | grep default_stripe_size: | \
1936                       awk '{print $2}'`
1937     if [ $nstripe -eq 0 ] ; then
1938         nstripe=`$LCTL lov_getconfig $DIR | grep obd_count: | awk '{print $2}'`
1939     fi
1940
1941     OFFSETS="0 $((stride/2)) $((stride-1))"
1942     for offset in $OFFSETS ; do
1943       for i in `seq 0 $((nstripe-1))`; do
1944         rm -f $DIR/d44a
1945         local GLOBALOFFSETS=""
1946         local size=$((((i + 2 * $nstripe )*$stride + $offset)))  # Bytes
1947         ll_sparseness_write $DIR/d44a $size  || error "ll_sparseness_write"
1948         GLOBALOFFSETS="$GLOBALOFFSETS $size"
1949         ll_sparseness_verify $DIR/d44a $GLOBALOFFSETS \
1950                             || error "ll_sparseness_verify $GLOBALOFFSETS"
1951
1952         for j in `seq 0 $((nstripe-1))`; do
1953             size=$((((j + $nstripe )*$stride + $offset)))  # Bytes
1954             ll_sparseness_write $DIR/d44a $size || error "ll_sparseness_write"
1955             GLOBALOFFSETS="$GLOBALOFFSETS $size"
1956         done
1957         ll_sparseness_verify $DIR/d44a $GLOBALOFFSETS \
1958                             || error "ll_sparseness_verify $GLOBALOFFSETS"
1959       done
1960     done
1961 }
1962 run_test 44a "test sparse pwrite ==============================="
1963
1964 dirty_osc_total() {
1965         tot=0
1966         for d in $LPROC/osc/*/cur_dirty_bytes; do
1967                 tot=$(($tot + `cat $d`))
1968         done
1969         echo $tot
1970 }
1971 do_dirty_record() {
1972         before=`dirty_osc_total`
1973         echo executing "\"$*\""
1974         eval $*
1975         after=`dirty_osc_total`
1976         echo before $before, after $after
1977 }
1978 test_45() {
1979         f="$DIR/f45"
1980         # Obtain grants from OST if it supports it
1981         echo blah > ${f}_grant
1982         stop_writeback
1983         sync
1984         do_dirty_record "echo blah > $f"
1985         [ $before -eq $after ] && error "write wasn't cached"
1986         do_dirty_record "> $f"
1987         [ $before -gt $after ] || error "truncate didn't lower dirty count"
1988         do_dirty_record "echo blah > $f"
1989         [ $before -eq $after ] && error "write wasn't cached"
1990         do_dirty_record "sync"
1991         [ $before -gt $after ] || error "writeback didn't lower dirty count"
1992         do_dirty_record "echo blah > $f"
1993         [ $before -eq $after ] && error "write wasn't cached"
1994         do_dirty_record "cancel_lru_locks osc"
1995         [ $before -gt $after ] || error "lock cancellation didn't lower dirty count"
1996         start_writeback
1997 }
1998 run_test 45 "osc io page accounting ============================"
1999
2000 page_size() {
2001         getconf PAGE_SIZE
2002 }
2003
2004 # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object.  this
2005 # test tickles a bug where re-dirtying a page was failing to be mapped to the
2006 # objects offset and an assert hit when an rpc was built with 1023's mapped 
2007 # offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
2008 test_46() {
2009         f="$DIR/f46"
2010         stop_writeback
2011         sync
2012         dd if=/dev/zero of=$f bs=`page_size` seek=511 count=1
2013         sync
2014         dd conv=notrunc if=/dev/zero of=$f bs=`page_size` seek=1023 count=1
2015         dd conv=notrunc if=/dev/zero of=$f bs=`page_size` seek=511 count=1
2016         sync
2017         start_writeback
2018 }
2019 run_test 46 "dirtying a previously written page ================"
2020
2021 # Check that device nodes are created and then visible correctly (#2091)
2022 test_47() {
2023         cmknod $DIR/test_47_node || error
2024 }
2025 run_test 47 "Device nodes check ================================"
2026
2027 test_48a() { # bug 2399
2028         check_kernel_version 34 || return 0
2029         mkdir -p $DIR/d48a
2030         cd $DIR/d48a
2031         mv $DIR/d48a $DIR/d48.new || error "move directory failed"
2032         mkdir $DIR/d48a || error "recreate directory failed"
2033         touch foo || error "'touch foo' failed after recreating cwd"
2034         mkdir bar || error "'mkdir foo' failed after recreating cwd"
2035         if check_kernel_version 44; then
2036                 touch .foo || error "'touch .foo' failed after recreating cwd"
2037                 mkdir .bar || error "'mkdir .foo' failed after recreating cwd"
2038         fi
2039         ls . > /dev/null || error "'ls .' failed after recreating cwd"
2040         ls .. > /dev/null || error "'ls ..' failed after removing cwd"
2041         cd . || error "'cd .' failed after recreating cwd"
2042         mkdir . && error "'mkdir .' worked after recreating cwd"
2043         rmdir . && error "'rmdir .' worked after recreating cwd"
2044         ln -s . baz || error "'ln -s .' failed after recreating cwd"
2045         cd .. || error "'cd ..' failed after recreating cwd"
2046 }
2047 run_test 48a "Access renamed working dir (should return errors)="
2048
2049 test_48b() { # bug 2399
2050         check_kernel_version 34 || return 0
2051         mkdir -p $DIR/d48b
2052         cd $DIR/d48b
2053         rmdir $DIR/d48b || error "remove cwd $DIR/d48b failed"
2054         touch foo && error "'touch foo' worked after removing cwd"
2055         mkdir foo && error "'mkdir foo' worked after removing cwd"
2056         if check_kernel_version 44; then
2057                 touch .foo && error "'touch .foo' worked after removing cwd"
2058                 mkdir .foo && error "'mkdir .foo' worked after removing cwd"
2059         fi
2060         ls . > /dev/null && error "'ls .' worked after removing cwd"
2061         ls .. > /dev/null || error "'ls ..' failed after removing cwd"
2062         cd . && error "'cd .' worked after removing cwd"
2063         mkdir . && error "'mkdir .' worked after removing cwd"
2064         rmdir . && error "'rmdir .' worked after removing cwd"
2065         ln -s . foo && error "'ln -s .' worked after removing cwd"
2066         cd .. || echo "'cd ..' failed after removing cwd `pwd`"  #bug 3517
2067 }
2068 run_test 48b "Access removed working dir (should return errors)="
2069
2070 test_48c() { # bug 2350
2071         check_kernel_version 36 || return 0
2072         #sysctl -w lnet.debug=-1
2073         #set -vx
2074         mkdir -p $DIR/d48c/dir
2075         cd $DIR/d48c/dir
2076         $TRACE rmdir $DIR/d48c/dir || error "remove cwd $DIR/d48c/dir failed"
2077         $TRACE touch foo && error "'touch foo' worked after removing cwd"
2078         $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
2079         if check_kernel_version 44; then
2080                 touch .foo && error "'touch .foo' worked after removing cwd"
2081                 mkdir .foo && error "'mkdir .foo' worked after removing cwd"
2082         fi
2083         $TRACE ls . && error "'ls .' worked after removing cwd"
2084         $TRACE ls .. || error "'ls ..' failed after removing cwd"
2085         $TRACE cd . && error "'cd .' worked after removing cwd"
2086         $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
2087         $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
2088         $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
2089         $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
2090 }
2091 run_test 48c "Access removed working subdir (should return errors)"
2092
2093 test_48d() { # bug 2350
2094         check_kernel_version 36 || return 0
2095         #sysctl -w lnet.debug=-1
2096         #set -vx
2097         mkdir -p $DIR/d48d/dir
2098         cd $DIR/d48d/dir
2099         $TRACE rmdir $DIR/d48d/dir || error "remove cwd $DIR/d48d/dir failed"
2100         $TRACE rmdir $DIR/d48d || error "remove parent $DIR/d48d failed"
2101         $TRACE touch foo && error "'touch foo' worked after removing parent"
2102         $TRACE mkdir foo && error "'mkdir foo' worked after removing parent"
2103         if check_kernel_version 44; then
2104                 touch .foo && error "'touch .foo' worked after removing parent"
2105                 mkdir .foo && error "'mkdir .foo' worked after removing parent"
2106         fi
2107         $TRACE ls . && error "'ls .' worked after removing parent"
2108         $TRACE ls .. && error "'ls ..' worked after removing parent"
2109         $TRACE cd . && error "'cd .' worked after recreate parent"
2110         $TRACE mkdir . && error "'mkdir .' worked after removing parent"
2111         $TRACE rmdir . && error "'rmdir .' worked after removing parent"
2112         $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
2113         $TRACE cd .. && error "'cd ..' worked after removing parent" || true
2114 }
2115 run_test 48d "Access removed parent subdir (should return errors)"
2116
2117 test_48e() { # bug 4134
2118         check_kernel_version 41 || return 0
2119         #sysctl -w lnet.debug=-1
2120         #set -vx
2121         mkdir -p $DIR/d48e/dir
2122         cd $DIR/d48e/dir
2123         $TRACE rmdir $DIR/d48e/dir || error "remove cwd $DIR/d48e/dir failed"
2124         $TRACE rmdir $DIR/d48e || error "remove parent $DIR/d48e failed"
2125         $TRACE touch $DIR/d48e || error "'touch $DIR/d48e' failed"
2126         $TRACE chmod +x $DIR/d48e || error "'chmod +x $DIR/d48e' failed"
2127         # On a buggy kernel addition of "touch foo" after cd .. will
2128         # produce kernel oops in lookup_hash_it
2129         touch ../foo && error "'cd ..' worked after recreate parent"
2130         cd $DIR
2131         $TRACE rm $DIR/d48e || error "rm '$DIR/d48e' failed"
2132 }
2133 run_test 48e "Access to recreated parent subdir (should return errors)"
2134
2135 test_50() {
2136         # bug 1485
2137         mkdir $DIR/d50
2138         cd $DIR/d50
2139         ls /proc/$$/cwd || error
2140 }
2141 run_test 50 "special situations: /proc symlinks  ==============="
2142
2143 test_51() {
2144         # bug 1516 - create an empty entry right after ".." then split dir
2145         mkdir $DIR/d51
2146         touch $DIR/d51/foo
2147         $MCREATE $DIR/d51/bar
2148         rm $DIR/d51/foo
2149         createmany -m $DIR/d51/longfile 201
2150         FNUM=202
2151         while [ `ls -sd $DIR/d51 | awk '{ print $1 }'` -eq 4 ]; do
2152                 $MCREATE $DIR/d51/longfile$FNUM
2153                 FNUM=$(($FNUM + 1))
2154                 echo -n "+"
2155         done
2156         echo
2157         ls -l $DIR/d51 > /dev/null || error
2158 }
2159 run_test 51 "special situations: split htree with empty entry =="
2160
2161 export NUMTEST=70000
2162 test_51b() {
2163         NUMFREE=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'`
2164         [ $NUMFREE -lt 21000 ] && \
2165                 skip "not enough free inodes ($NUMFREE)" && \
2166                 return
2167
2168         check_kernel_version 40 || NUMTEST=31000
2169         [ $NUMFREE -lt $NUMTEST ] && NUMTEST=$(($NUMFREE - 50))
2170
2171         mkdir -p $DIR/d51b
2172         createmany -d $DIR/d51b/t- $NUMTEST
2173 }
2174 run_test 51b "mkdir .../t-0 --- .../t-$NUMTEST ===================="
2175
2176 test_51c() {
2177         [ ! -d $DIR/d51b ] && skip "$DIR/51b missing" && \
2178                 return
2179
2180         unlinkmany -d $DIR/d51b/t- $NUMTEST
2181 }
2182 run_test 51c "rmdir .../t-0 --- .../t-$NUMTEST ===================="
2183
2184 test_51d() {
2185         [  "$OSTCOUNT" -lt "3" ] && skip "skipping test with few OSTs" && return
2186         mkdir -p $DIR/d51d
2187         createmany -o $DIR/d51d/t- 1000
2188         $LFS getstripe $DIR/d51d > $TMP/files
2189         for N in `seq 0 $((OSTCOUNT - 1))`; do
2190             OBJS[$N]=`awk -vobjs=0 '($1 == '$N') { objs += 1 } END { print objs;}' $TMP/files`
2191             OBJS0[$N]=`grep -A 1 idx $TMP/files | awk -vobjs=0 '($1 == '$N') { objs += 1 } END { print objs;}'`
2192             log "OST$N has ${OBJS[$N]} objects, ${OBJS0[$N]} are index 0"
2193         done
2194         unlinkmany $DIR/d51d/t- 1000
2195
2196         NLAST=0
2197         for N in `seq 1 $((OSTCOUNT - 1))`; do
2198             [ ${OBJS[$N]} -lt $((${OBJS[$NLAST]} - 20)) ] && \
2199                 error "OST $N has less objects vs OST $NLAST (${OBJS[$N]} < ${OBJS[$NLAST]}"
2200             [ ${OBJS[$N]} -gt $((${OBJS[$NLAST]} + 20)) ] && \
2201                 error "OST $N has less objects vs OST $NLAST (${OBJS[$N]} < ${OBJS[$NLAST]}"
2202             
2203             [ ${OBJS0[$N]} -lt $((${OBJS0[$NLAST]} - 20)) ] && \
2204                 error "OST $N has less #0 objects vs OST $NLAST (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
2205             [ ${OBJS0[$N]} -gt $((${OBJS0[$NLAST]} + 20)) ] && \
2206                 error "OST $N has less #0 objects vs OST $NLAST (${OBJS0[$N]} < ${OBJS0[$NLAST]}"
2207             NLAST=$N
2208         done
2209 }
2210 run_test 51d "check object distribution ===================="
2211
2212 test_52a() {
2213         [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
2214         mkdir -p $DIR/d52a
2215         touch $DIR/d52a/foo
2216         chattr =a $DIR/d52a/foo || error "chattr =a failed"
2217         echo bar >> $DIR/d52a/foo || error "append bar failed"
2218         cp /etc/hosts $DIR/d52a/foo && error "cp worked"
2219         rm -f $DIR/d52a/foo 2>/dev/null && error "rm worked"
2220         link $DIR/d52a/foo $DIR/d52a/foo_link 2>/dev/null && error "link worked"
2221         echo foo >> $DIR/d52a/foo || error "append foo failed"
2222         mrename $DIR/d52a/foo $DIR/d52a/foo_ren && error "rename worked"
2223         lsattr $DIR/d52a/foo | egrep -q "^-+a-+ $DIR/d52a/foo" || error "lsattr"
2224         chattr -a $DIR/d52a/foo || error "chattr -a failed"
2225
2226         rm -fr $DIR/d52a || error "cleanup rm failed"
2227 }
2228 run_test 52a "append-only flag test (should return errors) ====="
2229
2230 test_52b() {
2231         [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
2232         mkdir -p $DIR/d52b
2233         touch $DIR/d52b/foo
2234         chattr =i $DIR/d52b/foo || error
2235         cat test > $DIR/d52b/foo && error
2236         cp /etc/hosts $DIR/d52b/foo && error
2237         rm -f $DIR/d52b/foo 2>/dev/null && error
2238         link $DIR/d52b/foo $DIR/d52b/foo_link 2>/dev/null && error
2239         echo foo >> $DIR/d52b/foo && error
2240         mrename $DIR/d52b/foo $DIR/d52b/foo_ren && error
2241         [ -f $DIR/d52b/foo ] || error
2242         [ -f $DIR/d52b/foo_ren ] && error
2243         lsattr $DIR/d52b/foo | egrep -q "^-+i-+ $DIR/d52b/foo" || error
2244         chattr -i $DIR/d52b/foo || error
2245
2246         rm -fr $DIR/d52b || error
2247 }
2248 run_test 52b "immutable flag test (should return errors) ======="
2249
2250 test_52c() { # 12848 simulating client < 1.4.7
2251         [ -f $DIR/d52c/foo ] && chattr -i $DIR/d52b/foo
2252         mkdir -p $DIR/d52c
2253         touch $DIR/d52c/foo
2254         # skip MDS_BFLAG_EXT_FLAGS in mdc_getattr_pack
2255 #define OBD_FAIL_MDC_OLD_EXT_FLAGS       0x802
2256         sysctl -w lustre.fail_loc=0x802
2257         chattr =i $DIR/d52c/foo || error
2258         lsattr $DIR/d52c/foo | egrep -q "^-+i-+ $DIR/d52c/foo" || error
2259         chattr -i $DIR/d52c/foo || error
2260         sysctl -w lustre.fail_loc=0
2261
2262         rm -fr $DIR/d52c || error
2263 }
2264 run_test 52c "immutable flag test for client < 1.4.7 ======="
2265
2266 test_53() {
2267         [ -z "$MDS" ] && skip "skipping test with remote MDS" && return
2268         
2269         for i in `ls -d $LPROC/osc/*-osc 2> /dev/null` ; do
2270                 ostname=`basename $i | cut -d - -f 1-2`
2271                 ost_last=`cat $LPROC/obdfilter/$ostname/last_id`
2272                 mds_last=`cat $i/prealloc_last_id`
2273                 echo "$ostname.last_id=$ost_last ; MDS.last_id=$mds_last"
2274                 if [ $ost_last != $mds_last ]; then
2275                     error "$ostname.last_id=$ost_last ; MDS.last_id=$mds_last"
2276                 fi
2277         done
2278 }
2279 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
2280
2281 test_54a() {
2282         [ ! -f "$SOCKETSERVER" ] && skip "no socketserver, skipping" && return
2283         [ ! -f "$SOCKETCLIENT" ] && skip "no socketclient, skipping" && return
2284         $SOCKETSERVER $DIR/socket
2285         $SOCKETCLIENT $DIR/socket || error
2286         $MUNLINK $DIR/socket
2287 }
2288 run_test 54a "unix domain socket test =========================="
2289
2290 test_54b() {
2291         f="$DIR/f54b"
2292         mknod $f c 1 3
2293         chmod 0666 $f
2294         dd if=/dev/zero of=$f bs=`page_size` count=1 
2295 }
2296 run_test 54b "char device works in lustre ======================"
2297
2298 find_loop_dev() {
2299         [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
2300         [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
2301         [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
2302
2303         for i in `seq 3 7`; do
2304                 losetup $LOOPBASE$i > /dev/null 2>&1 && continue
2305                 LOOPDEV=$LOOPBASE$i
2306                 LOOPNUM=$i
2307                 break
2308         done
2309 }
2310
2311 test_54c() {
2312         tfile="$DIR/f54c"
2313         tdir="$DIR/d54c"
2314         loopdev="$DIR/loop54c"
2315
2316         find_loop_dev 
2317         [ -z "$LOOPNUM" ] && echo "couldn't find empty loop device" && return
2318         mknod $loopdev b 7 $LOOPNUM
2319         echo "make a loop file system with $tfile on $loopdev ($LOOPNUM)..."
2320         dd if=/dev/zero of=$tfile bs=`page_size` seek=1024 count=1 > /dev/null
2321         losetup $loopdev $tfile || error "can't set up $loopdev for $tfile"
2322         mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
2323         mkdir -p $tdir
2324         mount -t ext2 $loopdev $tdir || error "error mounting $loopdev on $tdir"
2325         dd if=/dev/zero of=$tdir/tmp bs=`page_size` count=30 || error "dd write"
2326         df $tdir
2327         dd if=$tdir/tmp of=/dev/zero bs=`page_size` count=30 || error "dd read"
2328         $UMOUNT $tdir
2329         losetup -d $loopdev
2330         rm $loopdev
2331 }
2332 run_test 54c "block device works in lustre ====================="
2333
2334 test_54d() {
2335         f="$DIR/f54d"
2336         string="aaaaaa"
2337         mknod $f p
2338         [ "$string" = `echo $string > $f | cat $f` ] || error
2339 }
2340 run_test 54d "fifo device works in lustre ======================"
2341
2342 test_54e() {
2343         check_kernel_version 46 || return 0
2344         f="$DIR/f54e"
2345         string="aaaaaa"
2346         mknod $f c 4 0
2347         echo $string > $f || error
2348 }
2349 run_test 54e "console/tty device works in lustre ======================"
2350
2351 check_fstype() {
2352         grep -q $FSTYPE /proc/filesystems && return 1
2353         modprobe $FSTYPE
2354         grep -q $FSTYPE /proc/filesystems && return 1
2355         insmod ../$FSTYPE/$FSTYPE.o
2356         grep -q $FSTYPE /proc/filesystems && return 1
2357         insmod ../$FSTYPE/$FSTYPE.ko
2358         grep -q $FSTYPE /proc/filesystems && return 1
2359         return 0
2360 }
2361
2362 test_55() {
2363         rm -rf $DIR/d55
2364         mkdir $DIR/d55
2365         check_fstype && skip "can't find fs $FSTYPE" && return
2366         mount -t $FSTYPE -o loop,iopen $EXT2_DEV $DIR/d55 || error "mounting"
2367         touch $DIR/d55/foo
2368         $IOPENTEST1 $DIR/d55/foo $DIR/d55 || error "running $IOPENTEST1"
2369         $IOPENTEST2 $DIR/d55 || error "running $IOPENTEST2"
2370         echo "check for $EXT2_DEV. Please wait..."
2371         rm -rf $DIR/d55/*
2372         $UMOUNT $DIR/d55 || error "unmounting"
2373 }
2374 run_test 55 "check iopen_connect_dentry() ======================"
2375
2376 test_56() {
2377         rm -rf $DIR/d56
2378         $SETSTRIPE -d $DIR
2379         mkdir $DIR/d56
2380         mkdir $DIR/d56/dir
2381         NUMFILES=3
2382         NUMFILESx2=$(($NUMFILES * 2))
2383         for i in `seq 1 $NUMFILES` ; do
2384                 touch $DIR/d56/file$i
2385                 touch $DIR/d56/dir/file$i
2386         done
2387
2388         # test lfs getstripe with --recursive
2389         FILENUM=`$GETSTRIPE --recursive $DIR/d56 | grep -c obdidx`
2390         [ $FILENUM -eq $NUMFILESx2 ] || error \
2391                 "lfs getstripe --recursive $DIR/d56 wrong: found $FILENUM, expected $NUMFILESx2"
2392         FILENUM=`$GETSTRIPE $DIR/d56 | grep -c obdidx`
2393         [ $FILENUM -eq $NUMFILES ] || error \
2394                 "lfs getstripe $DIR/d56 without --recursive wrong: found $FILENUM, expected $NUMFILES"
2395         echo "lfs getstripe --recursive passed."
2396
2397         # test lfs getstripe with file instead of dir
2398         FILENUM=`$GETSTRIPE $DIR/d56/file1 | grep -c obdidx`
2399         [ $FILENUM  -eq 1 ] || error \
2400                  "lfs getstripe $DIR/d56/file1 wrong:found $FILENUM, expected 1"
2401         echo "lfs getstripe file passed."
2402
2403         #test lfs getstripe with --verbose
2404         [ `$GETSTRIPE --verbose $DIR/d56 | grep -c lmm_magic` -eq $NUMFILES ] ||\
2405                 error "lfs getstripe --verbose $DIR/d56 wrong: should find $NUMFILES lmm_magic info"
2406         [ `$GETSTRIPE $DIR/d56 | grep -c lmm_magic` -eq 0 ] || error \
2407                 "lfs getstripe $DIR/d56 without --verbose wrong: should not show lmm_magic info"
2408         echo "lfs getstripe --verbose passed."
2409
2410         #test lfs getstripe with --obd
2411         $GETSTRIPE --obd wrong_uuid $DIR/d56 2>&1 | grep -q "unknown obduuid" || \
2412                 error "lfs getstripe --obd wrong_uuid should return error message"
2413
2414         [  "$OSTCOUNT" -lt 2 ] && \
2415                 skip "skipping other lfs getstripe --obd test" && return
2416         FILENUM=`$GETSTRIPE --recursive $DIR/d56 | sed -n '/^[   ]*1[    ]/p' | wc -l`
2417         OBDUUID=`$GETSTRIPE --recursive $DIR/d56 | sed -n '/^[   ]*1:/p' | awk '{print $2}'`
2418         FOUND=`$GETSTRIPE -r --obd $OBDUUID $DIR/d56 | wc -l`
2419         [ $FOUND -eq $FILENUM ] || \
2420                 error "lfs getstripe --obd wrong: found $FOUND, expected $FILENUM"
2421         [ `$GETSTRIPE -r -v --obd $OBDUUID $DIR/d56 | sed '/^[   ]*1[    ]/d' |\
2422                 sed -n '/^[      ]*[0-9][0-9]*[  ]/p' | wc -l` -eq 0 ] || \
2423                 error "lfs getstripe --obd wrong: should not show file on other obd"
2424         echo "lfs getstripe --obd passed."
2425 }
2426 run_test 56 "check lfs getstripe ===================================="
2427
2428 NUMFILES=3
2429 NUMDIRS=3
2430 setup_56() {
2431         LOCAL_NUMFILES=$1
2432         LOCAL_NUMDIRS=$2
2433         if [ ! -d "$DIR/${tdir}g" ] ; then
2434                 mkdir -p $DIR/${tdir}g
2435                 for i in `seq 1 $LOCAL_NUMFILES` ; do
2436                         touch $DIR/${tdir}g/file$i
2437                 done
2438                 for i in `seq 1 $LOCAL_NUMDIRS` ; do
2439                         mkdir $DIR/${tdir}g/dir$i
2440                         for j in `seq 1 $LOCAL_NUMFILES` ; do
2441                                 touch $DIR/${tdir}g/dir$i/file$j
2442                         done
2443                 done
2444         fi
2445 }
2446
2447 test_56g() {
2448         $LSTRIPE -d $DIR
2449
2450         setup_56 $NUMFILES $NUMDIRS
2451
2452         EXPECTED=$(($NUMDIRS + 2))
2453         # test lfs find with -name
2454         for i in `seq 1 $NUMFILES` ; do
2455                 NUMS=`$LFIND -name "*$i" $DIR/${tdir}g | wc -l`
2456                 [ $NUMS -eq $EXPECTED ] || error \
2457                         "lfs find -name \"*$i\" $DIR/${tdir}g wrong: found $NUMS, expected $EXPECTED"
2458         done
2459         echo "lfs find -name passed."
2460 }
2461 run_test 56g "check lfs find -name ============================="
2462
2463 test_56h() {
2464         $LSTRIPE -d $DIR
2465
2466         setup_56 $NUMFILES $NUMDIRS
2467
2468         EXPECTED=$((($NUMDIRS+1)*($NUMFILES-1)+$NUMFILES))
2469         # test lfs find with ! -name
2470         for i in `seq 1 $NUMFILES` ; do
2471                 NUMS=`$LFIND ! -name "*$i" $DIR/${tdir}g | wc -l`
2472                 [ $NUMS -eq $EXPECTED ] || error \
2473                         "lfs find ! -name \"*$i\" $DIR/${tdir}g wrong: found $NUMS, expected $EXPECTED"
2474         done
2475         echo "lfs find ! -name passed."
2476 }
2477 run_test 56h "check lfs find ! -name ============================="
2478
2479 test_57a() {
2480         [ -z "$MDS" ] && skip "skipping test for remote MDS" && return
2481         for DEV in `cat $LPROC/mds/*/mntdev`; do
2482                 dumpe2fs -h $DEV > $TMP/t57a.dump || error "can't access $DEV"
2483                 DEVISIZE=`awk '/Inode size:/ { print $3 }' $TMP/t57a.dump`
2484                 [ "$DEVISIZE" -gt 128 ] || error "inode size $DEVISIZE"
2485                 rm $TMP/t57a.dump
2486         done
2487 }
2488 run_test 57a "verify MDS filesystem created with large inodes =="
2489
2490 test_57b() {
2491         FILECOUNT=100
2492         FILE1=$DIR/d57b/f1
2493         FILEN=$DIR/d57b/f$FILECOUNT
2494         rm -rf $DIR/d57b || error "removing $DIR/d57b"
2495         mkdir -p $DIR/d57b || error "creating $DIR/d57b"
2496         echo "mcreating $FILECOUNT files"
2497         createmany -m $DIR/d57b/f 1 $FILECOUNT || \
2498                 error "creating files in $DIR/d57b"
2499
2500         # verify that files do not have EAs yet
2501         $GETSTRIPE $FILE1 2>&1 | grep -q "no stripe" || error "$FILE1 has an EA"
2502         $GETSTRIPE $FILEN 2>&1 | grep -q "no stripe" || error "$FILEN has an EA"
2503
2504         MDSFREE="`cat $LPROC/mds/*/kbytesfree 2> /dev/null`"
2505         MDCFREE="`cat $LPROC/mdc/*/kbytesfree | head -n 1`"
2506         echo "opening files to create objects/EAs"
2507         for FILE in `seq -f $DIR/d57b/f%g 1 $FILECOUNT`; do
2508                 $OPENFILE -f O_RDWR $FILE > /dev/null || error "opening $FILE"
2509         done
2510
2511         # verify that files have EAs now
2512         $GETSTRIPE $FILE1 | grep -q "obdidx" || error "$FILE1 missing EA"
2513         $GETSTRIPE $FILEN | grep -q "obdidx" || error "$FILEN missing EA"
2514
2515         sleep 1 # make sure we get new statfs data
2516         MDSFREE2="`cat $LPROC/mds/*/kbytesfree 2> /dev/null`"
2517         MDCFREE2="`cat $LPROC/mdc/*/kbytesfree | head -n 1`"
2518         if [ "$MDCFREE2" -lt "$((MDCFREE - 8))" ]; then
2519                 if [ "$MDSFREE" != "$MDSFREE2" ]; then
2520                         error "MDC before $MDCFREE != after $MDCFREE2"
2521                 else
2522                         echo "MDC before $MDCFREE != after $MDCFREE2"
2523                         echo "unable to confirm if MDS has large inodes"
2524                 fi
2525         fi
2526         rm -rf $DIR/d57b
2527 }
2528 run_test 57b "default LOV EAs are stored inside large inodes ==="
2529
2530 test_58() {
2531     [ -z "$(which wiretest 2>/dev/null)" ] && skip "could not find wiretest" && return
2532     wiretest
2533 }
2534 run_test 58 "verify cross-platform wire constants =============="
2535
2536 test_59() {
2537         echo "touch 130 files"
2538         createmany -o $DIR/f59- 130
2539         echo "rm 130 files"
2540         unlinkmany $DIR/f59- 130
2541         sync
2542         sleep 2
2543         # wait for commitment of removal
2544 }
2545 run_test 59 "verify cancellation of llog records async ========="
2546
2547 TEST60_HEAD="test_60 run $RANDOM"
2548 test_60() {
2549         [ ! -f run-llog.sh ] && skip "missing subtest run-llog.sh" && return
2550         log "$TEST60_HEAD - from kernel mode"
2551         sh run-llog.sh
2552 }
2553 run_test 60 "llog sanity tests run from kernel module =========="
2554
2555 test_60b() { # bug 6411
2556         dmesg > $DIR/$tfile
2557         LLOG_COUNT=`dmesg | grep -A 1000 "$TEST60_HEAD" | grep -c llog_test`
2558         [ $LLOG_COUNT -gt 50 ] && error "CDEBUG_LIMIT not limiting messages"|| true
2559 }
2560 run_test 60b "limit repeated messages from CERROR/CWARN ========"
2561
2562 test_60c() {
2563         echo "create 5000 files" 
2564         createmany -o $DIR/f60c- 5000
2565         #define OBD_FAIL_MDS_LLOG_CREATE_FAILED  0x137
2566         sysctl -w lustre.fail_loc=0x80000137
2567         unlinkmany $DIR/f60c- 5000
2568 }
2569 run_test 60c "unlink file when mds full"
2570
2571 test_61() {
2572         f="$DIR/f61"
2573         dd if=/dev/zero of=$f bs=`page_size` count=1
2574         cancel_lru_locks osc
2575         multiop $f OSMWUc || error
2576         sync
2577 }
2578 run_test 61 "mmap() writes don't make sync hang ================"
2579
2580 # bug 2330 - insufficient obd_match error checking causes LBUG
2581 test_62() {
2582         f="$DIR/f62"
2583         echo foo > $f
2584         cancel_lru_locks osc
2585         #define OBD_FAIL_OSC_MATCH 0x405
2586         sysctl -w lustre.fail_loc=0x405
2587         cat $f && error "cat succeeded, expect -EIO"
2588         sysctl -w lustre.fail_loc=0
2589 }
2590 run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
2591
2592 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
2593 test_63() {
2594         MAX_DIRTY_MB=`cat $LPROC/osc/*/max_dirty_mb | head -n 1`
2595         for i in $LPROC/osc/*/max_dirty_mb ; do
2596                 echo 0 > $i
2597         done
2598         for i in `seq 10` ; do
2599                 dd if=/dev/zero of=$DIR/f63 bs=8k &
2600                 sleep 5
2601                 kill $!
2602                 sleep 1
2603         done
2604
2605         for i in $LPROC/osc/*/max_dirty_mb ; do
2606                 echo $MAX_DIRTY_MB > $i
2607         done
2608         rm -f $DIR/f63 || true
2609 }
2610 run_test 63 "Verify oig_wait interruption does not crash ======="
2611
2612 # bug 2248 - async write errors didn't return to application on sync
2613 # bug 3677 - async write errors left page locked
2614 test_63b() {
2615         debugsave
2616         sysctl -w lnet.debug=-1
2617
2618         # ensure we have a grant to do async writes
2619         dd if=/dev/zero of=$DIR/$tfile bs=4k count=1
2620         rm $DIR/$tfile
2621
2622         #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406
2623         sysctl -w lustre.fail_loc=0x80000406
2624         multiop $DIR/$tfile Owy && \
2625                 error "sync didn't return ENOMEM"
2626         sync; sleep 2; sync     # do a real sync this time to flush page
2627         grep locked $LPROC/llite/*/dump_page_cache && \
2628                 error "locked page left in cache after async error" || true
2629         debugrestore
2630 }
2631 run_test 63b "async write errors should be returned to fsync ==="
2632
2633 test_64a () {
2634         df $DIR
2635         grep "[0-9]" $LPROC/osc/*[oO][sS][cC][_-]*/cur*
2636 }
2637 run_test 64a "verify filter grant calculations (in kernel) ====="
2638
2639 test_64b () {
2640         [ ! -f oos.sh ] && skip "missing subtest oos.sh" && return
2641         sh oos.sh $MOUNT
2642 }
2643 run_test 64b "check out-of-space detection on client ==========="
2644
2645 # bug 1414 - set/get directories' stripe info
2646 test_65a() {
2647         mkdir -p $DIR/d65
2648         touch $DIR/d65/f1
2649         $LVERIFY $DIR/d65 $DIR/d65/f1 || error "lverify failed"
2650 }
2651 run_test 65a "directory with no stripe info ===================="
2652
2653 test_65b() {
2654         mkdir -p $DIR/d65
2655         $SETSTRIPE $DIR/d65 $(($STRIPESIZE * 2)) 0 1 || error "setstripe"
2656         touch $DIR/d65/f2
2657         $LVERIFY $DIR/d65 $DIR/d65/f2 || error "lverify failed"
2658 }
2659 run_test 65b "directory setstripe $(($STRIPESIZE * 2)) 0 1 ==============="
2660
2661 test_65c() {
2662         if [ $OSTCOUNT -gt 1 ]; then
2663                 mkdir -p $DIR/d65
2664                 $SETSTRIPE $DIR/d65 $(($STRIPESIZE * 4)) 1 \
2665                         $(($OSTCOUNT - 1)) || error "setstripe"
2666                 touch $DIR/d65/f3
2667                 $LVERIFY $DIR/d65 $DIR/d65/f3 || error "lverify failed"
2668         fi
2669 }
2670 run_test 65c "directory setstripe $(($STRIPESIZE * 4)) 1 $(($OSTCOUNT - 1))"
2671
2672 [ $STRIPECOUNT -eq 0 ] && sc=1 || sc=$(($STRIPECOUNT - 1))
2673
2674 test_65d() {
2675         mkdir -p $DIR/d65
2676         $SETSTRIPE $DIR/d65 $STRIPESIZE -1 $sc || error "setstripe"
2677         touch $DIR/d65/f4 $DIR/d65/f5
2678         $LVERIFY $DIR/d65 $DIR/d65/f4 $DIR/d65/f5 || error "lverify failed"
2679 }
2680 run_test 65d "directory setstripe $STRIPESIZE -1 $sc =============="
2681
2682 test_65e() {
2683         mkdir -p $DIR/d65
2684
2685         $SETSTRIPE $DIR/d65 0 -1 0 || error "setstripe"
2686         $GETSTRIPE -v $DIR/d65 | grep "has no stripe info" || error "no stripe info failed"
2687         touch $DIR/d65/f6
2688         $LVERIFY $DIR/d65 $DIR/d65/f6 || error "lverify failed"
2689 }
2690 run_test 65e "directory setstripe 0 -1 0 ======================="
2691
2692 test_65f() {
2693         mkdir -p $DIR/d65f
2694         $RUNAS $SETSTRIPE $DIR/d65f 0 -1 0 && error "setstripe succeeded" || true
2695 }
2696 run_test 65f "dir setstripe permission (should return error) ==="
2697
2698 test_65g() {
2699         mkdir -p $DIR/d65
2700         $SETSTRIPE $DIR/d65 $(($STRIPESIZE * 2)) 0 1 || error "setstripe"
2701         $SETSTRIPE -d $DIR/d65 || error "setstripe"
2702         $GETSTRIPE -v $DIR/d65 | grep "has no stripe info" || \
2703                 error "delete default stripe failed"
2704 }
2705 run_test 65g "directory setstripe -d ==========================="
2706
2707 test_65h() {
2708         mkdir -p $DIR/d65
2709         $SETSTRIPE $DIR/d65 $(($STRIPESIZE * 2)) 0 1 || error "setstripe"
2710         mkdir -p $DIR/d65/dd1
2711         [ "`$GETSTRIPE -v $DIR/d65 | grep "^count"`" == \
2712           "`$GETSTRIPE -v $DIR/d65/dd1 | grep "^count"`" ] || error "stripe info inherit failed"
2713 }
2714 run_test 65h "directory stripe info inherit ===================="
2715  
2716 test_65i() { # bug6367
2717         $SETSTRIPE $MOUNT 65536 -1 -1
2718 }
2719 run_test 65i "set non-default striping on root directory (bug 6367)="
2720
2721 test_65j() { # bug6367
2722         # if we aren't already remounting for each test, do so for this test
2723         if [ "$CLEANUP" = ":" -a "$I_MOUNTED" = "yes" ]; then
2724                 cleanup -f || error "failed to unmount"
2725                 setup
2726         fi
2727         $SETSTRIPE -d $MOUNT || error "setstripe failed"
2728 }
2729 run_test 65j "set default striping on root directory (bug 6367)="
2730
2731 # bug 2543 - update blocks count on client
2732 test_66() {
2733         COUNT=${COUNT:-8}
2734         dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
2735         sync; sleep 1; sync
2736         BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
2737         [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
2738 }
2739 run_test 66 "update inode blocks count on client ==============="
2740
2741 test_67() { # bug 3285 - supplementary group fails on MDS, passes on client
2742         [ "$RUNAS_ID" = "$UID" ] && skip "RUNAS_ID = UID = $UID -- skipping" && return
2743         check_kernel_version 35 || return 0
2744         mkdir $DIR/$tdir
2745         chmod 771 $DIR/$tdir
2746         chgrp $RUNAS_ID $DIR/$tdir
2747         $RUNAS -u $RUNAS_ID -g $(($RUNAS_ID + 1)) -G1,2,$RUNAS_ID ls $DIR/$tdir
2748         RC=$?
2749         if [ "$MDS" ]; then
2750                 # can't tell which is correct otherwise
2751                 GROUP_UPCALL=`cat $LPROC/mds/$MDS/group_upcall`
2752                 [ "$GROUP_UPCALL" = "NONE" -a $RC -eq 0 ] && \
2753                         error "no-upcall passed" || true
2754                 [ "$GROUP_UPCALL" != "NONE" -a $RC -ne 0 ] && \
2755                         error "upcall failed" || true
2756         fi
2757 }
2758 run_test 67 "supplementary group failure (should return error) ="
2759
2760 cleanup_67b() {
2761         set +vx
2762         trap 0
2763         echo NONE > $LPROC/mds/$MDS/group_upcall
2764 }
2765
2766 test_67b() { # bug 3285 - supplementary group fails on MDS, passes on client
2767         T67_UID=${T67_UID:-1}   # needs to be in /etc/groups on MDS, gid == uid
2768         [ "$UID" = "$T67_UID" ] && skip "UID = T67_UID = $UID -- skipping" && return
2769         check_kernel_version 35 || return 0
2770         [ -z "$MDS" ] && skip "no MDS" && return
2771         GROUP_UPCALL=`cat $LPROC/mds/$MDS/group_upcall`
2772         [ "$GROUP_UPCALL" != "NONE" ] && skip "skip test - upcall" &&return
2773         set -vx
2774         trap cleanup_67b EXIT
2775         mkdir -p $DIR/$tdir
2776         chmod 771 $DIR/$tdir
2777         chgrp $T67_UID $DIR/$tdir
2778         echo `which l_getgroups` > $LPROC/mds/$MDS/group_upcall
2779         l_getgroups -d $T67_UID
2780         $RUNAS -u $T67_UID -g 999 -G8,9,$T67_UID touch $DIR/$tdir/$tfile || \
2781                 error "'touch $DIR/$tdir/$tfile' failed"
2782         [ -f $DIR/$tdir/$tfile ] || error "$DIR/$tdir/$tfile create error"
2783         cleanup_67b
2784 }
2785 run_test 67b "supplementary group test ========================="
2786
2787 cleanup_68() {
2788         trap 0
2789         if [ "$LOOPDEV" ]; then
2790                 swapoff $LOOPDEV || error "swapoff failed"
2791                 losetup -d $LOOPDEV || error "losetup -d failed"
2792                 unset LOOPDEV LOOPNUM
2793         fi
2794         rm -f $DIR/f68
2795 }
2796
2797 meminfo() {
2798         awk '($1 == "'$1':") { print $2 }' /proc/meminfo
2799 }
2800
2801 swap_used() {
2802         swapon -s | awk '($1 == "'$1'") { print $4 }'
2803 }
2804
2805 # excercise swapping to lustre by adding a high priority swapfile entry
2806 # and then consuming memory until it is used.
2807 test_68() {
2808         [ "$UID" != 0 ] && skip "must run as root" && return
2809         grep -q obdfilter $LPROC/devices && \
2810                 skip "local OST" && return
2811
2812         find_loop_dev
2813         dd if=/dev/zero of=$DIR/f68 bs=64k count=1024
2814
2815         trap cleanup_68 EXIT
2816
2817         losetup $LOOPDEV $DIR/f68 || error "losetup $LOOPDEV failed"
2818         mkswap $LOOPDEV
2819         swapon -p 32767 $LOOPDEV || error "swapon $LOOPDEV failed"
2820
2821         echo "before: `swapon -s | grep $LOOPDEV`"
2822         KBFREE=`meminfo MemTotal`
2823         $MEMHOG $KBFREE || error "error allocating $KBFREE kB"
2824         echo "after: `swapon -s | grep $LOOPDEV`"
2825         SWAPUSED=`swap_used $LOOPDEV`
2826
2827         cleanup_68
2828
2829         [ $SWAPUSED -eq 0 ] && echo "no swap used???" || true
2830 }
2831 run_test 68 "support swapping to Lustre ========================"
2832
2833 # bug5265, obdfilter oa2dentry return -ENOENT
2834 # #define OBD_FAIL_OST_ENOENT 0x217
2835 test_69() {
2836         [ $(grep -c obdfilter $LPROC/devices) -eq 0 ] &&
2837                 skip "skipping test for remote OST" && return
2838
2839         f="$DIR/$tfile"
2840         touch $f
2841
2842         if ! $DIRECTIO write ${f}.2 0 1; then
2843                 skip "O_DIRECT not implemented"
2844                 return 0
2845         fi
2846
2847         #define OBD_FAIL_OST_ENOENT 0x217
2848         sysctl -w lustre.fail_loc=0x217
2849         truncate $f 1 # vmtruncate() will ignore truncate() error.
2850         $DIRECTIO write $f 0 2 && error "write succeeded, expect -ENOENT"
2851
2852         sysctl -w lustre.fail_loc=0
2853         $DIRECTIO write $f 0 2 || error "write error"
2854
2855         cancel_lru_locks osc
2856         $DIRECTIO read $f 0 1 || error "read error"
2857
2858         #define OBD_FAIL_OST_ENOENT 0x217
2859         sysctl -w lustre.fail_loc=0x217
2860         $DIRECTIO read $f 1 1 && error "read succeeded, expect -ENOENT"
2861
2862         sysctl -w lustre.fail_loc=0
2863         rm -f $f
2864 }
2865 run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======"
2866
2867 test_71() {
2868         which dbench > /dev/null 2>&1 || skip "dbench not installed, skip this test" && return 0
2869         DBENCH_LIB=${DBENCH_LIB:-/usr/lib/dbench}
2870         PATH=${DBENCH_LIB}:${PATH}
2871         cp `which dbench` $DIR
2872
2873         TGT=$DIR/client.txt
2874         SRC=${SRC:-$DBENCH_LIB/client.txt}
2875         [ ! -e $TGT -a -e $SRC ] && echo "copying $SRC to $TGT" && cp $SRC $TGT
2876         SRC=$DBENCH_LIB/client_plain.txt
2877         [ ! -e $TGT -a -e $SRC ] && echo "copying $SRC to $TGT" && cp $SRC $TGT
2878
2879         echo "copying necessary lib to $DIR"
2880         [ -d /lib64 ] && LIB71=/lib64 || LIB71=/lib
2881         mkdir -p $DIR$LIB71 || error "can't create $DIR$LIB71"
2882         cp $LIB71/libc* $DIR$LIB71 || error "can't copy $LIB71/libc*"
2883         cp $LIB71/ld-* $DIR$LIB71 || error "can't create $LIB71/ld-*"
2884
2885         echo "chroot $DIR /dbench -c client.txt 2"
2886         chroot $DIR /dbench -c client.txt 2
2887         RC=$?
2888
2889         rm -rf $DIR/dbench $TGT $DIR$LIB71
2890
2891         return $RC
2892 }
2893 run_test 71 "Running dbench on lustre (don't segment fault) ===="
2894
2895 test_72() { # bug 5695 - Test that on 2.6 remove_suid works properly
2896         check_kernel_version 43 || return 0
2897         [ "$RUNAS_ID" = "$UID" ] && skip "RUNAS_ID = UID = $UID -- skipping" && return
2898         touch $DIR/f72
2899         chmod 777 $DIR/f72
2900         chmod ug+s $DIR/f72
2901         $RUNAS -u $(($RUNAS_ID + 1)) dd if=/dev/zero of=$DIR/f72 bs=512 count=1 || error
2902         # See if we are still setuid/sgid
2903         test -u $DIR/f72 -o -g $DIR/f72 && error "S/gid is not dropped on write"
2904         # Now test that MDS is updated too
2905         cancel_lru_locks mdc
2906         test -u $DIR/f72 -o -g $DIR/f72 && error "S/gid is not dropped on MDS"
2907         true
2908 }
2909 run_test 72 "Test that remove suid works properly (bug5695) ===="
2910
2911 # bug 3462 - multiple simultaneous MDC requests
2912 test_73() {
2913         mkdir $DIR/d73-1 
2914         mkdir $DIR/d73-2
2915         multiop $DIR/d73-1/f73-1 O_c &
2916         pid1=$!
2917         #give multiop a chance to open
2918         usleep 500
2919
2920         #define OBD_FAIL_MDS_PAUSE_OPEN 0x129
2921         sysctl -w lustre.fail_loc=0x80000129
2922         multiop $DIR/d73-1/f73-2 Oc &
2923         sleep 1
2924         sysctl -w lustre.fail_loc=0
2925
2926         multiop $DIR/d73-2/f73-3 Oc &
2927         pid3=$!
2928
2929         kill -USR1 $pid1
2930         wait $pid1 || return 1
2931
2932         sleep 25
2933
2934         $CHECKSTAT -t file $DIR/d73-1/f73-1 || return 4
2935         $CHECKSTAT -t file $DIR/d73-1/f73-2 || return 5 
2936         $CHECKSTAT -t file $DIR/d73-2/f73-3 || return 6 
2937
2938         rm -rf $DIR/d73-*
2939 }
2940 run_test 73 "multiple MDC requests (should not deadlock)"
2941
2942 test_74() { # bug 6149, 6184
2943         #define OBD_FAIL_LDLM_ENQUEUE_OLD_EXPORT 0x30e
2944         #
2945         # very important to OR with OBD_FAIL_ONCE (0x80000000) -- otherwise it
2946         # will spin in a tight reconnection loop
2947         sysctl -w lustre.fail_loc=0x8000030e
2948         # get any lock
2949         touch $DIR/f74
2950         sysctl -w lustre.fail_loc=0
2951         true
2952 }
2953 run_test 74 "ldlm_enqueue freed-export error path (shouldn't LBUG)"
2954
2955 JOIN=${JOIN:-"lfs join"}
2956 F75=$DIR/f75
2957 F128k=${F75}_128k
2958 FHEAD=${F75}_head
2959 FTAIL=${F75}_tail
2960 export T75_PREP=no
2961 test75_prep() {
2962         [ $T75_PREP = "yes" ] && return
2963         echo "using F75=$F75, F128k=$F128k, FHEAD=$FHEAD, FTAIL=$FTAIL"
2964  
2965         dd if=/dev/urandom of=${F75}_128k bs=128k count=1 || error "dd failed"
2966         log "finished dd"
2967         chmod 777 ${F128k}
2968         T75_PREP=yes
2969 }
2970  
2971 test_75a() {
2972         test75_prep
2973  
2974         cp -p ${F128k} ${FHEAD}
2975         log "finished cp to $FHEAD"
2976         cp -p ${F128k} ${FTAIL}
2977         log "finished cp to $FTAIL"
2978         cat ${F128k} ${F128k} > ${F75}_sim_sim
2979  
2980         $JOIN ${FHEAD} ${FTAIL} || error "join ${FHEAD} ${FTAIL} error"
2981         log "finished join $FHEAD to ${F75}_sim_sim"
2982         cmp ${FHEAD} ${F75}_sim_sim || error "${FHEAD} ${F75}_sim_sim differ"
2983         log "finished cmp $FHEAD to ${F75}_sim_sim"
2984         $CHECKSTAT -a ${FTAIL} || error "tail ${FTAIL} still exist after join"
2985 }
2986 run_test 75a "TEST join file ===================================="
2987  
2988 test_75b() {
2989         test75_prep
2990  
2991         cp -p ${F128k} ${FTAIL}
2992         cat ${F75}_sim_sim >> ${F75}_join_sim
2993         cat ${F128k} >> ${F75}_join_sim
2994         $JOIN ${FHEAD} ${FTAIL} || error "join ${FHEAD} ${FTAIL} error"
2995         cmp ${FHEAD} ${F75}_join_sim || \
2996                 error "${FHEAD} ${F75}_join_sim are different"
2997         $CHECKSTAT -a ${FTAIL} || error "tail ${FTAIL} exist after join"
2998 }
2999 run_test 75b "TEST join file 2 =================================="
3000  
3001 test_75c() {
3002         test75_prep
3003  
3004         cp -p ${F128k} ${FTAIL}
3005         cat ${F128k} >> ${F75}_sim_join
3006         cat ${F75}_join_sim >> ${F75}_sim_join
3007         $JOIN ${FTAIL} ${FHEAD} || error "join error"
3008         cmp ${FTAIL} ${F75}_sim_join || \
3009                 error "${FTAIL} ${F75}_sim_join are different"
3010         $CHECKSTAT -a ${FHEAD} || error "tail ${FHEAD} exist after join"
3011 }
3012 run_test 75c "TEST join file 3 =================================="
3013  
3014 test_75d() {
3015         test75_prep
3016  
3017         cp -p ${F128k} ${FHEAD}
3018         cp -p ${F128k} ${FHEAD}_tmp
3019         cat ${F75}_sim_sim >> ${F75}_join_join
3020         cat ${F75}_sim_join >> ${F75}_join_join
3021         $JOIN ${FHEAD} ${FHEAD}_tmp || error "join ${FHEAD} ${FHEAD}_tmp error"
3022         $JOIN ${FHEAD} ${FTAIL} || error "join ${FHEAD} ${FTAIL} error"
3023         cmp ${FHEAD} ${F75}_join_join ||error "${FHEAD} ${F75}_join_join differ"        $CHECKSTAT -a ${FHEAD}_tmp || error "${FHEAD}_tmp exist after join"
3024         $CHECKSTAT -a ${FTAIL} || error "tail ${FTAIL} exist after join (2)"
3025 }
3026 run_test 75d "TEST join file 4 =================================="
3027  
3028 test_75e() {
3029         test75_prep
3030  
3031         rm -rf ${FHEAD} || "delete join file error"
3032 }
3033 run_test 75e "TEST join file 5 (remove joined file) ============="
3034  
3035 test_75f() {
3036         test75_prep
3037  
3038         cp -p ${F128k} ${F75}_join_10_compare
3039         cp -p ${F128k} ${F75}_join_10
3040         for ((i = 0; i < 10; i++)); do
3041                 cat ${F128k} >> ${F75}_join_10_compare
3042                 cp -p ${F128k} ${FTAIL}
3043                 $JOIN ${F75}_join_10 ${FTAIL} || \
3044                         error "join ${F75}_join_10 ${FTAIL} error"
3045                 $CHECKSTAT -a ${FTAIL} || error "tail file exist after join"
3046         done
3047         cmp ${F75}_join_10 ${F75}_join_10_compare || \
3048                 error "files ${F75}_join_10 ${F75}_join_10_compare differ"
3049 }
3050 run_test 75f "TEST join file 6 (join 10 files) =================="
3051  
3052 test_75g() {
3053         [ ! -f ${F75}_join_10 ] && echo "${F75}_join_10 missing" && return
3054         $LFS getstripe ${F75}_join_10
3055  
3056         $OPENUNLINK ${F75}_join_10 ${F75}_join_10 || error "files unlink open"
3057  
3058         ls -l $F75*
3059 }
3060 run_test 75g "TEST join file 7 (open unlink) ===================="
3061
3062 num_inodes() {
3063         awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo
3064 }
3065
3066 test_76() { # bug 1443
3067         DETH=$(grep deathrow /proc/kallsyms /proc/ksyms 2> /dev/null | wc -l)
3068         [ $DETH -eq 0 ] && skip "No _iget." && return 0
3069         BEFORE_INODES=`num_inodes`
3070         echo "before inodes: $BEFORE_INODES"
3071         for i in `seq 1000`; do
3072                 touch $DIR/$tfile
3073                 rm -f $DIR/$tfile
3074         done
3075         AFTER_INODES=`num_inodes`
3076         echo "after inodes: $AFTER_INODES"
3077         [ $AFTER_INODES -gt $((BEFORE_INODES + 32)) ] && \
3078                 error "inode slab grew from $BEFORE_INODES to $AFTER_INODES"
3079         true
3080 }
3081 run_test 76 "destroy duplicate inodes in client inode cache ===="
3082
3083 export ORIG_CSUM=""
3084 set_checksums()
3085 {
3086         [ "$ORIG_CSUM" ]||ORIG_CSUM=`cat $LPROC/llite/*/checksum_pages|head -n1`
3087         for f in $LPROC/llite/*/checksum_pages; do
3088                 echo $1 >> $f
3089         done
3090
3091         return 0
3092 }
3093
3094 F77_TMP=$TMP/f77-temp
3095 F77SZ=8
3096 setup_f77() {
3097         dd if=/dev/urandom of=$F77_TMP bs=1M count=$F77SZ || \
3098                 error "error writing to $F77_TMP"
3099 }
3100
3101 test_77a() { # bug 10889
3102         [ ! -f $F77_TMP ] && setup_f77
3103         set_checksums 1
3104         dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ || error "dd error"
3105         set_checksums 0
3106 }
3107 run_test 77a "normal checksum read/write operation ============="
3108
3109 test_77b() { # bug 10889
3110         [ ! -f $F77_TMP ] && setup_f77
3111         #define OBD_FAIL_OSC_CHECKSUM_SEND       0x409
3112         sysctl -w lustre.fail_loc=0x80000409
3113         set_checksums 1
3114         dd if=$F77_TMP of=$DIR/f77b bs=1M count=$F77SZ conv=sync || \
3115                 error "dd error: $?"
3116         sysctl -w lustre.fail_loc=0
3117         set_checksums 0
3118 }
3119 run_test 77b "checksum error on client write ===================="
3120
3121 test_77c() { # bug 10889
3122         [ ! -f $DIR/f77b ] && skip "requires 77b - skipping" && return  
3123         cancel_lru_locks osc
3124         #define OBD_FAIL_OSC_CHECKSUM_RECEIVE    0x408
3125         sysctl -w lustre.fail_loc=0x80000408
3126         set_checksums 1
3127         cmp $F77_TMP $DIR/f77b || error "file compare failed"
3128         sysctl -w lustre.fail_loc=0
3129         set_checksums 0
3130 }
3131 run_test 77c "checksum error on client read ==================="
3132
3133 test_77d() { # bug 10889
3134         #define OBD_FAIL_OSC_CHECKSUM_SEND       0x409
3135         sysctl -w lustre.fail_loc=0x80000409
3136         set_checksums 1
3137         directio write $DIR/f77 0 $F77SZ $((1024 * 1024)) || \
3138                 error "direct write: rc=$?"
3139         sysctl -w lustre.fail_loc=0
3140         set_checksums 0
3141 }
3142 run_test 77d "checksum error on OST direct write ==============="
3143
3144 test_77e() { # bug 10889
3145         [ ! -f $DIR/f77 ] && skip "requires 77d - skipping" && return  
3146         #define OBD_FAIL_OSC_CHECKSUM_RECEIVE    0x408
3147         sysctl -w lustre.fail_loc=0x80000408
3148         set_checksums 1
3149         cancel_lru_locks osc
3150         directio read $DIR/f77 0 $F77SZ $((1024 * 1024)) || \
3151                 error "direct read: rc=$?"
3152         sysctl -w lustre.fail_loc=0
3153         set_checksums 0
3154 }
3155 run_test 77e "checksum error on OST direct read ================"
3156
3157 test_77f() { # bug 10889
3158         #define OBD_FAIL_OSC_CHECKSUM_SEND       0x409
3159         sysctl -w lustre.fail_loc=0x409
3160         set_checksums 1
3161         directio write $DIR/f77 0 $F77SZ $((1024 * 1024)) && \
3162                 error "direct write succeeded"
3163         sysctl -w lustre.fail_loc=0
3164         set_checksums 0
3165 }
3166 run_test 77f "repeat checksum error on write (expect error) ===="
3167
3168 test_77g() { # bug 10889
3169         [ $(grep -c obdfilter $LPROC/devices) -eq 0 ] && \
3170                 skip "remote OST" && return
3171         [ ! -f $F77_TMP ] && setup_f77
3172         #define OBD_FAIL_OST_CHECKSUM_RECEIVE       0x21a
3173         sysctl -w lustre.fail_loc=0x8000021a
3174         set_checksums 1
3175         dd if=$F77_TMP of=$DIR/f77g bs=1M count=$F77SZ || \
3176                 error "write error: rc=$?"
3177         sysctl -w lustre.fail_loc=0
3178         set_checksums 0
3179 }
3180 run_test 77g "checksum error on OST write ======================"
3181
3182 test_77h() { # bug 10889
3183         [ $(grep -c obdfilter $LPROC/devices) -eq 0 ] && \
3184                 skip "remote OST" && return
3185         [ ! -f $DIR/f77g ] && skip "requires 77g - skipping" && return  
3186         cancel_lru_locks osc
3187         #define OBD_FAIL_OST_CHECKSUM_SEND          0x21b
3188         sysctl -w lustre.fail_loc=0x8000021b
3189         set_checksums 1
3190         cmp $F77_TMP $DIR/f77g || error "file compare failed"
3191         sysctl -w lustre.fail_loc=0
3192         set_checksums 0
3193 }
3194 run_test 77h "checksum error on OST read ======================="
3195
3196 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
3197 rm -f $F77_TMP
3198 unset F77_TMP
3199
3200 test_78() { # bug 10901
3201         NSEQ=5
3202         F78SIZE=$(($(awk '/MemFree:/ { print $2 }' /proc/meminfo) / 1024))
3203         echo "MemFree: $F78SIZE, Max file size: $MAXFREE"
3204         MEMTOTAL=$(($(awk '/MemTotal:/ { print $2 }' /proc/meminfo) / 2048))
3205         echo "MemTotal: $((MEMTOTAL * 2))"
3206         [ $F78SIZE -gt $MEMTOTAL ] && F78SIZE=$MEMTOTAL
3207         [ $F78SIZE -gt 512 ] && F78SIZE=512
3208         [ $F78SIZE -gt $((MAXFREE / 1024)) ] && F78SIZE=$((MAXFREE / 1024))
3209         SMALLESTOST=`lfs df $DIR |grep OST | awk '{print $4}' |sort -n |head -1`
3210         echo "Smallest OST: $SMALLESTOST"
3211         [ $F78SIZE -gt $((SMALLESTOST * $OSTCOUNT / 1024)) ] && \
3212                 F78SIZE=$((SMALLESTOST * $OSTCOUNT / 1024))
3213         echo "File size: $F78SIZE"
3214         $SETSTRIPE $DIR/$tfile 0 -1 -1 || error "setstripe failed"
3215         for i in `seq 1 $NSEQ`
3216         do
3217                 FSIZE=$(($F78SIZE / ($NSEQ - $i + 1)))
3218                 echo directIO rdwr round $i of $NSEQ
3219                 $DIRECTIO rdwr $DIR/$tfile 0 $FSIZE 1048576||error "rdwr failed"
3220         done
3221
3222         rm -f $DIR/$tfile
3223 }
3224 run_test 78 "handle large O_DIRECT writes correctly ============"
3225
3226 # on the LLNL clusters, runas will still pick up root's $TMP settings,
3227 # which will not be writable for the runas user, and then you get a CVS
3228 # error message with a corrupt path string (CVS bug) and panic.
3229 # We're not using much space, so just stick it in /tmp, which is safe.
3230 OLDTMPDIR=$TMPDIR
3231 OLDTMP=$TMP
3232 TMPDIR=/tmp
3233 TMP=/tmp
3234 OLDHOME=$HOME
3235 [ $RUNAS_ID -ne $UID ] && HOME=/tmp
3236
3237 test_99a() {
3238         mkdir -p $DIR/d99cvsroot || error "mkdir $DIR/d99cvsroot failed"
3239         chown $RUNAS_ID $DIR/d99cvsroot || error "chown $DIR/d99cvsroot failed"
3240         $RUNAS cvs -d $DIR/d99cvsroot init || error "cvs init failed"
3241 }
3242 run_test 99a "cvs init ========================================="
3243
3244 test_99b() {
3245         [ ! -d $DIR/d99cvsroot ] && test_99a
3246         $RUNAS [ ! -w /tmp ] && skip "/tmp has wrong w permission -- skipping" && return
3247         cd /etc/init.d || error "cd /etc/init.d failed"
3248         # some versions of cvs import exit(1) when asked to import links or
3249         # files they can't read.  ignore those files.
3250         TOIGNORE=$(find . -type l -printf '-I %f\n' -o \
3251                         ! -perm +4 -printf '-I %f\n')
3252         $RUNAS cvs -d $DIR/d99cvsroot import -m "nomesg" $TOIGNORE \
3253                 d99reposname vtag rtag || error "cvs import failed"
3254 }
3255 run_test 99b "cvs import ======================================="
3256
3257 test_99c() {
3258         [ ! -d $DIR/d99cvsroot ] && test_99b
3259         cd $DIR || error "cd $DIR failed"
3260         mkdir -p $DIR/d99reposname || error "mkdir $DIR/d99reposname failed"
3261         chown $RUNAS_ID $DIR/d99reposname || \
3262                 error "chown $DIR/d99reposname failed"
3263         $RUNAS cvs -d $DIR/d99cvsroot co d99reposname || \
3264                 error "cvs co d99reposname failed"
3265 }
3266 run_test 99c "cvs checkout ====================================="
3267
3268 test_99d() {
3269         [ ! -d $DIR/d99cvsroot ] && test_99c
3270         cd $DIR/d99reposname
3271         $RUNAS touch foo99
3272         $RUNAS cvs add -m 'addmsg' foo99
3273 }
3274 run_test 99d "cvs add =========================================="
3275
3276 test_99e() {
3277         [ ! -d $DIR/d99cvsroot ] && test_99c
3278         cd $DIR/d99reposname
3279         $RUNAS cvs update
3280 }
3281 run_test 99e "cvs update ======================================="
3282
3283 test_99f() {
3284         [ ! -d $DIR/d99cvsroot ] && test_99d
3285         cd $DIR/d99reposname
3286         $RUNAS cvs commit -m 'nomsg' foo99
3287 }
3288 run_test 99f "cvs commit ======================================="
3289
3290 test_100() {
3291         netstat -tna | while read PROT SND RCV LOCAL REMOTE STAT; do
3292                 [ "$PROT" != "tcp" ] && continue
3293                 RPORT=`echo $REMOTE | cut -d: -f2`
3294                 [ "$RPORT" != "$ACCEPTOR_PORT" ] && continue
3295                 LPORT=`echo $LOCAL | cut -d: -f2`
3296                 if [ $LPORT -ge 1024 ]; then
3297                         echo "bad: $PROT $SND $RCV $LOCAL $REMOTE $STAT"
3298                         netstat -tna
3299                         error "local: $LPORT > 1024, remote: $RPORT"
3300                 fi
3301         done
3302         true
3303 }
3304 run_test 100 "check local port using privileged port ==========="
3305
3306 function get_named_value()
3307 {
3308     local tag
3309
3310     tag=$1
3311     while read ;do
3312         line=$REPLY
3313         case $line in
3314         $tag*)
3315             echo $line | sed "s/^$tag//"
3316             break
3317             ;;
3318         esac
3319     done
3320 }
3321
3322 export CACHE_MAX=`cat $LPROC/llite/*/max_cached_mb | head -n 1`
3323 cleanup_101() {
3324         for s in $LPROC/llite/*/max_cached_mb; do
3325                 echo $CACHE_MAX > $s
3326         done
3327         trap 0
3328 }
3329
3330 test_101() {
3331         local s
3332         local discard
3333         local nreads=10000
3334         [ "$CPU" = "UML" ] && nreads=1000
3335         local cache_limit=32
3336
3337         for s in $LPROC/osc/*/rpc_stats; do
3338                 echo 0 > $s
3339         done
3340         trap cleanup_101 EXIT
3341         for s in $LPROC/llite/*; do
3342                 echo 0 > $s/read_ahead_stats
3343                 echo $cache_limit > $s/max_cached_mb
3344         done
3345
3346         #
3347         # randomly read 10000 of 64K chunks from file 3x 32MB in size
3348         #
3349         echo "nreads: $nreads file size: $((cache_limit * 3))MB"
3350         $RANDOM_READS -f $DIR/$tfile -s$((cache_limit * 3192 * 1024)) -b65536 -C -n$nreads -t 180
3351
3352         discard=0
3353         for s in $LPROC/llite/*; do
3354                 discard=$(($discard + $(cat $s/read_ahead_stats | get_named_value 'read but discarded')))
3355         done
3356         cleanup_101
3357
3358         if [ $(($discard * 10)) -gt $nreads ] ;then
3359                 for s in $LPROC/osc/*/rpc_stats; do
3360                         echo $s; cat $s
3361                 done
3362                 for s in $LPROC/llite/*/read_ahead_stats; do
3363                         echo $s; cat $s
3364                 done
3365                 error "too many ($discard) discarded pages" 
3366         fi
3367         rm -f $DIR/$tfile || true
3368 }
3369 run_test 101 "check read-ahead for random reads ================"
3370
3371 export SETUP_TEST102=no
3372 setup_test102() {
3373         [ "$SETUP_TEST102" = "yes" ] && return
3374         mkdir -p $DIR/$tdir
3375         STRIPE_SIZE=65536
3376         STRIPE_COUNT=4 
3377         STRIPE_OFFSET=2
3378
3379         trap cleanup_test102 EXIT
3380         cd $DIR
3381         $SETSTRIPE $tdir $STRIPE_SIZE  $STRIPE_OFFSET $STRIPE_COUNT
3382         cd $DIR/$tdir 
3383         for num in 1 2 3 4
3384         do
3385                 for count in 1 2 3 4
3386                 do
3387                         for offset in 0 1 2 3 
3388                         do
3389                                 local stripe_size=`expr $STRIPE_SIZE \* $num`
3390                                 local file=file"$num-$offset-$count"
3391                                 $SETSTRIPE $file $stripe_size  $offset $count
3392                         done
3393                 done
3394         done
3395
3396         cd ..
3397         star -c  f=$TMP/f102.tar $tdir 
3398         SETUP_TEST102=yes
3399 }
3400
3401 cleanup_test102() {
3402         [ "$SETUP_TEST102" = "yes" ] || return
3403         trap 0
3404         rm -f $TMP/f102.tar
3405         rm -rf $DIR/$tdir
3406         SETUP_TEST102=no
3407 }
3408
3409 test_102a() {
3410         local testfile=$DIR/xattr_testfile
3411
3412         rm -f $testfile
3413         touch $testfile
3414
3415         [ "$UID" != 0 ] && skip "must run as root" && return
3416         [ -z "`grep xattr $LPROC/mdc/*[mM][dD][cC]*/connect_flags`" ] && skip "must have user_xattr" && return
3417         [ -z "$(which setfattr 2>/dev/null)" ] && skip "could not find setfattr" && return
3418
3419         echo "set/get xattr..."
3420         setfattr -n trusted.name1 -v value1 $testfile || error
3421         [ "`getfattr -n trusted.name1 $testfile 2> /dev/null | \
3422         grep "trusted.name1"`" == "trusted.name1=\"value1\"" ] || error
3423  
3424         setfattr -n user.author1 -v author1 $testfile || error
3425         [ "`getfattr -n user.author1 $testfile 2> /dev/null | \
3426         grep "user.author1"`" == "user.author1=\"author1\"" ] || error
3427
3428         echo "listxattr..."
3429         setfattr -n trusted.name2 -v value2 $testfile || error
3430         setfattr -n trusted.name3 -v value3 $testfile || error
3431         [ `getfattr -d -m "^trusted" $testfile 2> /dev/null | \
3432         grep "trusted.name" | wc -l` -eq 3 ] || error
3433
3434  
3435         setfattr -n user.author2 -v author2 $testfile || error
3436         setfattr -n user.author3 -v author3 $testfile || error
3437         [ `getfattr -d -m "^user" $testfile 2> /dev/null | \
3438         grep "user" | wc -l` -eq 3 ] || error
3439
3440         echo "remove xattr..."
3441         setfattr -x trusted.name1 $testfile || error
3442         getfattr -d -m trusted $testfile 2> /dev/null | \
3443         grep "trusted.name1" && error || true
3444
3445         setfattr -x user.author1 $testfile || error
3446         getfattr -d -m user $testfile 2> /dev/null | \
3447         grep "user.author1" && error || true
3448
3449         # b10667: setting lustre special xattr be silently discarded
3450         echo "set lustre special xattr ..."
3451         setfattr -n "trusted.lov" -v "invalid value" $testfile || error
3452
3453         rm -f $testfile
3454 }
3455 run_test 102a "user xattr test =================================="
3456
3457 test_102b() {
3458         # b10930: get/set/list trusted.lov xattr
3459         echo "get/set/list trusted.lov xattr ..."
3460         [ "$OSTCOUNT" -lt "2" ] && skip "skipping 2-stripe test" && return
3461         local testfile=$DIR/$tfile
3462         $SETSTRIPE $testfile 65536 1 2
3463         getfattr -d -m "^trusted" $testfile 2> /dev/null | \
3464         grep "trusted.lov" || error "can't get trusted.lov from $testfile"
3465
3466         local testfile2=${testfile}2
3467         local value=`getfattr -n trusted.lov $testfile 2> /dev/null | \
3468                      grep "trusted.lov" |sed -e 's/[^=]\+=//'`
3469         
3470         $MCREATE $testfile2
3471         setfattr -n trusted.lov -v $value $testfile2    
3472         local tmp_file=${testfile}3
3473         $GETSTRIPE -v $testfile2 > $tmp_file
3474         local stripe_size=`grep "size"  $tmp_file| awk '{print $2}'`
3475         local stripe_count=`grep "count"  $tmp_file| awk '{print $2}'`
3476         [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
3477         [ $stripe_count -eq 2 ] || error "stripe count $stripe_count != 2"
3478 }
3479 run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
3480
3481 test_102c() {
3482         # b10930: get/set/list trusted.lov xattr
3483         echo "get/set/list trusted.lov xattr ..."
3484         [ "$OSTCOUNT" -lt "2" ] && skip "skipping 2-stripe test" && return
3485         mkdir -p $DIR/$tdir
3486         chown $RUNAS_ID $DIR/$tdir
3487         local testfile=$DIR/$tdir/$tfile
3488         $RUNAS $SETSTRIPE $testfile 65536 1 2
3489         $RUNAS getfattr -d -m "^trusted" $testfile 2> /dev/null | \
3490         grep "trusted.lov" || error "can't get trusted.lov from $testfile"
3491
3492         local testfile2=${testfile}2
3493         local value=`getfattr -n trusted.lov $testfile 2> /dev/null | \
3494                      grep "trusted.lov" |sed -e 's/[^=]\+=//'  `
3495         
3496         $RUNAS $MCREATE $testfile2
3497         $RUNAS setfattr -n trusted.lov -v $value $testfile2     
3498         local tmp_file=${testfile}3
3499         $RUNAS $GETSTRIPE -v $testfile2 > $tmp_file
3500         local stripe_size=`grep "size"  $tmp_file| awk '{print $2}'`
3501         local stripe_count=`grep "count"  $tmp_file| awk '{print $2}'`
3502         [ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
3503         [ $stripe_count -eq 2 ] || error "stripe count $stripe_count != 2"
3504 }
3505 run_test 102c "non-root getfattr/setfattr for trusted.lov EAs ==========="
3506
3507 get_stripe_info() {
3508         stripe_size=0
3509         stripe_count=0
3510         stripe_offset=0
3511         local lines=`sed -n '/obdidx/=' $1`
3512         stripe_size=`awk '{if($1~/size/) print $2}' $1`
3513         stripe_count=`awk '{if($1~/count/) print $2}' $1`
3514         lines=`expr $lines + 1`
3515         stripe_offset=`sed -n ${lines}p $1 |awk '{print $1}'`
3516 }
3517
3518 compare_stripe_info1() {
3519         for num in 1 2 3 4
3520         do
3521                 for count in 1 2 3 4
3522                 do
3523                         for offset in 0 1 2 3 
3524                         do
3525                                 local size=`expr $STRIPE_SIZE \* $num`
3526                                 local file=file"$num-$offset-$count"
3527                                 local tmp_file=out
3528                                 $GETSTRIPE -v $file > $tmp_file 
3529                                 get_stripe_info  $tmp_file
3530                                 if test $stripe_size -ne $size
3531                                 then
3532                                         error "$file: different stripe size" && return
3533                                 fi
3534                                 if test $stripe_count -ne $count
3535                                 then
3536                                         error "$file: different stripe count" && return
3537                                 fi
3538                                 if test $stripe_offset -ne 0
3539                                 then
3540                                         error "$file: different stripe offset" && return
3541                                 fi
3542                                 rm -f $tmp_file
3543                         done
3544                 done
3545         done
3546 }
3547
3548 compare_stripe_info2() {
3549         for num in 1 2 3 4
3550         do
3551                 for count in 1 2 3 4
3552                 do
3553                         for offset in 0 1 2 3 
3554                         do
3555                                 local size=`expr $STRIPE_SIZE \* $num`
3556                                 local file=file"$num-$offset-$count"
3557                                 local tmp_file=out
3558                                 $GETSTRIPE -v $file > $tmp_file
3559                                 get_stripe_info  $tmp_file
3560                                 if test $stripe_size -ne $size
3561                                 then
3562                                         error "$file: different stripe size" && return  
3563                                 fi
3564                                 if test $stripe_count -ne $count
3565                                 then
3566                                         error "$file: different stripe count" && return
3567                                 fi
3568                                 if test $stripe_offset -ne $offset
3569                                 then
3570                                         error "$file: different stripe offset" && return
3571                                 fi
3572                                 rm -f $tmp_file
3573                         done
3574                 done
3575         done
3576 }
3577
3578 test_102d() {
3579         # b10930: star test for trusted.lov xattr
3580         star --xhelp 2>&1 | grep -q nolustre  
3581         if [ $? -ne 0 ]
3582         then
3583                 skip "being skipped because a lustre-aware star is not installed." && return
3584         fi
3585         [ "$OSTCOUNT" -lt "4" ] && skip "skipping 4-stripe test" && return
3586         setup_test102
3587         mkdir -p $DIR/d102d
3588         star -x  f=$TMP/f102.tar -C $DIR/d102d
3589         cd $DIR/d102d/$tdir
3590         compare_stripe_info1
3591
3592 }
3593 run_test 102d "star restore stripe info from tarfile,not keep osts ==========="
3594
3595 test_102e() {
3596         # b10930: star test for trusted.lov xattr
3597         star --xhelp 2>&1 | grep -q nolustre  
3598         if [ $? -ne 0 ]
3599         then
3600                 skip "being skipped because a lustre-aware star is not installed." && return
3601         fi
3602         [ "$OSTCOUNT" -lt "4" ] && skip "skipping 4-stripe test" && return
3603         setup_test102
3604         mkdir -p $DIR/d102e
3605         star -x  -preserve-osts f=$TMP/f102.tar -C $DIR/d102e
3606         cd $DIR/d102e/$tdir
3607         compare_stripe_info2
3608 }
3609 run_test 102e "star restore stripe info from tarfile, keep osts ==========="
3610
3611 test_102f() {
3612         # b10930: star test for trusted.lov xattr
3613         star --xhelp 2>&1 | grep -q nolustre  
3614         if [ $? -ne 0 ]
3615         then
3616                 skip "being skipped because a lustre-aware star is not installed." && return
3617         fi
3618         [ "$OSTCOUNT" -lt "4" ] && skip "skipping 4-stripe test" && return
3619         setup_test102
3620         mkdir -p $DIR/d102f
3621         cd $DIR
3622         star -copy  $tdir $DIR/d102f
3623         cd $DIR/d102f/$tdir
3624         compare_stripe_info1
3625 }
3626 run_test 102f "star copy files, not keep osts ==========="
3627
3628 test_102g() {
3629         # b10930: star test for trusted.lov xattr
3630         star --xhelp 2>&1 | grep -q nolustre  
3631         if [ $? -ne 0 ]
3632         then
3633                 skip "being skipped because a lustre-aware star is not installed." && return
3634         fi
3635         [ "$OSTCOUNT" -lt "4" ] && skip "skipping 4-stripe test" && return
3636         setup_test102
3637         mkdir -p $DIR/d102g
3638         cd $DIR
3639         star -copy -preserve-osts $tdir $DIR/d102g
3640         cd $DIR/d102g/$tdir
3641         compare_stripe_info2
3642         cleanup_test102
3643 }
3644 run_test 102g "star copy files, keep osts ==========="
3645
3646 run_acl_subtest()
3647 {
3648     $SAVE_PWD/acl/run $SAVE_PWD/acl/$1.test
3649     return $?
3650 }
3651
3652 test_103 () {
3653     [ "$UID" != 0 ] && skip "must run as root" && return
3654     [ -z "$(grep acl $LPROC/mdc/*[mM][dD][cC]*/connect_flags)" ] && skip "must have acl enabled" && return
3655     [ -z "$(which setfacl 2>/dev/null)" ] && skip "could not find setfacl" && return
3656
3657     SAVE_UMASK=`umask`
3658     umask 0022
3659     cd $DIR
3660
3661     echo "performing cp ..."
3662     run_acl_subtest cp || error
3663     echo "performing getfacl-noacl..."
3664     run_acl_subtest getfacl-noacl || error
3665     echo "performing misc..."
3666     run_acl_subtest misc || error
3667 #    XXX add back permission test when we support supplementary groups.
3668 #    echo "performing permissions..."
3669 #    run_acl_subtest permissions || error
3670     echo "performing setfacl..."
3671     run_acl_subtest setfacl || error
3672
3673     # inheritance test got from HP
3674     echo "performing inheritance..."
3675     cp $SAVE_PWD/acl/make-tree . || error
3676     chmod +x make-tree || error
3677     run_acl_subtest inheritance || error
3678     rm -f make-tree
3679
3680     cd $SAVE_PWD
3681     umask $SAVE_UMASK
3682 }
3683 run_test 103 "acl test ========================================="
3684
3685 test_104() {
3686         touch $DIR/$tfile
3687         lfs df || error "lfs df failed"
3688         lfs df -ih || error "lfs df -ih failed"
3689         lfs df -h $DIR || error "lfs df -h $DIR failed"
3690         lfs df -i $DIR || error "lfs df -i $DIR failed"
3691         lfs df $DIR/$tfile || error "lfs df $DIR/$tfile failed"
3692         lfs df -ih $DIR/$tfile || error "lfs df -ih $DIR/$tfile failed"
3693         
3694         OSC=`awk '/-osc-|OSC.*MNT/ {print $4}' $LPROC/devices | head -n 1`
3695         lctl --device %$OSC deactivate
3696         lfs df || error "lfs df with deactivated OSC failed"
3697         lctl --device %$OSC recover
3698         lfs df || error "lfs df with reactivated OSC failed"
3699 }
3700 run_test 104 "lfs df [-ih] [path] test ========================="
3701
3702 test_105a() {
3703         # doesn't work on 2.4 kernels
3704         touch $DIR/$tfile
3705         if [ -n "`mount | grep \"$DIR.*flock\" | grep -v noflock`" ];
3706         then
3707                 flocks_test on -f $DIR/$tfile || error "fail flock on"
3708         else
3709                 flocks_test off -f $DIR/$tfile || error "fail flock off"
3710         fi
3711 }
3712 run_test 105a "flock when mounted without -o flock test ========"
3713
3714 test_105b() {
3715         touch $DIR/$tfile
3716         if [ -n "`mount | grep \"$DIR.*flock\" | grep -v noflock`" ];
3717         then
3718                 flocks_test on -c $DIR/$tfile || error "fail flock on"
3719         else
3720                 flocks_test off -c $DIR/$tfile || error "fail flock off"
3721         fi
3722 }
3723 run_test 105b "fcntl when mounted without -o flock test ========"
3724
3725 test_105c() {
3726         touch $DIR/$tfile
3727         if [ -n "`mount | grep \"$DIR.*flock\" | grep -v noflock`" ];
3728         then
3729                 flocks_test on -l $DIR/$tfile || error "fail flock on"
3730         else
3731                 flocks_test off -l $DIR/$tfile || error "fail flock off"
3732         fi
3733 }
3734 run_test 105c "lockf when mounted without -o flock test ========"
3735
3736 test_106() { #bug 10921
3737         mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
3738         $DIR/$tdir && error "exec $DIR/$tdir succeeded"
3739         chmod 777 $DIR/$tdir || error "chmod $DIR/$tdir failed"
3740 }
3741 run_test 106 "attempt exec of dir followed by chown of that dir"
3742
3743 test_107() {
3744         CDIR=`pwd`
3745         cd $DIR
3746         ulimit -c unlimited
3747         sleep 60 &
3748         SLEEPPID=$!
3749
3750         file=`cat /proc/sys/kernel/core_pattern`
3751         core_pid=`cat /proc/sys/kernel/core_uses_pid`
3752         [ $core_pid -eq 1 ] && file=$file.$SLEEPPID
3753         rm -f $file
3754         sleep 1
3755
3756         kill -s 11 $SLEEPPID
3757         wait $SLEEPPID
3758         if [ -e $file ]; then
3759                 size=`stat -c%s $file`
3760                 [ $size -eq 0 ] && error "Zero length core file $file"
3761         else
3762                 error "Fail to create core file $file"
3763         fi
3764         rm -f $file
3765         cd $CDIR
3766 }
3767 run_test 107 "Coredump on SIG"
3768
3769 test_115() {
3770         OSTIO_pre=$(ps -e|grep ll_ost_io|awk '{print $4}'|sort -n|tail -1|\
3771             cut -c11-20)
3772         [ -z "$OSTIO_pre" ] && skip "no OSS threads" && \
3773             return
3774         echo "Starting with $OSTIO_pre threads"
3775
3776         NUMTEST=20000
3777         NUMFREE=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'`
3778         [ $NUMFREE -lt $NUMTEST ] && NUMTEST=$(($NUMFREE - 1000))
3779         echo "$NUMTEST creates/unlinks"
3780         mkdir -p $DIR/$tdir
3781         createmany -o $DIR/$tdir/$tfile $NUMTEST
3782         unlinkmany $DIR/$tdir/$tfile $NUMTEST
3783
3784         OSTIO_post=$(ps -e|grep ll_ost_io|awk '{print $4}'|sort -n|tail -1|\
3785             cut -c11-20)
3786
3787         # don't return an error
3788         [ $OSTIO_post -eq $OSTIO_pre ] && echo \
3789             "FAIL: No addition ll_ost_io threads were created ($OSTIO_pre)" &&\
3790             echo "This may be fine, depending on what ran before this test" &&\
3791             echo "and how fast this system is." && return
3792
3793         echo "Started with $OSTIO_pre threads, ended with $OSTIO_post"
3794 }
3795 run_test 115 "verify dynamic thread creation===================="
3796
3797 free_min_max () {
3798         AVAIL=($(cat $LPROC/osc/*[oO][sS][cC][-_]*/kbytesavail))
3799         echo OST kbytes available: ${AVAIL[@]}
3800         MAXI=0; MAXV=${AVAIL[0]}
3801         MINI=0; MINV=${AVAIL[0]}
3802         for ((i = 0; i < ${#AVAIL[@]}; i++)); do
3803             #echo OST $i: ${AVAIL[i]}kb
3804             if [ ${AVAIL[i]} -gt $MAXV ]; then
3805                 MAXV=${AVAIL[i]}; MAXI=$i
3806             fi
3807             if [ ${AVAIL[i]} -lt $MINV ]; then
3808                 MINV=${AVAIL[i]}; MINI=$i
3809             fi
3810         done
3811         echo Min free space: OST $MINI: $MINV 
3812         echo Max free space: OST $MAXI: $MAXV 
3813 }
3814
3815 test_116() {
3816         [ "$OSTCOUNT" -lt "2" ] && echo "not enough OSTs" && return
3817         [ $(grep -c obdfilter $LPROC/devices) -eq 0 ] &&
3818                 skip "remote MDS, skipping test" && return
3819
3820         echo -n "Free space priority "
3821         cat $LPROC/lov/*/qos_prio_free
3822         DELAY=$(cat $LPROC/lov/*/qos_maxage | head -1 | awk '{print $1}')
3823         declare -a AVAIL
3824         free_min_max
3825         [ $MINV -gt 960000 ] && skip "too much free space in OST$MINI" &&\
3826                 return
3827
3828         # generate uneven OSTs
3829         mkdir -p $DIR/$tdir/OST${MINI}
3830         declare -i FILL
3831         FILL=$(($MINV / 4))
3832         echo "Filling 25% remaining space in OST${MINI} with ${FILL}Kb"
3833         $SETSTRIPE $DIR/$tdir/OST${MINI} 0 $MINI 1
3834         i=1
3835         while [ $FILL -gt 0 ]; do
3836             dd if=/dev/zero of=$DIR/$tdir/OST${MINI}/$tfile-$i bs=2M count=1 2>/dev/null
3837             FILL=$(($FILL - 2048))
3838             echo -n .
3839             i=$(($i + 1))
3840         done
3841         FILL=$(($MINV / 4))
3842         sync
3843         sleep $DELAY
3844
3845         free_min_max
3846         DIFF=$(($MAXV - $MINV))
3847         DIFF2=$(($DIFF * 100 / $MINV))
3848         echo -n "diff=${DIFF}=${DIFF2}% must be > 20% for QOS mode..."
3849         if [ $DIFF2 -gt 20 ]; then
3850             echo "ok"
3851         else
3852             echo "failed - QOS mode won't be used"
3853             error "QOS imbalance criteria not met"
3854             return
3855         fi
3856
3857         MINI1=$MINI; MINV1=$MINV
3858         MAXI1=$MAXI; MAXV1=$MAXV
3859
3860         # now fill using QOS
3861         echo writing a bunch of files to QOS-assigned OSTs
3862         i=1
3863         while [ $FILL -gt 0 ]; do
3864             dd if=/dev/zero of=$DIR/$tdir/$tfile-$i bs=1024 count=200 2>/dev/null
3865             FILL=$(($FILL - 200))
3866             echo -n .
3867             i=$(($i + 1))
3868         done
3869         echo "wrote $i 200k files"
3870         sync
3871         sleep $DELAY
3872
3873         echo "Note: free space may not be updated, so measurements might be off"
3874         free_min_max
3875         DIFF2=$(($MAXV - $MINV))
3876         echo "free space delta: orig $DIFF final $DIFF2"
3877         [ $DIFF2 -gt $DIFF ] && echo "delta got worse!" 
3878         DIFF=$(($MINV1 - ${AVAIL[$MINI1]}))
3879         echo "Wrote $DIFF to smaller OST $MINI1"
3880         DIFF2=$(($MAXV1 - ${AVAIL[$MAXI1]}))
3881         echo "Wrote $DIFF2 to larger OST $MAXI1"
3882         [ $DIFF -gt 0 ] && echo "Wrote $(($DIFF2 * 100 / $DIFF - 100))% more data to larger OST $MAXI1"
3883
3884         # Figure out which files were written where 
3885         UUID=$(awk '/'$MINI1': / {print $2; exit}' $LPROC/lov/${FSNAME}-clilov-*/target_obd)
3886         echo $UUID
3887         MINC=$($LFS getstripe --obd $UUID $DIR/$tdir | wc -l)
3888         echo "$MINC files created on smaller OST $MINI1"
3889         UUID=$(awk '/'$MAXI1': / {print $2; exit}' $LPROC/lov/${FSNAME}-clilov-*/target_obd)
3890         MAXC=$($LFS getstripe --obd $UUID $DIR/$tdir | wc -l)
3891         echo "$MAXC files created on larger OST $MAXI1"
3892         [ $MINC -gt 0 ] && echo "Wrote $(($MAXC * 100 / $MINC - 100))% more files to larger OST $MAXI1"
3893         [ $MAXC -gt $MINC ] || error "stripe QOS didn't balance free space"
3894 }
3895 run_test 116 "stripe QOS: free space balance ==================="
3896
3897 test_117() # bug 10891
3898 {
3899         dd if=/dev/zero of=$DIR/$tfile bs=1M count=1
3900         #define OBD_FAIL_OST_SETATTR_CREDITS 0x21e
3901         sysctl -w lustre.fail_loc=0x21e
3902         > $DIR/$tfile || error "truncate failed"
3903         sysctl -w lustre.fail_loc=0
3904         echo "Truncate succeeded."
3905 }
3906 run_test 117 "verify fsfilt_extend ============================="
3907
3908 test_118() #bug 11710
3909 {
3910         sync; sleep 1; sync
3911         multiop $DIR/$tfile oO_CREAT:O_RDWR:O_SYNC:w4096c;
3912         dirty=$(grep -c dirty $LPROC/llite/*/dump_page_cache)
3913
3914         return $dirty
3915 }
3916 run_test 118 "verify O_SYNC works"
3917
3918 test_119a() # bug 11737
3919 {
3920         BSIZE=$((512 * 1024))
3921         directio write $DIR/$tfile 0 1 $BSIZE
3922         # We ask to read two blocks, which is more than a file size.
3923         # directio will indicate an error when requested and actual
3924         # sizes aren't equeal (a normal situation in this case) and
3925         # print actual read amount.
3926         NOB=`directio read $DIR/$tfile 0 2 $BSIZE | awk '/error/ {print $6}'`
3927         if [ "$NOB" != "$BSIZE" ]; then
3928                 error "read $NOB bytes instead of $BSIZE"
3929         fi
3930         rm -f $DIR/$tfile
3931 }
3932 run_test 119a "Short directIO read must return actual read amount"
3933
3934 test_119b() # bug 11737
3935 {
3936         [ "$OSTCOUNT" -lt "2" ] && skip "skipping 2-stripe test" && return
3937
3938         lfs setstripe $DIR/$tfile 0 -1 2
3939         dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed"
3940         sync
3941         multiop $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) || \
3942                 error "direct read failed"
3943 }
3944 run_test 119b "Sparse directIO read must return actual read amount"
3945
3946 test_120a() {
3947         mkdir $DIR/$tdir
3948         cancel_lru_locks mdc
3949         stat $DIR/$tdir > /dev/null
3950         can1=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
3951         blk1=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
3952         mkdir $DIR/$tdir/d1
3953         can2=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
3954         blk2=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
3955         [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
3956         [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
3957 }
3958 run_test 120a "Early Lock Cancel: mkdir test ==================="
3959
3960 test_120b() {
3961         mkdir $DIR/$tdir
3962         cancel_lru_locks mdc
3963         stat $DIR/$tdir > /dev/null
3964         can1=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
3965         blk1=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
3966         touch $DIR/$tdir/f1
3967         blk2=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
3968         can2=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
3969         [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
3970         [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
3971 }
3972 run_test 120b "Early Lock Cancel: create test =================="
3973
3974 test_120c() {
3975         mkdir -p $DIR/$tdir/d1 $DIR/$tdir/d2
3976         touch $DIR/$tdir/d1/f1
3977         cancel_lru_locks mdc
3978         stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
3979         can1=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
3980         blk1=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
3981         ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
3982         can2=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
3983         blk2=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
3984         [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
3985         [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
3986 }
3987 run_test 120c "Early Lock Cancel: link test ===================="
3988
3989 test_120d() {
3990         touch $DIR/$tdir
3991         cancel_lru_locks mdc
3992         stat $DIR/$tdir > /dev/null
3993         can1=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
3994         blk1=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
3995         chmod a+x $DIR/$tdir
3996         can2=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
3997         blk2=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
3998         [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
3999         [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
4000 }
4001 run_test 120d "Early Lock Cancel: setattr test ================="
4002
4003 test_120e() {
4004         mkdir $DIR/$tdir
4005         dd if=/dev/zero of=$DIR/$tdir/f1 count=1
4006         cancel_lru_locks mdc
4007         cancel_lru_locks osc
4008         dd if=$DIR/$tdir/f1 of=/dev/null
4009         stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null
4010         can1=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
4011         blk1=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
4012         unlink $DIR/$tdir/f1
4013         can2=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
4014         blk2=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
4015         [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
4016         [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
4017 }
4018 run_test 120e "Early Lock Cancel: unlink test =================="
4019
4020 test_120f() {
4021         mkdir -p $DIR/$tdir/d1 $DIR/$tdir/d2
4022         dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
4023         dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
4024         cancel_lru_locks mdc
4025         cancel_lru_locks osc
4026         dd if=$DIR/$tdir/d1/f1 of=/dev/null
4027         dd if=$DIR/$tdir/d2/f2 of=/dev/null
4028         stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null
4029         can1=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
4030         blk1=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
4031         mv $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2
4032         can2=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
4033         blk2=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
4034         [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured."
4035         [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured."
4036 }
4037 run_test 120f "Early Lock Cancel: rename test =================="
4038
4039 test_120g() {
4040         count=10000
4041         echo create $count files
4042         mkdir  $DIR/$tdir
4043         cancel_lru_locks mdc
4044         cancel_lru_locks osc
4045         t0=`date +%s`
4046         
4047         can0=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
4048         blk0=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
4049         createmany -o $DIR/$tdir/f $count
4050         sync
4051         can1=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
4052         blk1=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
4053         t1=`date +%s`
4054         echo total: $((can1-can0)) cancels, $((blk1-blk0)) blockings
4055         echo rm $count files
4056         rm -r $DIR/$tdir
4057         sync
4058         can2=`awk '/ldlm_cancel/ {print $2}' $LPROC/ldlm/services/ldlm_canceld/stats`
4059         blk2=`awk '/ldlm_bl_callback/ {print $2}' $LPROC/ldlm/services/ldlm_cbd/stats`
4060         t2=`date +%s`
4061         echo total: $count removes in $((t2-t1))
4062         echo total: $((can2-can1)) cancels, $((blk2-blk1)) blockings
4063         sleep 2
4064         # wait for commitment of removal
4065 }
4066 run_test 120g "Early Lock Cancel: performance test ============="
4067
4068 test_121() { #bug #10589
4069         rm -rf $DIR/$tfile
4070         writes=`dd if=/dev/zero of=$DIR/$tfile count=1 2>&1 | awk 'BEGIN { FS="+" } /out/ {print $1}'`
4071         sysctl -w lustre.fail_loc=0x310
4072         cancel_lru_locks osc > /dev/null
4073         reads=`dd if=$DIR/$tfile of=/dev/null 2>&1 | awk 'BEGIN { FS="+" } /in/ {print $1}'`
4074         sysctl -w lustre.fail_loc=0
4075         [ $reads -eq $writes ] || error "read" $reads "blocks, must be" $writes
4076 }
4077 run_test 121 "read cancel race ================================="
4078
4079 test_122() { #bug #11544
4080         #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB   0x508
4081         sysctl -w lustre.fail_loc=0x508
4082         dd if=/dev/zero of=$DIR/$tfile count=1
4083         sync
4084         sysctl -w lustre.fail_loc=0
4085 }
4086 run_test 122 "fail client bulk callback (shouldn't LBUG) ======="
4087
4088 test_123() # statahead(bug 11401)
4089 {
4090         if [ -z "$(grep "processor.*: 1" /proc/cpuinfo)" ]; then
4091                 log "single core CPU, skipping test"  # && return
4092         fi
4093
4094         mkdir -p $DIR/$tdir
4095
4096         for ((i=1, j=0; i<=10000; j=$i, i=$((i * 10)) )); do
4097                 createmany -o $DIR/$tdir/$tfile $j $((i - j))
4098
4099                 grep '[0-9]' $LPROC/llite/*/statahead_max
4100                 cancel_lru_locks mdc
4101                 stime=`date +%s`
4102                 ls -l $DIR/$tdir > /dev/null
4103                 etime=`date +%s`
4104                 delta_sa=$((etime - stime))
4105                 echo "ls $i files with statahead:    $delta_sa sec"
4106
4107                 for client in $LPROC/llite/*; do
4108                         max=`cat $client/statahead_max`
4109                         cat $client/statahead_stats
4110                         echo 0 > $client/statahead_max
4111                 done
4112
4113                 grep '[0-9]' $LPROC/llite/*/statahead_max
4114                 cancel_lru_locks mdc
4115                 stime=`date +%s`
4116                 ls -l $DIR/$tdir > /dev/null
4117                 etime=`date +%s`
4118                 delta=$((etime - stime))
4119                 echo "ls $i files without statahead: $delta sec"
4120
4121                 for client in /proc/fs/lustre/llite/*; do
4122                         cat $client/statahead_stats
4123                         echo $max > $client/statahead_max
4124                 done
4125
4126                 if [ $delta_sa -gt $delta ]; then
4127                         error "ls $i files is slower with statahead!"
4128                 fi
4129         done
4130         echo "ls done"
4131
4132         stime=`date +%s`
4133         rm -r $DIR/$tdir
4134         sync
4135         etime=`date +%s`
4136         delta=$((etime - stime))
4137         echo "rm -r $DIR/$tdir/: $delta seconds"
4138         echo "rm done"
4139         cat /proc/fs/lustre/llite/*/statahead_stats
4140         # wait for commitment of removal
4141         sleep 2
4142 }
4143 run_test 123 "verify statahead work"
4144
4145 TMPDIR=$OLDTMPDIR
4146 TMP=$OLDTMP
4147 HOME=$OLDHOME
4148
4149 log "cleanup: ======================================================"
4150 if [ "`mount | grep $MOUNT`" ]; then
4151     rm -rf $DIR/[Rdfs][1-9]*
4152 fi
4153 if [ "$I_MOUNTED" = "yes" ]; then
4154     cleanupall -f || error "cleanup failed"
4155 else
4156         sysctl -w lnet.debug="$OLDDEBUG" 2> /dev/null || true
4157 fi
4158
4159
4160 echo '=========================== finished ==============================='
4161 [ -f "$SANITYLOG" ] && cat $SANITYLOG && grep -q FAIL $SANITYLOG && exit 1 || true
4162 echo "$0: completed"