3 # Run select tests by setting ONLY, or as arguments to the script.
4 # Skip specific tests by setting EXCEPT.
6 # e.g. ONLY="22 23" or ONLY="`seq 32 39`" or EXCEPT="31"
10 # bug number for skipped test: 2108 3637 3561
11 RENAME_TESTS="24a 24b 24c 24d 24e 24f 24g 24h 24i 24j 24k 24l 24m 24n 24o 42a 42c 45 48a 48b 48c 48d 51b 51c 65a 65b 65c 65d 65e 65f"
12 ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"$RENAME_TESTS 58"}
14 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
16 [ "$ALWAYS_EXCEPT$EXCEPT" ] && echo "Skipping tests: $ALWAYS_EXCEPT $EXCEPT"
19 export PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
22 FSTYPE=${FSTYPE:-ext3}
24 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
25 CREATETEST=${CREATETEST:-createtest}
27 LSTRIPE=${LSTRIPE:-"$LFS setstripe"}
28 LFIND=${LFIND:-"$LFS find"}
29 LVERIFY=${LVERIFY:-ll_dirstripe_verify}
31 MCREATE=${MCREATE:-mcreate}
32 OPENFILE=${OPENFILE:-openfile}
33 OPENUNLINK=${OPENUNLINK:-openunlink}
34 TOEXCL=${TOEXCL:-toexcl}
35 TRUNCATE=${TRUNCATE:-truncate}
36 MUNLINK=${MUNLINK:-munlink}
37 SOCKETSERVER=${SOCKETSERVER:-socketserver}
38 SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
39 IOPENTEST1=${IOPENTEST1:-iopentest1}
40 IOPENTEST2=${IOPENTEST2:-iopentest2}
41 MEMHOG=${MEMHOG:-memhog}
43 if [ $UID -ne 0 ]; then
47 RUNAS_ID=${RUNAS_ID:-500}
48 RUNAS=${RUNAS:-"runas -u $RUNAS_ID"}
51 export NAME=${NAME:-local}
57 sh llmountcleanup.sh > /dev/null || exit 20
64 sh llrmount.sh > /dev/null || exit 10
72 lctl mark "$*" 2> /dev/null || true
77 strace -o $TMP/$1.strace -ttt $*
79 log "FINISHED: $*: rc $RC"
84 check_kernel_version() {
85 VERSION_FILE=/proc/fs/lustre/kernel_version
87 [ ! -f $VERSION_FILE ] && echo "can't find kernel version" && return 1
88 GOT_VER=`cat $VERSION_FILE`
89 [ $GOT_VER -ge $WANT_VER ] && return 0
90 log "test needs at least kernel version $WANT_VER, running $GOT_VER"
95 if ! mount | grep -q $DIR; then
98 echo -1 >/proc/sys/portals/debug
99 log "== test $1: $2= `date +%H:%M:%S`"
100 export TESTNAME=test_$1
101 test_$1 || error "test_$1: exit with rc=$?"
108 build_test_filter() {
112 for E in $EXCEPT $ALWAYS_EXCEPT; do
113 eval EXCEPT_${E}=true
122 IFS=abcdefghijklmnopqrstuvwxyz _basetest $1
129 if [ ${!testname}x != x ]; then
134 if [ ${!testname}x != x ]; then
142 if [ ${!testname}x != x ]; then
143 echo "skipping excluded test $1"
146 testname=EXCEPT_$base
147 if [ ${!testname}x != x ]; then
148 echo "skipping excluded test $1 (base $base)"
155 [ "$SANITYLOG" ] && rm -f $SANITYLOG || true
159 if [ "$SANITYLOG" ]; then
160 echo "FAIL: $TESTNAME $@" >> $SANITYLOG
170 MOUNT="`mount | awk '/^'$NAME' .* lustre_lite / { print $3 }'`"
171 if [ -z "$MOUNT" ]; then
173 MOUNT="`mount | awk '/^'$NAME' .* lustre_lite / { print $3 }'`"
174 [ -z "$MOUNT" ] && error "NAME=$NAME not mounted"
178 [ `echo $MOUNT | wc -w` -gt 1 ] && error "NAME=$NAME mounted more than once"
181 [ -z "`echo $DIR | grep $MOUNT`" ] && echo "$DIR not in $MOUNT" && exit 99
183 OSTCOUNT=`cat /proc/fs/lustre/llite/fs0/lov/numobd`
184 STRIPECOUNT=`cat /proc/fs/lustre/llite/fs0/lov/stripecount`
185 STRIPESIZE=`cat /proc/fs/lustre/llite/fs0/lov/stripesize`
187 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
188 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
189 rm -rf $DIR/[Rdfs][1-9]*
193 echo preparing for tests involving mounts
194 EXT2_DEV=${EXT2_DEV:-/tmp/SANITY.LOOP}
196 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
202 $CHECKSTAT -t file $DIR/f || error
204 $CHECKSTAT -a $DIR/f || error
206 run_test 0 "touch .../f ; rm .../f ============================="
209 chmod 0755 $DIR || error
210 $CHECKSTAT -p 0755 $DIR || error
212 run_test 0b "chmod 0755 $DIR ============================="
218 $CHECKSTAT -t dir $DIR/d1/d2 || error
220 run_test 1a "mkdir .../d1; mkdir .../d1/d2 ====================="
225 $CHECKSTAT -a $DIR/d1 || error
227 run_test 1b "rmdir .../d1/d2; rmdir .../d1 ====================="
232 $CHECKSTAT -t file $DIR/d2/f || error
234 run_test 2a "mkdir .../d2; touch .../d2/f ======================"
238 $CHECKSTAT -a $DIR/d2 || error
240 run_test 2b "rm -r .../d2; checkstat .../d2/f ======================"
244 $CHECKSTAT -t dir $DIR/d3 || error
246 run_test 3a "mkdir .../d3 ======================================"
249 if [ ! -d $DIR/d3 ]; then
253 $CHECKSTAT -t file $DIR/d3/f || error
255 run_test 3b "touch .../d3/f ===================================="
259 $CHECKSTAT -a $DIR/d3 || error
261 run_test 3c "rm -r .../d3 ======================================"
265 $CHECKSTAT -t dir $DIR/d4 || error
267 run_test 4a "mkdir .../d4 ======================================"
270 if [ ! -d $DIR/d4 ]; then
274 $CHECKSTAT -t dir $DIR/d4/d2 || error
276 run_test 4b "mkdir .../d4/d2 ==================================="
281 chmod 0707 $DIR/d5/d2
282 $CHECKSTAT -t dir -p 0707 $DIR/d5/d2 || error
284 run_test 5 "mkdir .../d5 .../d5/d2; chmod .../d5/d2 ============"
288 chmod 0666 $DIR/f6a || error
289 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/f6a || error
291 run_test 6a "touch .../f6a; chmod .../f6a ======================"
294 [ $RUNAS_ID -eq $UID ] && echo "skipping test 6b" && return
295 if [ ! -f $DIR/f6a ]; then
299 $RUNAS chmod 0444 $DIR/f6a && error
300 $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/f6a || error
302 run_test 6b "$RUNAS chmod .../f6a (should return error) =="
305 [ $RUNAS_ID -eq $UID ] && echo "skipping test 6c" && return
307 chown $RUNAS_ID $DIR/f6c || error
308 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/f6c || error
310 run_test 6c "touch .../f6c; chown .../f6c ======================"
313 [ $RUNAS_ID -eq $UID ] && echo "skipping test 6d" && return
314 if [ ! -f $DIR/f6c ]; then
316 chown $RUNAS_ID $DIR/f6c
318 $RUNAS chown $UID $DIR/f6c && error
319 $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/f6c || error
321 run_test 6d "$RUNAS chown .../f6c (should return error) =="
324 [ $RUNAS_ID -eq $UID ] && echo "skipping test 6e" && return
326 chgrp $RUNAS_ID $DIR/f6e || error
327 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/f6e || error
329 run_test 6e "touch .../f6e; chgrp .../f6e ======================"
332 [ $RUNAS_ID -eq $UID ] && echo "skipping test 6f" && return
333 if [ ! -f $DIR/f6e ]; then
335 chgrp $RUNAS_ID $DIR/f6e
337 $RUNAS chgrp $UID $DIR/f6e && error
338 $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/f6e || error
340 run_test 6f "$RUNAS chgrp .../f6e (should return error) =="
343 [ $RUNAS_ID -eq $UID ] && echo "skipping test 6g" && return
344 mkdir $DIR/d6g || error
345 chmod 777 $DIR/d6g || error
346 $RUNAS mkdir $DIR/d6g/d || error
347 chmod g+s $DIR/d6g/d || error
348 mkdir $DIR/d6g/d/subdir
349 $CHECKSTAT -g \#$RUNAS_ID $DIR/d6g/d/subdir || error
351 run_test 6g "Is new dir in sgid dir inheriting group?"
357 $CHECKSTAT -t file -p 0666 $DIR/d7/f || error
359 run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ===="
362 if [ ! -d $DIR/d7 ]; then
366 echo -n foo > $DIR/d7/f2
367 [ "`cat $DIR/d7/f2`" = "foo" ] || error
368 $CHECKSTAT -t file -s 3 $DIR/d7/f2 || error
370 run_test 7b "mkdir .../d7; mcreate d7/f2; echo foo > d7/f2 ====="
376 $CHECKSTAT -t file -p 0666 $DIR/d8/f || error
378 run_test 8 "mkdir .../d8; touch .../d8/f; chmod .../d8/f ======="
384 $CHECKSTAT -t dir $DIR/d9/d2/d3 || error
386 run_test 9 "mkdir .../d9 .../d9/d2 .../d9/d2/d3 ================"
392 $CHECKSTAT -t file $DIR/d10/d2/f || error
394 run_test 10 "mkdir .../d10 .../d10/d2; touch .../d10/d2/f ======"
399 chmod 0666 $DIR/d11/d2
400 chmod 0705 $DIR/d11/d2
401 $CHECKSTAT -t dir -p 0705 $DIR/d11/d2 || error
403 run_test 11 "mkdir .../d11 d11/d2; chmod .../d11/d2 ============"
408 chmod 0666 $DIR/d12/f
409 chmod 0654 $DIR/d12/f
410 $CHECKSTAT -t file -p 0654 $DIR/d12/f || error
412 run_test 12 "touch .../d12/f; chmod .../d12/f .../d12/f ========"
416 dd if=/dev/zero of=$DIR/d13/f count=10
418 $CHECKSTAT -t file -s 0 $DIR/d13/f || error
420 run_test 13 "creat .../d13/f; dd .../d13/f; > .../d13/f ========"
426 $CHECKSTAT -a $DIR/d14/f || error
428 run_test 14 "touch .../d14/f; rm .../d14/f; rm .../d14/f ======="
433 mv $DIR/d15/f $DIR/d15/f2
434 $CHECKSTAT -t file $DIR/d15/f2 || error
436 run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 =========="
442 $CHECKSTAT -a $DIR/d16/f || error
444 run_test 16 "touch .../d16/f; rm -rf .../d16/f ================="
449 ln -s $DIR/d17/f $DIR/d17/l-exist
451 $CHECKSTAT -l $DIR/d17/f $DIR/d17/l-exist || error
452 $CHECKSTAT -f -t f $DIR/d17/l-exist || error
454 $CHECKSTAT -a $DIR/l-exist || error
456 run_test 17a "symlinks: create, remove (real) =================="
459 if [ ! -d $DIR/d17 ]; then
462 ln -s no-such-file $DIR/d17/l-dangle
464 $CHECKSTAT -l no-such-file $DIR/d17/l-dangle || error
465 $CHECKSTAT -fa $DIR/d17/l-dangle || error
467 $CHECKSTAT -a $DIR/l-dangle || error
469 run_test 17b "symlinks: create, remove (dangling) =============="
475 run_test 18 "touch .../f ; ls ... =============================="
481 $CHECKSTAT -a $DIR/f19 || error
483 run_test 19a "touch .../f19 ; ls -l ... ; rm .../f19 ==========="
486 ls -l $DIR/f19 && error || true
488 run_test 19b "ls -l .../f19 (should return error) =============="
491 [ $RUNAS_ID -eq $UID ] && echo "skipping test 19c" && return
492 $RUNAS touch $DIR/f19 && error || true
494 run_test 19c "$RUNAS touch .../f19 (should return error) =="
497 cat $DIR/f19 && error || true
499 run_test 19d "cat .../f19 (should return error) =============="
511 $CHECKSTAT -a $DIR/f || error
513 run_test 20 "touch .../f ; ls -l ... ==========================="
517 [ -f $DIR/d21/dangle ] && rm -f $DIR/d21/dangle
518 ln -s dangle $DIR/d21/link
519 echo foo >> $DIR/d21/link
521 $CHECKSTAT -t link $DIR/d21/link || error
522 $CHECKSTAT -f -t file $DIR/d21/link || error
524 run_test 21 "write to dangling link ============================"
528 chown $RUNAS_ID $DIR/d22
529 # Tar gets pissy if it can't access $PWD *sigh*
531 $RUNAS tar cf - /etc/hosts /etc/sysconfig/network | \
532 $RUNAS tar xfC - $DIR/d22)
534 $CHECKSTAT -t dir $DIR/d22/etc || error
535 $CHECKSTAT -u \#$RUNAS_ID $DIR/d22/etc || error
537 run_test 22 "unpack tar archive as non-root user ==============="
542 $TOEXCL -e $DIR/d23/f23 || error
544 run_test 23 "O_CREAT|O_EXCL in subdir =========================="
547 echo '== rename sanity =============================================='
548 echo '-- same directory rename'
551 mv $DIR/R1/f $DIR/R1/g
552 $CHECKSTAT -t file $DIR/R1/g || error
554 run_test 24a "touch .../R1/f; rename .../R1/f .../R1/g ========="
559 mv $DIR/R2/f $DIR/R2/g
560 $CHECKSTAT -a $DIR/R2/f || error
561 $CHECKSTAT -t file $DIR/R2/g || error
563 run_test 24b "touch .../R2/{f,g}; rename .../R2/f .../R2/g ====="
568 mv $DIR/R3/f $DIR/R3/g
569 $CHECKSTAT -a $DIR/R3/f || error
570 $CHECKSTAT -t dir $DIR/R3/g || error
572 run_test 24c "mkdir .../R3/f; rename .../R3/f .../R3/g ========="
577 mrename $DIR/R4/f $DIR/R4/g
578 $CHECKSTAT -a $DIR/R4/f || error
579 $CHECKSTAT -t dir $DIR/R4/g || error
581 run_test 24d "mkdir .../R4/{f,g}; rename .../R4/f .../R4/g ====="
584 echo '-- cross directory renames --'
587 mv $DIR/R5a/f $DIR/R5b/g
588 $CHECKSTAT -a $DIR/R5a/f || error
589 $CHECKSTAT -t file $DIR/R5b/g || error
591 run_test 24e "touch .../R5a/f; rename .../R5a/f .../R5b/g ======"
595 touch $DIR/R6a/f $DIR/R6b/g
596 mv $DIR/R6a/f $DIR/R6b/g
597 $CHECKSTAT -a $DIR/R6a/f || error
598 $CHECKSTAT -t file $DIR/R6b/g || error
600 run_test 24f "touch .../R6a/f R6b/g; mv .../R6a/f .../R6b/g ===="
605 mv $DIR/R7a/d $DIR/R7b/e
606 $CHECKSTAT -a $DIR/R7a/d || error
607 $CHECKSTAT -t dir $DIR/R7b/e || error
609 run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R5b/e ======"
613 mkdir $DIR/R8a/d $DIR/R8b/e
614 mrename $DIR/R8a/d $DIR/R8b/e
615 $CHECKSTAT -a $DIR/R8a/d || error
616 $CHECKSTAT -t dir $DIR/R8b/e || error
618 run_test 24h "mkdir .../R8{a,b}/{d,e}; rename .../R8a/d .../R8b/e"
621 echo "-- rename error cases"
625 mrename $DIR/R9/f $DIR/R9/a
626 $CHECKSTAT -t file $DIR/R9/f || error
627 $CHECKSTAT -t dir $DIR/R9/a || error
628 $CHECKSTAT -a file $DIR/R9/a/f || error
630 run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a"
634 mrename $DIR/R10/f $DIR/R10/g
635 $CHECKSTAT -t dir $DIR/R10 || error
636 $CHECKSTAT -a $DIR/R10/f || error
637 $CHECKSTAT -a $DIR/R10/g || error
639 run_test 24j "source does not exist ============================"
642 mkdir $DIR/R11a $DIR/R11a/d
644 mv $DIR/R11a/f $DIR/R11a/d
645 $CHECKSTAT -a $DIR/R11a/f || error
646 $CHECKSTAT -t file $DIR/R11a/d/f || error
648 run_test 24k "touch .../R11a/f; mv .../R11a/f .../R11a/d ======="
650 # bug 2429 - rename foo foo foo creates invalid file
653 multiop $f OcNs || error
655 run_test 24l "Renaming a file to itself ========================"
659 multiop $f OcLN ${f}2 ${f}2 || error
661 run_test 24m "Renaming a file to a hard link to itself ========="
665 # this stats the old file after it was renamed, so it should fail
669 $CHECKSTAT ${f}.rename
672 run_test 24n "Statting the old file after renameing (Posix rename 2)"
675 check_kernel_version 37 || return 0
676 rename_many -s random -v -n 10 $DIR
678 run_test 24o "rename of files during htree split ==============="
682 DIRINO=`ls -lid $DIR/R12a | awk '{ print $1 }'`
683 mrename $DIR/R12a $DIR/R12b
684 $CHECKSTAT -a $DIR/R12a || error
685 $CHECKSTAT -t dir $DIR/R12b || error
686 DIRINO2=`ls -lid $DIR/R12b | awk '{ print $1 }'`
687 [ "$DIRINO" = "$DIRINO2" ] || error "R12a $DIRINO != R12b $DIRINO2"
689 run_test 24p "mkdir .../R12{a,b}; rename .../R12a .../R12b"
693 DIRINO=`ls -lid $DIR/R13a | awk '{ print $1 }'`
694 multiop $DIR/R13b D_c &
697 mrename $DIR/R13a $DIR/R13b
698 $CHECKSTAT -a $DIR/R13a || error
699 $CHECKSTAT -t dir $DIR/R13b || error
700 DIRINO2=`ls -lid $DIR/R13b | awk '{ print $1 }'`
701 [ "$DIRINO" = "$DIRINO2" ] || error "R13a $DIRINO != R13b $DIRINO2"
703 wait $MULTIPID || error "multiop close failed"
705 run_test 24q "mkdir .../R13{a,b}; open R13b rename R13a R13b ==="
707 test_24r() { #bug 3789
708 mkdir $DIR/R14a $DIR/R14a/b
709 mrename $DIR/R14a $DIR/R14a/b && error "rename to subdir worked!"
710 $CHECKSTAT -t dir $DIR/R14a || error "$DIR/R14a missing"
711 $CHECKSTAT -t dir $DIR/R14a/b || error "$DIR/R14a/b missing"
713 run_test 24r "mkdir .../R14a/b; rename .../R14a .../R14a/b ====="
716 mkdir $DIR/R15a $DIR/R15a/b $DIR/R15a/b/c
717 mrename $DIR/R15a $DIR/R15a/b/c && error "rename to sub-subdir worked!"
718 $CHECKSTAT -t dir $DIR/R15a || error "$DIR/R15a missing"
719 $CHECKSTAT -t dir $DIR/R15a/b/c || error "$DIR/R15a/b/c missing"
721 run_test 24s "mkdir .../R15a/b/c; rename .../R15a .../R15a/b/c ="
723 mkdir $DIR/R16a $DIR/R16a/b $DIR/R16a/b/c
724 mrename $DIR/R16a/b/c $DIR/R16a && error "rename to sub-subdir worked!"
725 $CHECKSTAT -t dir $DIR/R16a || error "$DIR/R16a missing"
726 $CHECKSTAT -t dir $DIR/R16a/b/c || error "$DIR/R16a/b/c missing"
728 run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a ="
731 echo '== symlink sanity ============================================='
734 touch $DIR/s25/foo || error
736 run_test 25a "create file in symlinked directory ==============="
739 [ ! -d $DIR/d25 ] && test_25a
740 $CHECKSTAT -t file $DIR/s25/foo || error
742 run_test 25b "lookup file in symlinked directory ==============="
747 ln -s d26/d26-2 $DIR/s26
748 touch $DIR/s26/foo || error
750 run_test 26a "multiple component symlink ======================="
753 mkdir -p $DIR/d26b/d26-2
754 ln -s d26b/d26-2/foo $DIR/s26-2
755 touch $DIR/s26-2 || error
757 run_test 26b "multiple component symlink at end of lookup ======"
762 ln -s d26.2 $DIR/s26.2-1
763 ln -s s26.2-1 $DIR/s26.2-2
764 ln -s s26.2-2 $DIR/s26.2-3
765 chmod 0666 $DIR/s26.2-3/foo
767 run_test 26c "chain of symlinks ================================"
769 # recursive symlinks (bug 439)
771 ln -s d26-3/foo $DIR/d26-3
773 run_test 26d "create multiple component recursive symlink ======"
776 [ ! -h $DIR/d26-3 ] && test_26d
779 run_test 26e "unlink multiple component recursive symlink ======"
782 echo '== stripe sanity =============================================='
784 $LSTRIPE $DIR/d27/f0 65536 0 1 || error "lstripe failed"
785 $CHECKSTAT -t file $DIR/d27/f0 || error "checkstat failed"
787 log "== test_27b: write to one stripe file ========================="
788 cp /etc/hosts $DIR/d27/f0 || error
790 run_test 27a "one stripe file =================================="
793 [ "$OSTCOUNT" -lt "2" ] && echo "skipping 2-stripe test" && return
794 if [ ! -d $DIR/d27 ]; then
797 $LSTRIPE $DIR/d27/f01 65536 0 2 || error "lstripe failed"
798 [ `$LFIND $DIR/d27/f01 | grep -A 10 obdidx | wc -l` -eq 4 ] ||
799 error "two-stripe file doesn't have two stripes"
801 log "== test_27d: write to two stripe file file f01 ================"
802 dd if=/dev/zero of=$DIR/d27/f01 bs=4k count=4 || error "dd failed"
804 run_test 27c "create two stripe file f01 ======================="
807 if [ ! -d $DIR/d27 ]; then
810 $LSTRIPE $DIR/d27/fdef 0 -1 0 || error "lstripe failed"
811 $CHECKSTAT -t file $DIR/d27/fdef || error "checkstat failed"
812 #dd if=/dev/zero of=$DIR/d27/fdef bs=4k count=4 || error
814 run_test 27d "create file with default settings ================"
817 if [ ! -d $DIR/d27 ]; then
820 $LSTRIPE $DIR/d27/f12 65536 0 2 || error "lstripe failed"
821 $LSTRIPE $DIR/d27/f12 65536 0 2 && error "lstripe succeeded twice"
822 $CHECKSTAT -t file $DIR/d27/f12 || error "checkstat failed"
824 run_test 27e "lstripe existing file (should return error) ======"
827 if [ ! -d $DIR/d27 ]; then
830 $LSTRIPE $DIR/d27/fbad 100 0 1 && error "lstripe failed"
831 dd if=/dev/zero of=$DIR/d27/f12 bs=4k count=4 || error "dd failed"
832 $LFIND $DIR/d27/fbad || error "lfind failed"
835 run_test 27f "lstripe with bad stripe size (should return error)"
838 if [ ! -d $DIR/d27 ]; then
841 $MCREATE $DIR/d27/fnone || error "mcreate failed"
843 log "== test 27h: lfind with no objects ============================"
844 $LFIND $DIR/d27/fnone 2>&1 | grep "no stripe info" || error "has object"
846 log "== test 27i: lfind with some objects =========================="
847 touch $DIR/d27/fsome || error "touch failed"
848 $LFIND $DIR/d27/fsome | grep obdidx || error "missing objects"
851 run_test 27g "test lfind ======================================="
854 if [ ! -d $DIR/d27 ]; then
857 $LSTRIPE $DIR/d27/f27j 65536 $OSTCOUNT 1 && error "lstripe failed"||true
859 run_test 27j "lstripe with bad stripe offset (should return error)"
861 test_27k() { # bug 2844
863 LL_MAX_BLKSIZE=$((4 * 1024 * 1024))
864 [ ! -d $DIR/d27 ] && mkdir -p $DIR/d27
865 $LSTRIPE $FILE 67108864 -1 0 || error "lstripe failed"
866 BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
867 [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "$BLKSIZE > $LL_MAX_BLKSIZE"
868 dd if=/dev/zero of=$FILE bs=4k count=1
869 BLKSIZE=`stat $FILE | awk '/IO Block:/ { print $7 }'`
870 [ $BLKSIZE -le $LL_MAX_BLKSIZE ] || error "$BLKSIZE > $LL_MAX_BLKSIZE"
872 run_test 27k "limit i_blksize for broken user apps ============="
875 mcreate $DIR/f27l || error "creating file"
876 $RUNAS $LSTRIPE $DIR/f27l 65536 -1 1 && \
877 error "lstripe should have failed" || true
879 run_test 27l "check setstripe permissions (should return error)"
883 $CREATETEST $DIR/d28/ct || error
885 run_test 28 "create/mknod/mkdir with bad file types ============"
888 for d in /proc/fs/lustre/ldlm/namespaces/$1*; do
889 echo clear > $d/lru_size
891 grep [0-9] /proc/fs/lustre/ldlm/namespaces/$1*/lock_unused_count /dev/null
900 MDCDIR=${MDCDIR:-/proc/fs/lustre/ldlm/namespaces/MDC_*}
901 LOCKCOUNTORIG=`cat $MDCDIR/lock_count`
902 LOCKUNUSEDCOUNTORIG=`cat $MDCDIR/lock_unused_count`
906 LOCKCOUNTCURRENT=`cat $MDCDIR/lock_count`
907 LOCKUNUSEDCOUNTCURRENT=`cat $MDCDIR/lock_unused_count`
908 if [ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]; then
909 echo "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
912 if [ $LOCKUNUSEDCOUNTCURRENT -gt $LOCKUNUSEDCOUNTORIG ]; then
913 echo "UNUSED: $LOCKUNUSEDCOUNTCURRENT > $LOCKUNUSEDCOUNTORIG"
917 run_test 29 "IT_GETATTR regression ============================"
924 run_test 30 "run binary from Lustre (execve) ==================="
927 $OPENUNLINK $DIR/f31 $DIR/f31 || error
928 $CHECKSTAT -a $DIR/f31 || error
930 run_test 31a "open-unlink file =================================="
933 touch $DIR/f31 || error
934 ln $DIR/f31 $DIR/f31b || error
935 multiop $DIR/f31b Ouc || error
936 $CHECKSTAT -t file $DIR/f31 || error
938 run_test 31b "unlink file with multiple links while open ======="
941 touch $DIR/f31 || error
942 ln $DIR/f31 $DIR/f31c || error
943 multiop $DIR/f31 O_uc &
945 multiop $DIR/f31c Ouc
950 run_test 31c "open-unlink file with multiple links ============="
953 opendirunlink $DIR/d31d $DIR/d31d || error
954 $CHECKSTAT -a $DIR/d31d || error
956 run_test 31d "remove of open directory ========================="
958 test_31e() { # bug 2904
959 check_kernel_version 34 || return 0
960 openfilleddirunlink $DIR/d31e || error
962 run_test 31e "remove of open non-empty directory ==============="
965 echo "== more mountpoints and symlinks ================="
966 [ -e $DIR/d32a ] && rm -fr $DIR/d32a
967 mkdir -p $DIR/d32a/ext2-mountpoint
968 mount -t ext2 -o loop $EXT2_DEV $DIR/d32a/ext2-mountpoint || error
969 $CHECKSTAT -t dir $DIR/d32a/ext2-mountpoint/.. || error
970 umount $DIR/d32a/ext2-mountpoint || error
972 run_test 32a "stat d32a/ext2-mountpoint/.. ====================="
975 [ -e $DIR/d32b ] && rm -fr $DIR/d32b
976 mkdir -p $DIR/d32b/ext2-mountpoint
977 mount -t ext2 -o loop $EXT2_DEV $DIR/d32b/ext2-mountpoint || error
978 ls -al $DIR/d32b/ext2-mountpoint/.. || error
979 umount $DIR/d32b/ext2-mountpoint || error
981 run_test 32b "open d32b/ext2-mountpoint/.. ====================="
984 [ -e $DIR/d32c ] && rm -fr $DIR/d32c
985 mkdir -p $DIR/d32c/ext2-mountpoint
986 mount -t ext2 -o loop $EXT2_DEV $DIR/d32c/ext2-mountpoint || error
987 mkdir -p $DIR/d32c/d2/test_dir
988 $CHECKSTAT -t dir $DIR/d32c/ext2-mountpoint/../d2/test_dir || error
989 umount $DIR/d32c/ext2-mountpoint || error
991 run_test 32c "stat d32c/ext2-mountpoint/../d2/test_dir ========="
994 [ -e $DIR/d32d ] && rm -fr $DIR/d32d
995 mkdir -p $DIR/d32d/ext2-mountpoint
996 mount -t ext2 -o loop $EXT2_DEV $DIR/d32d/ext2-mountpoint || error
997 mkdir -p $DIR/d32d/d2/test_dir
998 ls -al $DIR/d32d/ext2-mountpoint/../d2/test_dir || error
999 umount $DIR/d32d/ext2-mountpoint || error
1001 run_test 32d "open d32d/ext2-mountpoint/../d2/test_dir ========="
1004 [ -e $DIR/d32e ] && rm -fr $DIR/d32e
1005 mkdir -p $DIR/d32e/tmp
1006 TMP_DIR=$DIR/d32e/tmp
1007 ln -s $DIR/d32e $TMP_DIR/symlink11
1008 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
1009 $CHECKSTAT -t link $DIR/d32e/tmp/symlink11 || error
1010 $CHECKSTAT -t link $DIR/d32e/symlink01 || error
1012 run_test 32e "stat d32e/symlink->tmp/symlink->lustre-subdir ===="
1015 [ -e $DIR/d32f ] && rm -fr $DIR/d32f
1016 mkdir -p $DIR/d32f/tmp
1017 TMP_DIR=$DIR/d32f/tmp
1018 ln -s $DIR/d32f $TMP_DIR/symlink11
1019 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
1020 ls $DIR/d32f/tmp/symlink11 || error
1021 ls $DIR/d32f/symlink01 || error
1023 run_test 32f "open d32f/symlink->tmp/symlink->lustre-subdir ===="
1026 [ -e $DIR/d32g ] && rm -fr $DIR/d32g
1027 [ -e $DIR/test_dir ] && rm -fr $DIR/test_dir
1028 mkdir -p $DIR/test_dir
1029 mkdir -p $DIR/d32g/tmp
1030 TMP_DIR=$DIR/d32g/tmp
1031 ln -s $DIR/test_dir $TMP_DIR/symlink12
1032 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
1033 $CHECKSTAT -t link $DIR/d32g/tmp/symlink12 || error
1034 $CHECKSTAT -t link $DIR/d32g/symlink02 || error
1035 $CHECKSTAT -t dir -f $DIR/d32g/tmp/symlink12 || error
1036 $CHECKSTAT -t dir -f $DIR/d32g/symlink02 || error
1038 run_test 32g "stat d32g/symlink->tmp/symlink->lustre-subdir/test_dir"
1041 [ -e $DIR/d32h ] && rm -fr $DIR/d32h
1042 [ -e $DIR/test_dir ] && rm -fr $DIR/test_dir
1043 mkdir -p $DIR/test_dir
1044 mkdir -p $DIR/d32h/tmp
1045 TMP_DIR=$DIR/d32h/tmp
1046 ln -s $DIR/test_dir $TMP_DIR/symlink12
1047 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
1048 ls $DIR/d32h/tmp/symlink12 || error
1049 ls $DIR/d32h/symlink02 || error
1051 run_test 32h "open d32h/symlink->tmp/symlink->lustre-subdir/test_dir"
1054 [ -e $DIR/d32i ] && rm -fr $DIR/d32i
1055 mkdir -p $DIR/d32i/ext2-mountpoint
1056 mount -t ext2 -o loop $EXT2_DEV $DIR/d32i/ext2-mountpoint || error
1057 touch $DIR/d32i/test_file
1058 $CHECKSTAT -t file $DIR/d32i/ext2-mountpoint/../test_file || error
1059 umount $DIR/d32i/ext2-mountpoint || error
1061 run_test 32i "stat d32i/ext2-mountpoint/../test_file ==========="
1064 [ -e $DIR/d32j ] && rm -fr $DIR/d32j
1065 mkdir -p $DIR/d32j/ext2-mountpoint
1066 mount -t ext2 -o loop $EXT2_DEV $DIR/d32j/ext2-mountpoint || error
1067 touch $DIR/d32j/test_file
1068 cat $DIR/d32j/ext2-mountpoint/../test_file || error
1069 umount $DIR/d32j/ext2-mountpoint || error
1071 run_test 32j "open d32j/ext2-mountpoint/../test_file ==========="
1075 mkdir -p $DIR/d32k/ext2-mountpoint
1076 mount -t ext2 -o loop $EXT2_DEV $DIR/d32k/ext2-mountpoint
1077 mkdir -p $DIR/d32k/d2
1078 touch $DIR/d32k/d2/test_file || error
1079 $CHECKSTAT -t file $DIR/d32k/ext2-mountpoint/../d2/test_file || error
1080 umount $DIR/d32k/ext2-mountpoint || error
1082 run_test 32k "stat d32k/ext2-mountpoint/../d2/test_file ========"
1086 mkdir -p $DIR/d32l/ext2-mountpoint
1087 mount -t ext2 -o loop $EXT2_DEV $DIR/d32l/ext2-mountpoint || error
1088 mkdir -p $DIR/d32l/d2
1089 touch $DIR/d32l/d2/test_file
1090 cat $DIR/d32l/ext2-mountpoint/../d2/test_file || error
1091 umount $DIR/d32l/ext2-mountpoint || error
1093 run_test 32l "open d32l/ext2-mountpoint/../d2/test_file ========"
1097 mkdir -p $DIR/d32m/tmp
1098 TMP_DIR=$DIR/d32m/tmp
1099 ln -s $DIR $TMP_DIR/symlink11
1100 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
1101 $CHECKSTAT -t link $DIR/d32m/tmp/symlink11 || error
1102 $CHECKSTAT -t link $DIR/d32m/symlink01 || error
1104 run_test 32m "stat d32m/symlink->tmp/symlink->lustre-root ======"
1108 mkdir -p $DIR/d32n/tmp
1109 TMP_DIR=$DIR/d32n/tmp
1110 ln -s $DIR $TMP_DIR/symlink11
1111 ln -s $TMP_DIR/symlink11 $TMP_DIR/../symlink01
1112 ls -l $DIR/d32n/tmp/symlink11 || error
1113 ls -l $DIR/d32n/symlink01 || error
1115 run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======"
1119 rm -f $DIR/test_file
1120 touch $DIR/test_file
1121 mkdir -p $DIR/d32o/tmp
1122 TMP_DIR=$DIR/d32o/tmp
1123 ln -s $DIR/test_file $TMP_DIR/symlink12
1124 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
1125 $CHECKSTAT -t link $DIR/d32o/tmp/symlink12 || error
1126 $CHECKSTAT -t link $DIR/d32o/symlink02 || error
1127 $CHECKSTAT -t file -f $DIR/d32o/tmp/symlink12 || error
1128 $CHECKSTAT -t file -f $DIR/d32o/symlink02 || error
1130 run_test 32o "stat d32o/symlink->tmp/symlink->lustre-root/test_file"
1136 rm -f $DIR/test_file
1138 touch $DIR/test_file
1140 mkdir -p $DIR/d32p/tmp
1142 TMP_DIR=$DIR/d32p/tmp
1144 ln -s $DIR/test_file $TMP_DIR/symlink12
1146 ln -s $TMP_DIR/symlink12 $TMP_DIR/../symlink02
1148 cat $DIR/d32p/tmp/symlink12 || error
1150 cat $DIR/d32p/symlink02 || error
1153 run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/test_file"
1156 [ -e $DIR/d32q ] && rm -fr $DIR/d32q
1158 touch $DIR/d32q/under_the_mount
1159 mount -t ext2 -o loop $EXT2_DEV $DIR/d32q
1160 ls $DIR/d32q/under_the_mount && error || true
1161 umount $DIR/d32q || error
1163 run_test 32q "stat follows mountpoints in Lustre (should return error)"
1166 [ -e $DIR/d32r ] && rm -fr $DIR/d32r
1168 touch $DIR/d32r/under_the_mount
1169 mount -t ext2 -o loop $EXT2_DEV $DIR/d32r
1170 ls $DIR/d32r | grep -q under_the_mount && error || true
1171 umount $DIR/d32r || error
1173 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
1175 # chmod 444 /mnt/lustre/somefile
1176 # open(/mnt/lustre/somefile, O_RDWR)
1179 rm -f $DIR/test_33_file
1180 touch $DIR/test_33_file
1181 chmod 444 $DIR/test_33_file
1182 chown $RUNAS_ID $DIR/test_33_file
1184 $RUNAS $OPENFILE -f O_RDWR $DIR/test_33_file && error || true
1187 run_test 33 "write file with mode 444 (should return error) ===="
1192 chown $RUNAS_ID $DIR/d33
1193 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/d33/f33 || error
1194 $RUNAS $OPENFILE -f O_RDWR:O_CREAT -m 0444 $DIR/d33/f33 && error || true
1196 run_test 33a "test open file(mode=0444) with O_RDWR (should return error)"
1198 TEST_34_SIZE=${TEST_34_SIZE:-2000000000000}
1201 $MCREATE $DIR/f34 || error
1202 $LFIND $DIR/f34 2>&1 | grep -q "no stripe info" || error
1203 $TRUNCATE $DIR/f34 $TEST_34_SIZE || error
1204 $LFIND $DIR/f34 2>&1 | grep -q "no stripe info" || error
1205 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 || error
1207 run_test 34a "truncate file that has not been opened ==========="
1210 [ ! -f $DIR/f34 ] && test_34a
1211 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 || error
1212 $OPENFILE -f O_RDONLY $DIR/f34
1213 $LFIND $DIR/f34 2>&1 | grep -q "no stripe info" || error
1214 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 || error
1216 run_test 34b "O_RDONLY opening file doesn't create objects ====="
1219 [ ! -f $DIR/f34 ] && test_34a
1220 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 || error
1221 $OPENFILE -f O_RDWR $DIR/f34
1222 $LFIND $DIR/f34 2>&1 | grep -q "no stripe info" && error
1223 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 || error
1225 run_test 34c "O_RDWR opening file-with-size works =============="
1228 [ ! -f $DIR/f34 ] && test_34a
1229 dd if=/dev/zero of=$DIR/f34 conv=notrunc bs=4k count=1 || error
1230 $CHECKSTAT -s $TEST_34_SIZE $DIR/f34 || error
1233 run_test 34d "write to sparse file ============================="
1237 $MCREATE $DIR/f34e || error
1238 $TRUNCATE $DIR/f34e 1000 || error
1239 $CHECKSTAT -s 1000 $DIR/f34e || error
1240 $OPENFILE -f O_RDWR $DIR/f34e
1241 $CHECKSTAT -s 1000 $DIR/f34e || error
1243 run_test 34e "create objects, some with size and some without =="
1246 cp /bin/sh $DIR/f35a
1248 chown $RUNAS_ID $DIR/f35a
1249 $RUNAS $DIR/f35a && error || true
1252 run_test 35a "exec file with mode 444 (should return and not leak) ====="
1256 utime $DIR/f36 || error
1258 run_test 36a "MDS utime check (mknod, utime) ==================="
1262 utime $DIR/f36 || error
1264 run_test 36b "OST utime check (open, utime) ===================="
1269 chown $RUNAS_ID $DIR/d36
1270 $RUNAS utime $DIR/d36/f36 || error
1272 run_test 36c "non-root MDS utime check (mknod, utime) =========="
1275 [ ! -d $DIR/d36 ] && test_36c
1276 echo "" > $DIR/d36/f36
1277 $RUNAS utime $DIR/d36/f36 || error
1279 run_test 36d "non-root OST utime check (open, utime) ==========="
1282 [ $RUNAS_ID -eq $UID ] && echo "skipping test 36e" && return
1283 [ ! -d $DIR/d36 ] && mkdir $DIR/d36
1285 $RUNAS utime $DIR/d36/f36e && error "utime worked, want failure" || true
1287 run_test 36e "utime on non-owned file (should return error) ===="
1290 mkdir -p $DIR/dextra
1291 echo f > $DIR/dextra/fbugfile
1292 mount -t ext2 -o loop $EXT2_DEV $DIR/dextra
1293 ls $DIR/dextra | grep "\<fbugfile\>" && error
1294 umount $DIR/dextra || error
1295 rm -f $DIR/dextra/fbugfile || error
1297 run_test 37 "ls a mounted file system to check old content ====="
1300 o_directory $DIR/test38
1302 run_test 38 "open a regular file with O_DIRECTORY =============="
1305 touch $DIR/test_39_file
1306 touch $DIR/test_39_file2
1307 # ls -l $DIR/test_39_file $DIR/test_39_file2
1308 # ls -lu $DIR/test_39_file $DIR/test_39_file2
1309 # ls -lc $DIR/test_39_file $DIR/test_39_file2
1311 $OPENFILE -f O_CREAT:O_TRUNC:O_WRONLY $DIR/test_39_file2
1312 # ls -l $DIR/test_39_file $DIR/test_39_file2
1313 # ls -lu $DIR/test_39_file $DIR/test_39_file2
1314 # ls -lc $DIR/test_39_file $DIR/test_39_file2
1315 [ $DIR/test_39_file2 -nt $DIR/test_39_file ] || error
1317 run_test 39 "mtime changed on create ==========================="
1320 dd if=/dev/zero of=$DIR/f40 bs=4096 count=1
1321 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/f40 && error
1322 $CHECKSTAT -t file -s 4096 $DIR/f40 || error
1324 run_test 40 "failed open(O_TRUNC) doesn't truncate ============="
1328 small_write $DIR/f41 18
1330 run_test 41 "test small file write + fstat ====================="
1332 count_ost_writes() {
1333 cat /proc/fs/lustre/osc/*/stats |
1334 awk -vwrites=0 '/ost_write/ { writes += $2 } END { print writes; }'
1341 # in 2.6, restore /proc/sys/vm/dirty_writeback_centisecs
1342 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
1343 echo $WRITEBACK_SAVE > /proc/sys/vm/dirty_writeback_centisecs
1345 # if file not here, we are a 2.4 kernel
1346 kill -CONT `pidof kupdated`
1350 # setup the trap first, so someone cannot exit the test at the
1351 # exact wrong time and mess up a machine
1352 trap start_writeback EXIT
1353 # in 2.6, save and 0 /proc/sys/vm/dirty_writeback_centisecs
1354 if [ -f /proc/sys/vm/dirty_writeback_centisecs ]; then
1355 WRITEBACK_SAVE=`cat /proc/sys/vm/dirty_writeback_centisecs`
1356 echo 0 > /proc/sys/vm/dirty_writeback_centisecs
1358 # if file not here, we are a 2.4 kernel
1359 kill -STOP `pidof kupdated`
1363 # ensure that all stripes have some grant before we test client-side cache
1365 [ "$SETUP_TEST42" ] && return
1366 for i in `seq -f $DIR/f42-%g 1 $OSTCOUNT`; do
1367 dd if=/dev/zero of=$i bs=4k count=1
1373 # Tests 42* verify that our behaviour is correct WRT caching, file closure,
1374 # file truncation, and file removal.
1377 cancel_lru_locks OSC
1379 sync; sleep 1; sync # just to be safe
1380 BEFOREWRITES=`count_ost_writes`
1381 grep [0-9] /proc/fs/lustre/osc/OSC*MNT*/cur_grant_bytes
1382 dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
1383 AFTERWRITES=`count_ost_writes`
1384 [ $BEFOREWRITES -eq $AFTERWRITES ] || \
1385 error "$BEFOREWRITES < $AFTERWRITES"
1388 run_test 42a "ensure that we don't flush on close =============="
1392 cancel_lru_locks OSC
1395 dd if=/dev/zero of=$DIR/f42b bs=1024 count=100
1396 BEFOREWRITES=`count_ost_writes`
1397 $MUNLINK $DIR/f42b || error "$MUNLINK $DIR/f42b: $?"
1398 AFTERWRITES=`count_ost_writes`
1399 [ $BEFOREWRITES -eq $AFTERWRITES ] ||
1400 error "$BEFOREWRITES < $AFTERWRITES on unlink"
1401 BEFOREWRITES=`count_ost_writes`
1402 sync || error "sync: $?"
1403 AFTERWRITES=`count_ost_writes`
1404 [ $BEFOREWRITES -eq $AFTERWRITES ] ||
1405 error "$BEFOREWRITES < $AFTERWRITES on sync"
1406 dmesg | grep 'error from obd_brw_async' && error 'error writing back'
1410 run_test 42b "test destroy of file with cached dirty data ======"
1412 # if these tests just want to test the effect of truncation,
1413 # they have to be very careful. consider:
1414 # - the first open gets a {0,EOF}PR lock
1415 # - the first write conflicts and gets a {0, count-1}PW
1416 # - the rest of the writes are under {count,EOF}PW
1417 # - the open for truncate tries to match a {0,EOF}PR
1418 # for the filesize and cancels the PWs.
1419 # any number of fixes (don't get {0,EOF} on open, match
1420 # composite locks, do smarter file size management) fix
1421 # this, but for now we want these tests to verify that
1422 # the cancellation with truncate intent works, so we
1423 # start the file with a full-file pw lock to match against
1424 # until the truncate.
1429 cancel_lru_locks OSC
1431 # prime the file with 0,EOF PW to match
1435 # now the real test..
1436 dd if=/dev/zero of=$file bs=1024 count=100
1437 BEFOREWRITES=`count_ost_writes`
1438 $TRUNCATE $file $offset
1439 cancel_lru_locks OSC
1440 AFTERWRITES=`count_ost_writes`
1446 [ $BEFOREWRITES -eq $AFTERWRITES ] && \
1447 error "beforewrites $BEFOREWRITES == afterwrites $AFTERWRITES on truncate"
1450 run_test 42c "test partial truncate of file with cached dirty data"
1454 [ $BEFOREWRITES -eq $AFTERWRITES ] || \
1455 error "beforewrites $BEFOREWRITES != afterwrites $AFTERWRITES on truncate"
1458 run_test 42d "test complete truncate of file with cached dirty data"
1462 cp -p /bin/ls $DIR/d43/f
1463 exec 100>> $DIR/d43/f
1464 $DIR/d43/f && error || true
1467 run_test 43 "execution of file opened for write should return -ETXTBSY"
1471 cp -p `which multiop` $DIR/d43/multiop
1472 $DIR/d43/multiop $TMP/test43.junk O_c &
1475 multiop $DIR/d43/multiop Oc && error "expected error, got success"
1476 kill -USR1 $MULTIPID || return 2
1477 wait $MULTIPID || return 3
1479 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
1483 cp -p `which multiop` $DIR/d43/multiop
1484 $DIR/d43/multiop $TMP/test43.junk O_c &
1487 truncate $DIR/d43/multiop 0 && error "expected error, got success"
1488 kill -USR1 $MULTIPID || return 2
1489 wait $MULTIPID || return 3
1491 run_test 43b "truncate of file being executed should return -ETXTBSY"
1494 local testdir="$DIR/d43c"
1497 ( cd $(dirname $SHELL) && md5sum $(basename $SHELL) ) | \
1498 ( cd $testdir && md5sum -c)
1500 run_test 43c "md5sum of copy into lustre========================"
1503 [ "$OSTCOUNT" -lt "2" ] && echo "skipping 2-stripe test" && return
1504 dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
1505 dd if=$DIR/f1 bs=4k count=1
1507 run_test 44 "zero length read from a sparse stripe ============="
1510 local nstripe=`$LCTL lov_getconfig $DIR | grep default_stripe_count: | \
1512 local stride=`$LCTL lov_getconfig $DIR | grep default_stripe_size: | \
1514 if [ $nstripe -eq 0 ] ; then
1515 nstripe=`$LCTL lov_getconfig $DIR | grep obd_count: | awk '{print $2}'`
1518 OFFSETS="0 $((stride/2)) $((stride-1))"
1519 for offset in $OFFSETS ; do
1520 for i in `seq 0 $((nstripe-1))`; do
1522 local GLOBALOFFSETS=""
1523 local size=$((((i + 2 * $nstripe )*$stride + $offset))) # Bytes
1524 ll_sparseness_write $DIR/d44a $size || error "ll_sparseness_write"
1525 GLOBALOFFSETS="$GLOBALOFFSETS $size"
1526 ll_sparseness_verify $DIR/d44a $GLOBALOFFSETS \
1527 || error "ll_sparseness_verify $GLOBALOFFSETS"
1529 for j in `seq 0 $((nstripe-1))`; do
1530 size=$((((j + $nstripe )*$stride + $offset))) # Bytes
1531 ll_sparseness_write $DIR/d44a $size || error "ll_sparseness_write"
1532 GLOBALOFFSETS="$GLOBALOFFSETS $size"
1534 ll_sparseness_verify $DIR/d44a $GLOBALOFFSETS \
1535 || error "ll_sparseness_verify $GLOBALOFFSETS"
1539 run_test 44a "test sparse pwrite ==============================="
1543 for d in /proc/fs/lustre/osc/*/cur_dirty_bytes; do
1544 tot=$(($tot + `cat $d`))
1549 before=`dirty_osc_total`
1550 echo executing "\"$*\""
1552 after=`dirty_osc_total`
1553 echo before $before, after $after
1557 # Obtain grants from OST if it supports it
1558 echo blah > ${f}_grant
1561 do_dirty_record "echo blah > $f"
1562 [ $before -eq $after ] && error "write wasn't cached"
1563 do_dirty_record "> $f"
1564 [ $before -gt $after ] || error "truncate didn't lower dirty count"
1565 do_dirty_record "echo blah > $f"
1566 [ $before -eq $after ] && error "write wasn't cached"
1567 do_dirty_record "sync"
1568 [ $before -gt $after ] || error "writeback didn't lower dirty count"
1569 do_dirty_record "echo blah > $f"
1570 [ $before -eq $after ] && error "write wasn't cached"
1571 do_dirty_record "cancel_lru_locks OSC"
1572 [ $before -gt $after ] || error "lock cancellation didn't lower dirty count"
1575 run_test 45 "osc io page accounting ============================"
1581 # in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object. this
1582 # test tickles a bug where re-dirtying a page was failing to be mapped to the
1583 # objects offset and an assert hit when an rpc was built with 1023's mapped
1584 # offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
1589 dd if=/dev/zero of=$f bs=`page_size` seek=511 count=1
1591 dd conv=notrunc if=/dev/zero of=$f bs=`page_size` seek=1023 count=1
1592 dd conv=notrunc if=/dev/zero of=$f bs=`page_size` seek=511 count=1
1596 run_test 46 "dirtying a previously written page ================"
1598 # Check that device nodes are created and then visible correctly (#2091)
1600 cmknod $DIR/test_47_node || error
1602 run_test 47 "Device nodes check ================================"
1604 test_48a() { # bug 2399
1605 check_kernel_version 34 || return 0
1608 mv $DIR/d48a $DIR/d48.new || error "move directory failed"
1609 mkdir $DIR/d48a || error "recreate directory failed"
1610 touch foo || error "'touch foo' failed after recreating cwd"
1611 mkdir bar || error "'mkdir foo' failed after recreating cwd"
1612 ls . || error "'ls .' failed after recreating cwd"
1613 ls .. || error "'ls ..' failed after removing cwd"
1614 cd . || error "'cd .' failed after recreating cwd"
1615 mkdir . && error "'mkdir .' worked after recreating cwd"
1616 rmdir . && error "'rmdir .' worked after recreating cwd"
1617 ln -s . baz || error "'ln -s .' failed after recreating cwd"
1618 cd .. || error "'cd ..' failed after recreating cwd"
1620 run_test 48a "Access renamed working dir (should return errors)="
1622 test_48b() { # bug 2399
1623 check_kernel_version 34 || return 0
1626 rmdir $DIR/d48b || error "remove cwd $DIR/d48b failed"
1627 touch foo && error "'touch foo' worked after removing cwd"
1628 mkdir foo && error "'mkdir foo' worked after removing cwd"
1629 ls . && error "'ls .' worked after removing cwd"
1630 ls .. || error "'ls ..' failed after removing cwd"
1631 cd . && error "'cd .' worked after removing cwd"
1632 mkdir . && error "'mkdir .' worked after removing cwd"
1633 rmdir . && error "'rmdir .' worked after removing cwd"
1634 ln -s . foo && error "'ln -s .' worked after removing cwd"
1635 cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517
1638 run_test 48b "Access removed working dir (should return errors)="
1640 test_48c() { # bug 2350
1641 check_kernel_version 36 || return 0
1642 #sysctl -w portals.debug=-1
1644 mkdir -p $DIR/d48c/dir
1646 $TRACE rmdir $DIR/d48c/dir || error "remove cwd $DIR/d48c/dir failed"
1647 $TRACE touch foo && error "'touch foo' worked after removing cwd"
1648 $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
1649 $TRACE ls . && error "'ls .' worked after removing cwd"
1650 $TRACE ls .. || error "'ls ..' failed after removing cwd"
1651 $TRACE cd . && error "'cd .' worked after removing cwd"
1652 $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
1653 $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
1654 $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd"
1655 $TRACE cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3415
1657 run_test 48c "Access removed working subdir (should return errors)"
1659 test_48d() { # bug 2350
1660 check_kernel_version 36 || return 0
1661 #sysctl -w portals.debug=-1
1663 mkdir -p $DIR/d48d/dir
1665 $TRACE rmdir $DIR/d48d/dir || error "remove cwd $DIR/d48d/dir failed"
1666 $TRACE rmdir $DIR/d48d || error "remove parent $DIR/d48d failed"
1667 $TRACE touch foo && error "'touch foo' worked after removing parent"
1668 $TRACE mkdir foo && error "'mkdir foo' worked after removing parent"
1669 $TRACE ls . && error "'ls .' worked after removing parent"
1670 $TRACE ls .. && error "'ls ..' worked after removing parent"
1671 $TRACE cd . && error "'cd .' worked after recreate parent"
1672 $TRACE mkdir . && error "'mkdir .' worked after removing parent"
1673 $TRACE rmdir . && error "'rmdir .' worked after removing parent"
1674 $TRACE ln -s . foo && error "'ln -s .' worked after removing parent"
1675 $TRACE cd .. && error "'cd ..' worked after removing parent" || true
1678 run_test 48d "Access removed parent subdir (should return errors)"
1684 ls /proc/$$/cwd || error
1686 run_test 50 "special situations: /proc symlinks ==============="
1689 # bug 1516 - create an empty entry right after ".." then split dir
1692 $MCREATE $DIR/d49/bar
1694 createmany -m $DIR/d49/longfile 201
1696 while [ `ls -sd $DIR/d49 | awk '{ print $1 }'` -eq 4 ]; do
1697 $MCREATE $DIR/d49/longfile$FNUM
1701 ls -l $DIR/d49 > /dev/null || error
1703 run_test 51 "special situations: split htree with empty entry =="
1707 check_kernel_version 40 || NUMTEST=31000
1708 NUMFREE=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'`
1709 [ $NUMFREE -lt $NUMTEST ] && \
1710 echo "skipping test 51b, not enough free inodes($NUMFREE)" && \
1713 (cd $DIR/d51b; mkdirmany t $NUMTEST)
1715 run_test 51b "mkdir .../t-0 --- .../t-$NUMTEST ===================="
1719 check_kernel_version 40 || NUMTEST=31000
1720 NUMFREE=`df -i -P $DIR | tail -n 1 | awk '{ print $4 }'`
1721 [ $NUMFREE -lt $NUMTEST ] && echo "skipping test 51c" && return
1723 (cd $DIR/d51b; rmdirmany t $NUMTEST)
1725 run_test 51c "rmdir .../t-0 --- .../t-$NUMTEST ===================="
1728 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
1731 chattr =a $DIR/d52a/foo || error
1732 echo bar >> $DIR/d52a/foo || error
1733 cp /etc/hosts $DIR/d52a/foo && error
1734 rm -f $DIR/d52a/foo 2>/dev/null && error
1735 link $DIR/d52a/foo $DIR/d52a/foo_link 2>/dev/null && error
1736 echo foo >> $DIR/d52a/foo || error
1737 mrename $DIR/d52a/foo $DIR/d52a/foo_ren && error
1738 lsattr $DIR/d52a/foo | egrep -q "^-+a-+ $DIR/d52a/foo" || error
1739 chattr -a $DIR/d52a/foo || error
1741 rm -fr $DIR/d52a || error
1743 run_test 52a "append-only flag test (should return errors) ====="
1746 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
1749 chattr =i $DIR/d52b/foo || error
1750 cat test > $DIR/d52b/foo && error
1751 cp /etc/hosts $DIR/d52b/foo && error
1752 rm -f $DIR/d52b/foo 2>/dev/null && error
1753 link $DIR/d52b/foo $DIR/d52b/foo_link 2>/dev/null && error
1754 echo foo >> $DIR/d52b/foo && error
1755 mrename $DIR/d52b/foo $DIR/d52b/foo_ren && error
1756 [ -f $DIR/d52b/foo ] || error
1757 [ -f $DIR/d52b/foo_ren ] && error
1758 lsattr $DIR/d52b/foo | egrep -q "^-+i-+ $DIR/d52b/foo" || error
1759 chattr -i $DIR/d52b/foo || error
1761 rm -fr $DIR/d52b || error
1763 run_test 52b "immutable flag test (should return errors) ======="
1766 for i in `ls -d /proc/fs/lustre/osc/OSC*mds1 2> /dev/null` ; do
1767 ostname=`echo $i | cut -d _ -f 3-4 | sed -e s/_mds1//`
1768 ost_last=`cat /proc/fs/lustre/obdfilter/$ostname/last_id`
1769 mds_last=`cat $i/prealloc_last_id`
1770 echo "$ostname.last_id=$ost_last ; MDS.last_id=$mds_last"
1771 if [ $ost_last != $mds_last ]; then
1772 error "$ostname.last_id=$ost_last ; MDS.last_id=$mds_last"
1776 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
1779 $SOCKETSERVER $DIR/socket
1780 $SOCKETCLIENT $DIR/socket || error
1781 $MUNLINK $DIR/socket
1783 run_test 54a "unix damain socket test =========================="
1789 dd if=/dev/zero of=$f bs=`page_size` count=1
1791 run_test 54b "char device works in lustre ======================"
1794 [ "$LOOPNUM" ] && return
1795 [ -b /dev/loop/0 ] && LOOPBASE=/dev/loop/
1796 [ -b /dev/loop0 ] && LOOPBASE=/dev/loop
1797 [ -z "$LOOPBASE" ] && echo "/dev/loop/0 and /dev/loop0 gone?" && return
1799 for i in `seq 3 7`; do
1800 losetup $LOOPBASE$i > /dev/null 2>&1 && continue
1810 loopdev="$DIR/loop54c"
1813 [ -z "$LOOPNUM" ] && echo "couldn't find empty loop device" && return
1814 mknod $loopdev b 7 $LOOPNUM
1815 echo "make a loop file system with $tfile on $loopdev ($LOOPNUM)..."
1817 dd if=/dev/zero of=$tfile bs=`page_size` seek=1024 count=1 > /dev/null
1818 losetup $loopdev $tfile || error "can't set up $loopdev for $tfile"
1819 mkfs.ext2 $loopdev || error "mke2fs on $loopdev"
1821 mount -t ext2 $loopdev $tdir || error "error mounting $loopdev on $tdir"
1822 dd if=/dev/zero of=$tdir/tmp bs=`page_size` count=30 || error "dd write"
1824 dd if=$tdir/tmp of=/dev/zero bs=`page_size` count=30 || error "dd read"
1829 run_test 54c "block device works in lustre ====================="
1835 [ "$string" = `echo $string > $f | cat $f` ] || error
1837 run_test 54d "fifo device works in lustre ======================"
1840 grep -q $FSTYPE /proc/filesystems && return 0
1842 grep -q $FSTYPE /proc/filesystems && return 0
1843 insmod ../$FSTYPE/$FSTYPE.o
1844 grep -q $FSTYPE /proc/filesystems && return 0
1851 check_fstype && echo "can't find fs $FSTYPE, skipping test 55" && return
1852 mount -t $FSTYPE -o loop,iopen $EXT2_DEV $DIR/d55 || error "mounting"
1854 $IOPENTEST1 $DIR/d55/foo $DIR/d55 || error "running $IOPENTEST1"
1855 $IOPENTEST2 $DIR/d55 || error "running $IOPENTEST2"
1856 echo "check for $EXT2_DEV. Please wait..."
1858 umount $DIR/d55 || error "unmounting"
1860 run_test 55 "check iopen_connect_dentry() ======================"
1867 NUMFILESx2=$(($NUMFILES * 2))
1868 for i in `seq 1 $NUMFILES` ; do
1869 touch $DIR/d56/file$i
1870 touch $DIR/d56/dir/file$i
1873 # test lfs find with --recursive
1874 FILENUM=`$LFIND --recursive $DIR/d56 | grep -c obdidx`
1875 [ $FILENUM -eq $NUMFILESx2 ] || error \
1876 "lfs find --recursive $DIR/d56 wrong: found $FILENUM, expected $NUMFILESx2"
1877 FILENUM=`$LFIND $DIR/d56 | grep -c obdidx`
1878 [ $FILENUM -eq $NUMFILES ] || error \
1879 "lfs find $DIR/d56 without --recursive wrong: found $FILENUM,
1881 echo "lfs find --recursive passed."
1883 # test lfs find with file instead of dir
1884 FILENUM=`$LFIND $DIR/d56/file1 | grep -c obdidx`
1885 [ $FILENUM -eq 1 ] || error \
1886 "lfs find $DIR/d56/file1 wrong:found $FILENUM, expected 1"
1887 echo "lfs find file passed."
1889 #test lfs find with --verbose
1890 [ `$LFIND --verbose $DIR/d56 | grep -c lmm_magic` -eq $NUMFILES ] ||\
1891 error "lfs find --verbose $DIR/d56 wrong: should find $NUMFILES lmm_magic info"
1892 [ `$LFIND $DIR/d56 | grep -c lmm_magic` -eq 0 ] || error \
1893 "lfs find $DIR/d56 without --verbose wrong: should not show lmm_magic info"
1894 echo "lfs find --verbose passed."
1896 #test lfs find with --obd
1897 $LFIND --obd wrong_uuid $DIR/d56 2>&1 | grep -q "unknown obduuid" || \
1898 error "lfs find --obd wrong_uuid should return error information"
1900 [ "$OSTCOUNT" -lt 2 ] && \
1901 echo "skipping other lfs find --obd test" && return
1902 FILENUM=`$LFIND --recursive $DIR/d56 | sed -n '/^[ ]*1[ ]/p' | wc -l`
1903 OBDUUID=`$LFIND --recursive $DIR/d56 | sed -n '/^[ ]*1:/p' | awk '{print $2}'`
1904 FOUND=`$LFIND -r --obd $OBDUUID $DIR/d56 | wc -l`
1905 [ $FOUND -eq $FILENUM ] || \
1906 error "lfs find --obd wrong: found $FOUND, expected $FILENUM"
1907 [ `$LFIND -r -v --obd $OBDUUID $DIR/d56 | sed '/^[ ]*1[ ]/d' | \
1908 sed -n '/^[ ]*[0-9][0-9]*[ ]/p' | wc -l` -eq 0 ] || \
1909 error "lfs find --obd wrong: should not show file on other obd"
1910 echo "lfs find --obd passed."
1912 run_test 56 "check lfs find ===================================="
1915 # note test will not do anything if MDS is not local
1916 for DEV in `cat /proc/fs/lustre/mds/*/mntdev`; do
1917 dumpe2fs -h $DEV > $TMP/t57a.dump || error "can't access $DEV"
1918 DEVISIZE=`awk '/Inode size:/ { print $3 }' $TMP/t57a.dump`
1919 [ "$DEVISIZE" -gt 128 ] || error "inode size $DEVISIZE"
1923 run_test 57a "verify MDS filesystem created with large inodes =="
1928 FILEN=$DIR/d57b/f$FILECOUNT
1929 rm -rf $DIR/d57b || error "removing $DIR/d57b"
1930 mkdir -p $DIR/d57b || error "creating $DIR/d57b"
1931 echo "mcreating $FILECOUNT files"
1932 createmany -m $DIR/d57b/f 1 $FILECOUNT || \
1933 error "creating files in $DIR/d57b"
1935 # verify that files do not have EAs yet
1936 $LFIND $FILE1 2>&1 | grep -q "no stripe" || error "$FILE1 has an EA"
1937 $LFIND $FILEN 2>&1 | grep -q "no stripe" || error "$FILEN has an EA"
1939 MDSFREE="`cat /proc/fs/lustre/mds/*/kbytesfree`"
1940 MDCFREE="`cat /proc/fs/lustre/mdc/*/kbytesfree`"
1941 echo "opening files to create objects/EAs"
1942 for FILE in `seq -f $DIR/d57b/f%g 1 $FILECOUNT`; do
1943 $OPENFILE -f O_RDWR $FILE > /dev/null || error "opening $FILE"
1946 # verify that files have EAs now
1947 $LFIND $FILE1 | grep -q "obdidx" || error "$FILE1 missing EA"
1948 $LFIND $FILEN | grep -q "obdidx" || error "$FILEN missing EA"
1950 MDSFREE2="`cat /proc/fs/lustre/mds/*/kbytesfree`"
1951 MDCFREE2="`cat /proc/fs/lustre/mdc/*/kbytesfree`"
1952 if [ "$MDCFREE" != "$MDCFREE2" ]; then
1953 if [ "$MDSFREE" != "$MDSFREE2" ]; then
1954 error "MDC before $MDCFREE != after $MDCFREE2"
1956 echo "MDC before $MDCFREE != after $MDCFREE2"
1957 echo "unable to confirm if MDS has large inodes"
1962 run_test 57b "default LOV EAs are stored inside large inodes ==="
1967 run_test 58 "verify cross-platform wire constants =============="
1970 echo "touch 130 files"
1971 for i in `seq 1 130` ; do
1975 for i in `seq 1 130` ; do
1980 # wait for commitment of removal
1982 run_test 59 "verify cancellation of llog records async ========="
1985 echo 60 "llog tests run from kernel mode"
1988 run_test 60 "llog sanity tests run from kernel module =========="
1992 dd if=/dev/zero of=$f bs=`page_size` count=1
1993 cancel_lru_locks OSC
1994 multiop $f OSMWUc || error
1997 run_test 61 "mmap() writes don't make sync hang ================"
1999 # bug 2330 - insufficient obd_match error checking causes LBUG
2003 cancel_lru_locks OSC
2004 echo 0x405 > /proc/sys/lustre/fail_loc
2005 cat $f && error "cat succeeded, expect -EIO"
2006 echo 0 > /proc/sys/lustre/fail_loc
2008 run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
2010 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
2012 MAX_DIRTY_MB=`cat /proc/fs/lustre/osc/*/max_dirty_mb | head -n 1`
2013 for i in /proc/fs/lustre/osc/*/max_dirty_mb ; do
2016 for i in `seq 10` ; do
2017 dd if=/dev/zero of=$DIR/f63 bs=8k &
2023 for i in /proc/fs/lustre/osc/*/max_dirty_mb ; do
2024 echo $MAX_DIRTY_MB > $i
2028 run_test 63 "Verify oig_wait interruption does not crash ======"
2032 grep "[0-9]" /proc/fs/lustre/osc/OSC*MNT*/cur*
2034 run_test 64a "verify filter grant calculations (in kernel) ====="
2039 run_test 64b "check out-of-space detection on client ==========="
2041 # bug 1414 - set/get directories' stripe info
2045 $LVERIFY $DIR/d65 $DIR/d65/f1 || error "lverify failed"
2047 run_test 65a "directory with no stripe info ===================="
2051 $LSTRIPE $DIR/d65 $(($STRIPESIZE * 2)) 0 1 || error "setstripe"
2053 $LVERIFY $DIR/d65 $DIR/d65/f2 || error "lverify failed"
2055 run_test 65b "directory setstripe $(($STRIPESIZE * 2)) 0 1 ==============="
2058 if [ $OSTCOUNT -gt 1 ]; then
2060 $LSTRIPE $DIR/d65 $(($STRIPESIZE * 4)) 1 \
2061 $(($OSTCOUNT - 1)) || error "setstripe"
2063 $LVERIFY $DIR/d65 $DIR/d65/f3 || error "lverify failed"
2066 run_test 65c "directory setstripe $(($STRIPESIZE * 4)) 1 $(($OSTCOUNT - 1))"
2068 [ $STRIPECOUNT -eq 0 ] && sc=1 || sc=$(($STRIPECOUNT - 1))
2072 $LSTRIPE $DIR/d65 $STRIPESIZE -1 $sc || error "setstripe"
2073 touch $DIR/d65/f4 $DIR/d65/f5
2074 $LVERIFY $DIR/d65 $DIR/d65/f4 $DIR/d65/f5 || error "lverify failed"
2076 run_test 65d "directory setstripe $STRIPESIZE -1 $sc ======================"
2081 $LSTRIPE $DIR/d65 0 -1 0 || error "setstripe"
2083 $LVERIFY $DIR/d65 $DIR/d65/f6 || error "lverify failed"
2085 run_test 65e "directory setstripe 0 -1 0 (default) ============="
2089 $RUNAS $LSTRIPE $DIR/d65f 0 -1 0 && error "setstripe succeeded" || true
2091 run_test 65f "dir setstripe permission (should return error) ==="
2093 # bug 2543 - update blocks count on client
2096 dd if=/dev/zero of=$DIR/f66 bs=1k count=$COUNT
2098 BLOCKS=`ls -s $DIR/f66 | awk '{ print $1 }'`
2099 [ $BLOCKS -ge $COUNT ] || error "$DIR/f66 blocks $BLOCKS < $COUNT"
2101 run_test 66 "update inode blocks count on client ==============="
2103 test_67() { # bug 3285 - supplementary group fails on MDS, passes on client
2104 [ "$RUNAS_ID" = "$UID" ] && echo "skipping test 67" && return
2105 check_kernel_version 35 || return 0
2108 chgrp $RUNAS_ID $DIR/d67
2109 $RUNAS -g $(($RUNAS_ID + 1)) -G1,2,$RUNAS_ID ls $DIR/d67 && error ||true
2111 run_test 67 "supplementary group failure (should return error) ="
2114 if [ "$LOOPDEV" ]; then
2115 swapoff $LOOPDEV || error "swapoff failed"
2116 losetup -d $LOOPDEV || error "losetup -d failed"
2117 unset LOOPDEV LOOPNUM
2123 awk '($1 == "'$1':") { print $2 }' /proc/meminfo
2127 swapon -s | awk '($1 == "'$1'") { print $4 }'
2130 # excercise swapping to lustre by adding a high priority swapfile entry
2131 # and then consuming memory until it is used.
2133 [ "$UID" != 0 ] && echo "skipping test 68 (must run as root)" && return
2134 [ "`lsmod|grep obdfilter`" ] && echo "skipping test 68 (local OST)" && \
2138 dd if=/dev/zero of=$DIR/f68 bs=64k count=1024
2140 trap cleanup_68 EXIT
2142 losetup $LOOPDEV $DIR/f68 || error "losetup $LOOPDEV failed"
2144 swapon -p 32767 $LOOPDEV || error "swapon $LOOPDEV failed"
2146 echo "before: `swapon -s | grep $LOOPDEV`"
2147 KBFREE=`meminfo MemTotal`
2148 $MEMHOG $KBFREE || error "error allocating $KBFREE kB"
2149 echo "after: `swapon -s | grep $LOOPDEV`"
2150 SWAPUSED=`swap_used $LOOPDEV`
2154 [ $SWAPUSED -eq 0 ] && echo "no swap used???" || true
2156 run_test 68 "support swapping to Lustre ========================"
2158 # on the LLNL clusters, runas will still pick up root's $TMP settings,
2159 # which will not be writable for the runas user, and then you get a CVS
2160 # error message with a corrupt path string (CVS bug) and panic.
2161 # We're not using much space, so just stick it in /tmp, which is safe.
2167 [ $RUNAS_ID -ne $UID ] && HOME=/tmp
2170 mkdir -p $DIR/d99cvsroot
2171 chown $RUNAS_ID $DIR/d99cvsroot
2172 $RUNAS cvs -d $DIR/d99cvsroot init || error
2174 run_test 99a "cvs init ========================================="
2177 [ ! -d $DIR/d99cvsroot ] && test_99a
2179 # some versions of cvs import exit(1) when asked to import links or
2180 # files they can't read. ignore those files.
2181 TOIGNORE=$(find . -type l -printf '-I %f\n' -o \
2182 ! -perm +4 -printf '-I %f\n')
2183 $RUNAS cvs -d $DIR/d99cvsroot import -m "nomesg" $TOIGNORE \
2184 d99reposname vtag rtag
2186 run_test 99b "cvs import ======================================="
2189 [ ! -d $DIR/d99cvsroot ] && test_99b
2191 mkdir -p $DIR/d99reposname
2192 chown $RUNAS_ID $DIR/d99reposname
2193 $RUNAS cvs -d $DIR/d99cvsroot co d99reposname
2195 run_test 99c "cvs checkout ====================================="
2198 [ ! -d $DIR/d99cvsroot ] && test_99c
2199 cd $DIR/d99reposname
2201 $RUNAS cvs add -m 'addmsg' foo99
2203 run_test 99d "cvs add =========================================="
2206 [ ! -d $DIR/d99cvsroot ] && test_99c
2207 cd $DIR/d99reposname
2210 run_test 99e "cvs update ======================================="
2213 [ ! -d $DIR/d99cvsroot ] && test_99d
2214 cd $DIR/d99reposname
2215 $RUNAS cvs commit -m 'nomsg' foo99
2217 run_test 99f "cvs commit ======================================="
2223 log "cleanup: ======================================================"
2224 if [ "`mount | grep ^$NAME`" ]; then
2225 rm -rf $DIR/[Rdfs][1-9]*
2226 if [ "$I_MOUNTED" = "yes" ]; then
2227 sh llmountcleanup.sh || error
2231 echo '=========================== finished ==============================='
2232 [ -f "$SANITYLOG" ] && cat $SANITYLOG && exit 1 || true