Whamcloud - gitweb
b=3643
[fs/lustre-release.git] / lustre / tests / sanity.sh
index 6b15107..2aea097 100644 (file)
@@ -7,9 +7,13 @@
 set -e
 
 ONLY=${ONLY:-"$*"}
-# bug number for skipped test:
-ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-""}
+# bug number for skipped test: 2108
+RENAME_TESTS="24a 24b 24c 24d 24e 24f 24g 24h 24i 24j 24k 24l 24m 24n 24o 48a 48d"
+ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"$RENAME_TESTS 58"}
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
+case `uname -r` in
+2.6.*) ALWAYS_EXCEPT="$ALWAYS_EXCEPT 54c 55" # bug 3117
+esac
 
 [ "$ALWAYS_EXCEPT$EXCEPT" ] && echo "Skipping tests: $ALWAYS_EXCEPT $EXCEPT"
 
@@ -17,6 +21,7 @@ SRCDIR=`dirname $0`
 export PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
 
 TMP=${TMP:-/tmp}
+FSTYPE=${FSTYPE:-ext3}
 
 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
 CREATETEST=${CREATETEST:-createtest}
@@ -68,10 +73,30 @@ log() {
        lctl mark "$*" 2> /dev/null || true
 }
 
+trace() {
+       log "STARTING: $*"
+       strace -o $TMP/$1.strace -ttt $*
+       RC=$?
+       log "FINISHED: $*: rc $RC"
+       return 1
+}
+TRACE=${TRACE:-""}
+
+check_kernel_version() {
+       VERSION_FILE=/proc/fs/lustre/kernel_version
+       WANT_VER=$1
+       [ ! -f $VERSION_FILE ] && echo "can't find kernel version" && return 1
+       GOT_VER=`cat $VERSION_FILE`
+       [ $GOT_VER -ge $WANT_VER ] && return 0
+       log "test needs at least kernel version $WANT_VER, running $GOT_VER"
+       return 1
+}
+
 run_one() {
        if ! mount | grep -q $DIR; then
                $START
        fi
+       echo -1 >/proc/sys/portals/debug        
        log "== test $1: $2"
        export TESTNAME=test_$1
        test_$1 || error "test_$1: exit with rc=$?"
@@ -170,11 +195,7 @@ build_test_filter
 echo preparing for tests involving mounts
 EXT2_DEV=${EXT2_DEV:-/tmp/SANITY.LOOP}
 touch $EXT2_DEV
-mke2fs -F $EXT2_DEV 1000 > /dev/null
-
-EXT3_DEV=${EXT3_DEV:-/tmp/SANITY_EXT3_DEV.LOOP}
-touch $EXT3_DEV
-mkfs.ext3 -F $EXT3_DEV 10000 > /dev/null
+mke2fs -j -F $EXT2_DEV 8000 > /dev/null
 
 test_0() {
        touch $DIR/f
@@ -643,6 +664,12 @@ test_24n() {
 }
 run_test 24n "Statting the old file after renameing (Posix rename 2)"
 
+test_24o() {
+       check_kernel_version 37 || return 0
+       rename_many -s 3287 -v -n 10 $DIR
+}
+run_test 24o "rename of files during htree split ==============="
+
 test_25a() {
        echo '== symlink sanity ============================================='
        mkdir $DIR/d25
@@ -870,9 +897,10 @@ test_31d() {
 run_test 31d "remove of open directory ========================="
 
 test_31e() {
+       check_kernel_version 34 || return 0
        openfilleddirunlink $DIR/d31e || error
 }
-run_test 31e "remove of open non-removable directory ========================="
+run_test 31e "remove of open non-empty directory ==============="
 
 test_32a() {
        echo "== more mountpoints and symlinks ================="
@@ -1192,7 +1220,7 @@ test_36d() {
 run_test 36d "non-root OST utime check (open, utime) ==========="
 
 test_36e() {
-       [ $RUNAS_ID -eq $UID ] && return
+       [ $RUNAS_ID -eq $UID ] && echo "skipping test 36e" && return
        [ ! -d $DIR/d36 ] && mkdir $DIR/d36
        touch $DIR/d36/f36e
        $RUNAS utime $DIR/d36/f36e && error "utime worked, want failure" || true
@@ -1414,7 +1442,7 @@ run_test 43c "md5sum of copy into lustre========================"
 
 test_44() {
        [  "$OSTCOUNT" -lt "2" ] && echo "skipping 2-stripe test" && return
-       dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=127
+       dd if=/dev/zero of=$DIR/f1 bs=4k count=1 seek=1023
        dd if=$DIR/f1 bs=4k count=1
 }
 run_test 44 "zero length read from a sparse stripe ============="
@@ -1491,18 +1519,18 @@ page_size() {
        getconf PAGE_SIZE
 }
 
-# in a 2 stripe file (lov.sh), page 63 maps to page 31 in its object.  this
+# in a 2 stripe file (lov.sh), page 1023 maps to page 511 in its object.  this
 # test tickles a bug where re-dirtying a page was failing to be mapped to the
-# objects offset and an assert hit when an rpc was built with 63's mapped 
-# offset 31 and 31's raw 31 offset. it also found general redirtying bugs.
+# objects offset and an assert hit when an rpc was built with 1023's mapped 
+# offset 511 and 511's raw 511 offset. it also found general redirtying bugs.
 test_46() {
        f="$DIR/f46"
        stop_writeback
        sync
-       dd if=/dev/zero of=$f bs=`page_size` seek=31 count=1
+       dd if=/dev/zero of=$f bs=`page_size` seek=511 count=1
        sync
-       dd conv=notrunc if=/dev/zero of=$f bs=`page_size` seek=63 count=1
-       dd conv=notrunc if=/dev/zero of=$f bs=`page_size` seek=31 count=1
+       dd conv=notrunc if=/dev/zero of=$f bs=`page_size` seek=1023 count=1
+       dd conv=notrunc if=/dev/zero of=$f bs=`page_size` seek=511 count=1
        sync
        start_writeback
 }
@@ -1515,7 +1543,8 @@ test_47() {
 run_test 47 "Device nodes check ================================"
 
 test_48a() { # bug 2399
-       mkdir $DIR/d48a
+       check_kernel_version 34 || return 0
+       mkdir -p $DIR/d48a
        cd $DIR/d48a
        mv $DIR/d48a $DIR/d48.new || error "move directory failed"
        mkdir $DIR/d48a || error "recreate directory failed"
@@ -1527,24 +1556,67 @@ test_48a() { # bug 2399
        mkdir . && error "'mkdir .' worked after recreating cwd"
        rmdir . && error "'rmdir .' worked after recreating cwd"
        ln -s . baz || error "'ln -s .' failed after recreating cwd"
+       cd .. || error "'cd ..' failed after recreating cwd"
 }
 run_test 48a "Access renamed working dir (should return errors)="
 
 test_48b() { # bug 2399
-       mkdir $DIR/d48b
+       check_kernel_version 34 || return 0
+       mkdir -p $DIR/d48b
        cd $DIR/d48b
        rmdir $DIR/d48b || error "remove cwd $DIR/d48b failed"
        touch foo && error "'touch foo' worked after removing cwd"
        mkdir foo && error "'mkdir foo' worked after removing cwd"
        ls . && error "'ls .' worked after removing cwd"
        ls .. || error "'ls ..' failed after removing cwd"
-       cd . && error "'cd .' worked after recreate cwd"
+       cd . && error "'cd .' worked after removing cwd"
        mkdir . && error "'mkdir .' worked after removing cwd"
        rmdir . && error "'rmdir .' worked after removing cwd"
        ln -s . foo && error "'ln -s .' worked after removing cwd" || true
+       #cd .. || error "'cd ..' failed after removing cwd"
 }
 run_test 48b "Access removed working dir (should return errors)="
 
+test_48c() { # bug 2350
+       check_kernel_version 36 || return 0
+       #sysctl -w portals.debug=-1
+       #set -vx
+       mkdir -p $DIR/d48c/dir
+       cd $DIR/d48c/dir
+       $TRACE rmdir $DIR/d48c/dir || error "remove cwd $DIR/d48c/dir failed"
+       $TRACE touch foo && error "'touch foo' worked after removing cwd"
+       $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
+       $TRACE ls . && error "'ls .' worked after removing cwd"
+       $TRACE ls .. || error "'ls ..' failed after removing cwd"
+       $TRACE cd . && error "'cd .' worked after recreate cwd"
+       $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
+       $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
+       $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd" ||true
+       $TRACE cd .. || echo "'cd ..' failed after removing cwd (`pwd)`"
+}
+run_test 48c "Access removed working subdir (should return errors)"
+
+test_48d() { # bug 2350
+       check_kernel_version 36 || return 0
+       #sysctl -w portals.debug=-1
+       #set -vx
+       mkdir -p $DIR/d48d/dir
+       cd $DIR/d48d/dir
+       pwd
+       ls .
+       $TRACE rm -vr $DIR/d48d || error "remove cwd+parent $DIR/d48d failed"
+       $TRACE touch foo && error "'touch foo' worked after removing cwd"
+       $TRACE mkdir foo && error "'mkdir foo' worked after removing cwd"
+       $TRACE ls . && error "'ls .' worked after removing cwd"
+       $TRACE ls .. && echo "'ls ..' worked after removing cwd" # bug 3415
+       $TRACE cd . && error "'cd .' worked after recreate cwd"
+       $TRACE mkdir . && error "'mkdir .' worked after removing cwd"
+       $TRACE rmdir . && error "'rmdir .' worked after removing cwd"
+       $TRACE ln -s . foo && error "'ln -s .' worked after removing cwd" ||true
+       $TRACE cd .. && error "'cd ..' worked after removing cwd" || true
+}
+run_test 48d "Access removed parent subdir (should return errors)"
+
 test_50() {
        # bug 1485
        mkdir $DIR/d50
@@ -1672,11 +1744,11 @@ run_test 54d "fifo device works in lustre ======================"
 test_55() {
         rm -rf $DIR/d55
         mkdir $DIR/d55
-        mount -t ext3 -o loop,iopen $EXT3_DEV $DIR/d55 || error
+        mount -t $FSTYPE -o loop,iopen $EXT2_DEV $DIR/d55 || error
         touch $DIR/d55/foo
         $IOPENTEST1 $DIR/d55/foo $DIR/d55 || error
         $IOPENTEST2 $DIR/d55 || error
-        echo "check for $EXT3_DEV. Please wait..."
+        echo "check for $EXT2_DEV. Please wait..."
         rm -rf $DIR/d55/*
         umount $DIR/d55 || error
 }
@@ -1832,7 +1904,7 @@ run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)"
 
 # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq.
 test_63() {
-       MAX_DIRTY_MB=`cat /proc/fs/lustre/osc/*/max_dirty_mb | head -1`
+       MAX_DIRTY_MB=`cat /proc/fs/lustre/osc/*/max_dirty_mb | head -1`
        for i in /proc/fs/lustre/osc/*/max_dirty_mb ; do
                echo 0 > $i
        done
@@ -1923,6 +1995,16 @@ test_66() {
 }
 run_test 66 "update inode blocks count on client ==============="
 
+test_67() { # bug 3285 - supplementary group fails on MDS, passes on client
+       [ "$RUNAS_ID" = "$UID" ] && echo "skipping test 67" && return
+       check_kernel_version 35 || return 0
+       mkdir $DIR/d67
+       chmod 771 $DIR/d67
+       chgrp $RUNAS_ID $DIR/d67
+       $RUNAS -g $((RUNAS_ID + 1)) -G1,2,$RUNAS_ID ls $DIR/d67 && error || true
+}
+run_test 67 "supplementary group failure (should return error) ="
+
 # on the LLNL clusters, runas will still pick up root's $TMP settings,
 # which will not be writable for the runas user, and then you get a CVS
 # error message with a corrupt path string (CVS bug) and panic.