Whamcloud - gitweb
LU-1715 ptlrpc: flock deadlock detection does not work
[fs/lustre-release.git] / lustre / tests / sanity.sh
index 2244d5a..5b5b0dd 100644 (file)
@@ -141,13 +141,13 @@ umask 077
 
 OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
 lctl set_param debug=-1 2> /dev/null || true
-test_0() {
+test_0a() {
        touch $DIR/$tfile
        $CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
        rm $DIR/$tfile
        $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
 }
-run_test 0 "touch .../$tfile ; rm .../$tfile ====================="
+run_test 0a "touch; rm ====================="
 
 test_0b() {
        chmod 0755 $DIR || error "chmod 0755 $DIR failed"
@@ -193,14 +193,6 @@ test_3() {
 }
 run_test 3 "mkdir; touch; rmdir; check dir ====================="
 
-test_4() {
-       test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
-       $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
-       test_mkdir $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed"
-       $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
-}
-run_test 4 "mkdir =============================================="
-
 test_5() {
        test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
        test_mkdir $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed"
@@ -215,20 +207,11 @@ test_6a() {
        chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
        $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
                error "$tfile does not have perm 0666 or UID $UID"
-}
-run_test 6a "touch .../f6a; chmod .../f6a ======================"
-
-test_6b() {
-       [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
-       if [ ! -f $DIR/$tfile ]; then
-               touch $DIR/$tfile
-               chmod 0666 $DIR/$tfile
-       fi
        $RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
        $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
                error "$tfile should be 0666 and owned by UID $UID"
 }
-run_test 6b "$RUNAS chmod .../f6a (should return error) =="
+run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
 
 test_6c() {
        [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
@@ -236,20 +219,11 @@ test_6c() {
        chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
        $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
                error "$tfile should be owned by UID $RUNAS_ID"
-}
-run_test 6c "touch .../f6c; chown .../f6c ======================"
-
-test_6d() {
-       [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
-       if [ ! -f $DIR/$tfile ]; then
-               touch $DIR/$tfile
-               chown $RUNAS_ID $DIR/$tfile
-       fi
        $RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
        $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
                error "$tfile should be owned by UID $RUNAS_ID"
 }
-run_test 6d "$RUNAS chown .../f6c (should return error) =="
+run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
 
 test_6e() {
        [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
@@ -257,20 +231,11 @@ test_6e() {
        chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
        $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
                error "$tfile should be owned by GID $UID"
-}
-run_test 6e "touch .../f6e; chgrp .../f6e ======================"
-
-test_6f() {
-       [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
-       if [ ! -f $DIR/$tfile ]; then
-               touch $DIR/$tfile
-               chgrp $RUNAS_ID $DIR/$tfile
-       fi
        $RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
        $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
                error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
 }
-run_test 6f "$RUNAS chgrp .../f6e (should return error) =="
+run_test 6e "touch f6e; chgrp f6e; $RUNAS chgrp f6e (should return error) =="
 
 test_6g() {
        [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
@@ -673,6 +638,9 @@ test_17n() {
 run_test 17n "run e2fsck against master/slave MDT which contains remote dir"
 
 test_17o() {
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.64) ]] &&
+               skip "Need MDS version at least 2.3.64" && return
+
        local WDIR=$DIR/${tdir}o
        local mdt_index
        local mdtdevname
@@ -1149,6 +1117,21 @@ test_24z() {
 }
 run_test 24z "rename one remote dir to another remote dir should fail"
 
+test_24A() { # LU-3182
+       local NFILES=5000
+
+       mkdir -p $DIR/$tdir
+       createmany -m $DIR/$tdir/$tfile $NFILES
+       local t=`ls $DIR/$tdir | wc -l`
+       local u=`ls $DIR/$tdir | sort -u | wc -l`
+       if [ $t -ne $NFILES -o $u -ne $NFILES ] ; then
+               error "Expected $NFILES files, got $t ($u unique)"
+       fi
+
+       rm -rf $DIR/$tdir || error "Can not delete directories"
+}
+run_test 24A "readdir() returns correct number of entries."
+
 test_25a() {
        echo '== symlink sanity ============================================='
 
@@ -1206,7 +1189,7 @@ test_26f() {
        test_mkdir -p $DIR/$tdir
        test_mkdir $DIR/$tdir/$tfile   || error "mkdir $DIR/$tdir/$tfile failed"
        cd $DIR/$tdir/$tfile           || error "cd $DIR/$tdir/$tfile failed"
-       test_mkdir -p lndir bar1      || error "mkdir lndir/bar1 failed"
+       test_mkdir -p lndir/bar1      || error "mkdir lndir/bar1 failed"
        test_mkdir $DIR/$tdir/$tfile/$tfile   || error "mkdir $tfile failed"
        cd $tfile                || error "cd $tfile failed"
        ln -s .. dotdot          || error "ln dotdot failed"
@@ -1238,15 +1221,10 @@ test_27b() {
        $GETSTRIPE -c $DIR/d27/f01
        [ $($GETSTRIPE -c $DIR/d27/f01) -eq 2 ] ||
                error "two-stripe file doesn't have two stripes"
-}
-run_test 27b "create two stripe file"
-
-test_27c() {
-       [ -f $DIR/d27/f01 ] || skip "test_27b not run" && return
 
        dd if=/dev/zero of=$DIR/d27/f01 bs=4k count=4 || error "dd failed"
 }
-run_test 27c "write to two stripe file"
+run_test 27b "create and write to two stripe file"
 
 test_27d() {
        test_mkdir -p $DIR/d27
@@ -2146,6 +2124,29 @@ test_31n() {
 }
 run_test 31n "check link count of unlinked file"
 
+link_one() {
+       local TEMPNAME=$(mktemp $1_XXXXXX)
+       mlink $TEMPNAME $1 2> /dev/null &&
+               echo "$BASHPID: link $TEMPNAME to $1 succeeded"
+       munlink $TEMPNAME
+}
+
+test_31o() { # LU-2901
+       mkdir -p $DIR/$tdir
+       for LOOP in $(seq 100); do
+               rm -f $DIR/$tdir/$tfile*
+               for THREAD in $(seq 8); do
+                       link_one $DIR/$tdir/$tfile.$LOOP &
+               done
+               wait
+               local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
+               [ $LINKS -gt 1 ] && ls $DIR/$tdir &&
+                       error "$LINKS duplicate links to $tfile.$LOOP" &&
+                       break || true
+       done
+}
+run_test 31o "duplicate hard links with same filename"
+
 cleanup_test32_mount() {
        trap 0
        $UMOUNT $DIR/$tdir/ext2-mountpoint
@@ -3349,13 +3350,13 @@ test_43a() {
        test_mkdir -p $DIR/$tdir
        cp -p `which $MULTIOP` $DIR/$tdir/multiop ||
                        cp -p multiop $DIR/$tdir/multiop
-        MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/test43.junk O_c ||
+       MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c ||
                        return 1
         MULTIOP_PID=$!
         $MULTIOP $DIR/$tdir/multiop Oc && error "expected error, got success"
         kill -USR1 $MULTIOP_PID || return 2
         wait $MULTIOP_PID || return 3
-        rm $TMP/test43.junk
+       rm $TMP/$tfile.junk $DIR/$tdir/multiop
 }
 run_test 43a "open(RDWR) of file being executed should return -ETXTBSY"
 
@@ -3364,13 +3365,13 @@ test_43b() {
        test_mkdir -p $DIR/$tdir
        cp -p `which $MULTIOP` $DIR/$tdir/multiop ||
                        cp -p multiop $DIR/$tdir/multiop
-        MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/test43.junk O_c ||
+       MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c ||
                        return 1
         MULTIOP_PID=$!
         $TRUNCATE $DIR/$tdir/multiop 0 && error "expected error, got success"
         kill -USR1 $MULTIOP_PID || return 2
         wait $MULTIOP_PID || return 3
-        rm $TMP/test43.junk
+       rm $TMP/$tfile.junk $DIR/$tdir/multiop
 }
 run_test 43b "truncate of file being executed should return -ETXTBSY"
 
@@ -3850,13 +3851,11 @@ test_53() {
 run_test 53 "verify that MDS and OSTs agree on pre-creation ===="
 
 test_54a() {
-       [ ! -f "$SOCKETSERVER" ] &&
-               skip_env "no socketserver, skipping" && return
-       [ ! -f "$SOCKETCLIENT" ] &&
-               skip_env "no socketclient, skipping" && return
-       $SOCKETSERVER $DIR/socket
-       $SOCKETCLIENT $DIR/socket || error "$SOCKETCLIENT $DIR/socket failed"
-       $MUNLINK $DIR/socket
+       $SOCKETSERVER $DIR/socket ||
+               error "$SOCKETSERVER $DIR/socket failed: $?"
+       $SOCKETCLIENT $DIR/socket ||
+               error "$SOCKETCLIENT $DIR/socket failed: $?"
+       $MUNLINK $DIR/socket || error "$MUNLINK $DIR/socket failed: $?"
 }
 run_test 54a "unix domain socket test =========================="
 
@@ -3928,8 +3927,7 @@ run_test 54e "console/tty device works in lustre ======================"
 test_56a() {   # was test_56
         rm -rf $DIR/$tdir
         $SETSTRIPE -d $DIR
-       test_mkdir $DIR/$tdir
-        test_mkdir $DIR/$tdir/dir
+        test_mkdir -p $DIR/$tdir/dir
         NUMFILES=3
         NUMFILESx2=$(($NUMFILES * 2))
         for i in `seq 1 $NUMFILES` ; do
@@ -4515,6 +4513,34 @@ test_56x() {
 }
 run_test 56x "lfs migration support"
 
+test_56y() {
+       local res=""
+
+       local dir0=$DIR/$tdir/$testnum
+       mkdir -p $dir0 || error "creating dir $dir0"
+       local f1=$dir0/file1
+       local f2=$dir0/file2
+
+       touch $f1 || error "creating std file $f1"
+       $MULTIOP $f2 H2c || error "creating released file $f2"
+
+       # a directory can be raid0, so ask only for files
+       res=$($LFIND $dir0 -L raid0 -type f | wc -l)
+       [[ $res == 2 ]] || error "search raid0: found $res files != 2"
+
+       res=$($LFIND $dir0 \! -L raid0 -type f | wc -l)
+       [[ $res == 0 ]] || error "search !raid0: found $res files != 0"
+
+       # only files can be released, so no need to force file search
+       res=$($LFIND $dir0 -L released)
+       [[ $res == $f2 ]] || error "search released: found $res != $f2"
+
+       res=$($LFIND $dir0 \! -L released)
+       [[ $res == $f1 ]] || error "search !released: found $res != $f1"
+
+}
+run_test 56y "lfs find -L raid0|released"
+
 test_57a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        # note test will not do anything if MDS is not local
@@ -4621,7 +4647,8 @@ TEST60_HEAD="test_60 run $RANDOM"
 test_60a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        remote_mgs_nodsh && skip "remote MGS with nodsh" && return
-        [ ! -f run-llog.sh ] && skip_env "missing subtest run-llog.sh" && return
+       do_facet mgs "! which run-llog.sh &> /dev/null" &&
+               skip_env "missing subtest run-llog.sh" && return
        log "$TEST60_HEAD - from kernel mode"
        do_facet mgs sh run-llog.sh
 }
@@ -4749,8 +4776,7 @@ run_test 64a "verify filter grant calculations (in kernel) ====="
 
 test_64b () {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-       [ ! -f oos.sh ] && skip_env "missing subtest oos.sh" && return
-       sh oos.sh $MOUNT
+       sh oos.sh $MOUNT || error "oos.sh failed: $?"
 }
 run_test 64b "check out-of-space detection on client ==========="
 
@@ -5287,68 +5313,55 @@ test_77a() { # bug 10889
        set_checksums 0
        rm -f $DIR/$tfile
 }
-run_test 77a "normal checksum read/write operation ============="
+run_test 77a "normal checksum read/write operation"
 
 test_77b() { # bug 10889
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        $GSS && skip "could not run with gss" && return
        [ ! -f $F77_TMP ] && setup_f77
        #define OBD_FAIL_OSC_CHECKSUM_SEND       0x409
-       lctl set_param fail_loc=0x80000409
+       $LCTL set_param fail_loc=0x80000409
        set_checksums 1
-       dd if=$F77_TMP of=$DIR/f77b bs=1M count=$F77SZ conv=sync || \
+
+       dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ conv=sync ||
                error "dd error: $?"
-       lctl set_param fail_loc=0
-       set_checksums 0
-}
-run_test 77b "checksum error on client write ===================="
+       $LCTL set_param fail_loc=0
 
-test_77c() { # bug 10889
-       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-       $GSS && skip "could not run with gss" && return
-       [ ! -f $DIR/f77b ] && skip "requires 77b - skipping" && return
-       set_checksums 1
        for algo in $CKSUM_TYPES; do
                cancel_lru_locks osc
                set_checksum_type $algo
                #define OBD_FAIL_OSC_CHECKSUM_RECEIVE    0x408
-               lctl set_param fail_loc=0x80000408
-               cmp $F77_TMP $DIR/f77b || error "file compare failed"
-               lctl set_param fail_loc=0
+               $LCTL set_param fail_loc=0x80000408
+               cmp $F77_TMP $DIR/$tfile || error "file compare failed"
+               $LCTL set_param fail_loc=0
        done
        set_checksums 0
        set_checksum_type $ORIG_CSUM_TYPE
-       rm -f $DIR/f77b
+       rm -f $DIR/$tfile
 }
-run_test 77c "checksum error on client read ==================="
+run_test 77b "checksum error on client write, read"
 
 test_77d() { # bug 10889
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        $GSS && skip "could not run with gss" && return
        #define OBD_FAIL_OSC_CHECKSUM_SEND       0x409
-       lctl set_param fail_loc=0x80000409
+       $LCTL set_param fail_loc=0x80000409
        set_checksums 1
-       directio write $DIR/f77 0 $F77SZ $((1024 * 1024)) || \
+       $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
                error "direct write: rc=$?"
-       lctl set_param fail_loc=0
+       $LCTL set_param fail_loc=0
        set_checksums 0
-}
-run_test 77d "checksum error on OST direct write ==============="
 
-test_77e() { # bug 10889
-       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-       $GSS && skip "could not run with gss" && return
-       [ ! -f $DIR/f77 ] && skip "requires 77d - skipping" && return
        #define OBD_FAIL_OSC_CHECKSUM_RECEIVE    0x408
-       lctl set_param fail_loc=0x80000408
+       $LCTL set_param fail_loc=0x80000408
        set_checksums 1
        cancel_lru_locks osc
-       directio read $DIR/f77 0 $F77SZ $((1024 * 1024)) || \
+       $DIRECTIO read $DIR/$tfile 0 $F77SZ $((1024 * 1024)) ||
                error "direct read: rc=$?"
-       lctl set_param fail_loc=0
+       $LCTL set_param fail_loc=0
        set_checksums 0
 }
-run_test 77e "checksum error on OST direct read ================"
+run_test 77d "checksum error on OST direct write, read"
 
 test_77f() { # bug 10889
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
@@ -5358,15 +5371,15 @@ test_77f() { # bug 10889
                cancel_lru_locks osc
                set_checksum_type $algo
                #define OBD_FAIL_OSC_CHECKSUM_SEND       0x409
-               lctl set_param fail_loc=0x409
-               directio write $DIR/f77 0 $F77SZ $((1024 * 1024)) && \
+               $LCTL set_param fail_loc=0x409
+               $DIRECTIO write $DIR/$tfile 0 $F77SZ $((1024 * 1024)) &&
                        error "direct write succeeded"
-               lctl set_param fail_loc=0
+               $LCTL set_param fail_loc=0
        done
        set_checksum_type $ORIG_CSUM_TYPE
        set_checksums 0
 }
-run_test 77f "repeat checksum error on write (expect error) ===="
+run_test 77f "repeat checksum error on write (expect error)"
 
 test_77g() { # bug 10889
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
@@ -5375,32 +5388,24 @@ test_77g() { # bug 10889
 
        [ ! -f $F77_TMP ] && setup_f77
 
-       $SETSTRIPE -c 1 -i 0 $DIR/f77g
+       $SETSTRIPE -c 1 -i 0 $DIR/$tfile
        #define OBD_FAIL_OST_CHECKSUM_RECEIVE       0x21a
        do_facet ost1 lctl set_param fail_loc=0x8000021a
        set_checksums 1
-       dd if=$F77_TMP of=$DIR/f77g bs=1M count=$F77SZ || \
+       dd if=$F77_TMP of=$DIR/$tfile bs=1M count=$F77SZ ||
                error "write error: rc=$?"
        do_facet ost1 lctl set_param fail_loc=0
        set_checksums 0
-}
-run_test 77g "checksum error on OST write ======================"
 
-test_77h() { # bug 10889
-       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-       $GSS && skip "could not run with gss" && return
-       remote_ost_nodsh && skip "remote OST with nodsh" && return
-
-       [ ! -f $DIR/f77g ] && skip "requires 77g - skipping" && return
        cancel_lru_locks osc
        #define OBD_FAIL_OST_CHECKSUM_SEND          0x21b
        do_facet ost1 lctl set_param fail_loc=0x8000021b
        set_checksums 1
-       cmp $F77_TMP $DIR/f77g || error "file compare failed"
+       cmp $F77_TMP $DIR/$tfile || error "file compare failed"
        do_facet ost1 lctl set_param fail_loc=0
        set_checksums 0
 }
-run_test 77h "checksum error on OST read ======================="
+run_test 77g "checksum error on OST write, read"
 
 test_77i() { # bug 13805
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
@@ -5416,7 +5421,7 @@ test_77i() { # bug 13805
        done
        remount_client $MOUNT
 }
-run_test 77i "client not supporting OSD_CONNECT_CKSUM =========="
+run_test 77i "client not supporting OSD_CONNECT_CKSUM"
 
 test_77j() { # bug 13805
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
@@ -5433,7 +5438,7 @@ test_77j() { # bug 13805
        done
        remount_client $MOUNT
 }
-run_test 77j "client only supporting ADLER32 ===================="
+run_test 77j "client only supporting ADLER32"
 
 [ "$ORIG_CSUM" ] && set_checksums $ORIG_CSUM || true
 rm -f $F77_TMP
@@ -7201,7 +7206,8 @@ test_120c() {
                skip "no early lock cancel on server" && return 0
         lru_resize_disable mdc
         lru_resize_disable osc
-        test_mkdir -p $DIR/$tdir/d1 $DIR/$tdir/d2
+       test_mkdir -p $DIR/$tdir/d1
+       test_mkdir -p $DIR/$tdir/d2
         touch $DIR/$tdir/d1/f1
         cancel_lru_locks mdc
         stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null
@@ -7274,7 +7280,8 @@ test_120f() {
         test_mkdir -p $DIR/$tdir
         lru_resize_disable mdc
         lru_resize_disable osc
-        test_mkdir -p $DIR/$tdir/d1 $DIR/$tdir/d2
+       test_mkdir -p $DIR/$tdir/d1
+       test_mkdir -p $DIR/$tdir/d2
         dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1
         dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1
         cancel_lru_locks mdc
@@ -7762,31 +7769,44 @@ test_129() {
        fi
        remote_mds_nodsh && skip "remote MDS with nodsh" && return
 
+       ENOSPC=28
        EFBIG=27
-       MAX=16384
 
-       set_dir_limits $MAX
        test_mkdir -p $DIR/$tdir
 
+       MAX=$(stat -c%s "$DIR/$tdir")
+       set_dir_limits $MAX
        local I=0
        local J=0
-       while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do
+       while [ ! $I -gt $MAX ]; do
                $MULTIOP $DIR/$tdir/$J Oc
                rc=$?
-               if [ $rc -eq $EFBIG ]; then
+               #check two errors ENOSPC for new version of ext4 max_dir_size patch
+               #mainline kernel commit df981d03eeff7971ac7e6ff37000bfa702327ef1
+               #and EFBIG for previous versions
+               if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ] && [ $I -gt 0 ]; then
                        set_dir_limits 0
                        echo "return code $rc received as expected"
-                       return 0
+                       multiop $DIR/$tdir/$J Oc
+                       rc=$?
+                       I=$(stat -c%s "$DIR/$tdir")
+                       if [ $I -gt $MAX ] && [ $rc -eq 0 ]; then
+                               return 0
+                       else
+                               error_exit "return code $rc current dir size $I " \
+                                          "previous limit $MAX"
+                       fi
                elif [ $rc -ne 0 ]; then
                        set_dir_limits 0
-                       error_exit "return code $rc received instead of expected $EFBIG"
+                       error_exit "return code $rc received instead of expected " \
+                                  "$EFBIG or $ENOSPC, files in dir $I"
                fi
                J=$((J+1))
                I=$(stat -c%s "$DIR/$tdir")
        done
 
        set_dir_limits 0
-       error "exceeded dir size limit $MAX x $MDSCOUNT $((MAX * MDSCOUNT)) : $I bytes"
+       error "exceeded dir size limit $MAX x $MDSCOUNT $MAX : $I bytes"
 }
 run_test 129 "test directory size limit ========================"
 
@@ -8796,20 +8816,23 @@ dot_lustre_fid_permission_check() {
        mrename $test_dir/$tdir $MOUNT/.lustre/fid &&
                error "rename to $MOUNT/.lustre/fid should fail."
 
-       local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
-       local new_obf_mode=777
+       if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.51) ]
+       then            # LU-3547
+               local old_obf_mode=$(stat --format="%a" $DIR/.lustre/fid)
+               local new_obf_mode=777
 
-       echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
-       chmod $new_obf_mode $DIR/.lustre/fid ||
-               error "chmod $new_obf_mode $DIR/.lustre/fid failed"
+               echo "change mode of $DIR/.lustre/fid to $new_obf_mode"
+               chmod $new_obf_mode $DIR/.lustre/fid ||
+                       error "chmod $new_obf_mode $DIR/.lustre/fid failed"
 
-       local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
-       [ $obf_mode -eq $new_obf_mode ] ||
-               error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
+               local obf_mode=$(stat --format=%a $DIR/.lustre/fid)
+               [ $obf_mode -eq $new_obf_mode ] ||
+                       error "stat $DIR/.lustre/fid returned wrong mode $obf_mode"
 
-       echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
-       chmod $old_obf_mode $DIR/.lustre/fid ||
-               error "chmod $old_obf_mode $DIR/.lustre/fid failed"
+               echo "restore mode of $DIR/.lustre/fid to $old_obf_mode"
+               chmod $old_obf_mode $DIR/.lustre/fid ||
+                       error "chmod $old_obf_mode $DIR/.lustre/fid failed"
+       fi
 
        $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2
        fid=$($LFS path2fid $test_dir/$tfile-2)
@@ -8827,6 +8850,24 @@ dot_lustre_fid_permission_check() {
        rm -rf $test_dir/$tfile-2
 }
 
+test_154A() {
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.1) ]] &&
+               skip "Need MDS version at least 2.4.1" && return
+
+       touch $DIR/$tfile
+       local FID=$($LFS path2fid $DIR/$tfile)
+       [ -z "$FID" ] && error "path2fid unable to get $DIR/$tfile FID"
+
+       # check that we get the same pathname back
+       local FOUND=$($LFS fid2path $MOUNT $FID)
+       [ -z "$FOUND" ] && error "fid2path unable to get $FID path"
+       [ "$FOUND" != "$DIR/$tfile" ] &&
+               error "fid2path(path2fid($DIR/$tfile)) = $FOUND != $DIR/$tfile"
+
+       rm -rf $DIR/$tfile
+}
+run_test 154A "lfs path2fid and fid2path basic checks"
+
 test_154a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.51) ]] ||
@@ -8880,6 +8921,33 @@ test_154b() {
 }
 run_test 154b "Open-by-FID for remote directory"
 
+test_154c() {
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.1) ]] &&
+               skip "Need MDS version at least 2.4.1" && return
+
+       touch $DIR/$tfile.1 $DIR/$tfile.2 $DIR/$tfile.3
+       local FID1=$($LFS path2fid $DIR/$tfile.1)
+       local FID2=$($LFS path2fid $DIR/$tfile.2)
+       local FID3=$($LFS path2fid $DIR/$tfile.3)
+
+       local N=1
+       $LFS path2fid $DIR/$tfile.[123] | while read PATHNAME FID; do
+               [ "$PATHNAME" = "$DIR/$tfile.$N:" ] ||
+                       error "path2fid pathname $PATHNAME != $DIR/$tfile.$N:"
+               local want=FID$N
+               [ "$FID" = "${!want}" ] ||
+                       error "path2fid $PATHNAME FID $FID != FID$N ${!want}"
+               N=$((N + 1))
+       done
+
+       $LFS fid2path $MOUNT $FID1 $FID2 $FID3 | while read PATHNAME; do
+               [ "$PATHNAME" = "$DIR/$tfile.$N" ] ||
+                       error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:"
+               N=$((N + 1))
+       done
+}
+run_test 154c "lfs path2fid and fid2path multiple arguments"
+
 test_155_small_load() {
     local temp=$TMP/$tfile
     local file=$DIR/$tfile
@@ -9145,113 +9213,132 @@ run_test 156 "Verification of tunables ============================"
 
 #Changelogs
 err17935 () {
-    if [ $MDSCOUNT -gt 1 ]; then
-       error_ignore 17935 $*
-    else
-       error $*
-    fi
+       if [ $MDSCOUNT -gt 1 ]; then
+               error_ignore 17935 $*
+       else
+               error $*
+       fi
 }
 
 changelog_chmask()
 {
-    MASK=$(do_facet $SINGLEMDS $LCTL get_param mdd.$MDT0.changelog_mask |\
-           grep -c $1)
+       local CL_MASK_PARAM="mdd.$MDT0.changelog_mask"
 
-    if [ $MASK -eq 1 ]; then
-        do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_mask="-$1"
-    else
-        do_facet $SINGLEMDS $LCTL set_param mdd.$MDT0.changelog_mask="+$1"
-    fi
+       MASK=$(do_facet $SINGLEMDS $LCTL get_param $CL_MASK_PARAM| grep -c "$1")
+
+       if [ $MASK -eq 1 ]; then
+               do_facet $SINGLEMDS $LCTL set_param $CL_MASK_PARAM="-$1"
+       else
+               do_facet $SINGLEMDS $LCTL set_param $CL_MASK_PARAM="+$1"
+       fi
+}
+
+changelog_extract_field() {
+       local mdt=$1
+       local cltype=$2
+       local file=$3
+       local identifier=$4
+
+       $LFS changelog $mdt | gawk "/$cltype.*$file$/ {
+               print gensub(/^.* "$identifier'(\[[^\]]*\]).*$/,"\\1",1)}' |
+               tail -1
 }
 
 test_160() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-    remote_mds_nodsh && skip "remote MDS with nodsh" && return
-    [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] ||
-        { skip "Need MDS version at least 2.2.0"; return; }
-    USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_register -n)
-    echo "Registered as changelog user $USER"
-    do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_users | \
-       grep -q $USER || error "User $USER not found in changelog_users"
-
-    # change something
-    test_mkdir -p $DIR/$tdir/pics/2008/zachy
-    touch $DIR/$tdir/pics/2008/zachy/timestamp
-    cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
-    mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
-    ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
-    ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
-    rm $DIR/$tdir/pics/desktop.jpg
-
-    $LFS changelog $MDT0 | tail -5
-
-    echo "verifying changelog mask"
-    changelog_chmask "MKDIR"
-    changelog_chmask "CLOSE"
-
-    test_mkdir -p $DIR/$tdir/pics/zach/sofia
-    echo "zzzzzz" > $DIR/$tdir/pics/zach/file
-
-    changelog_chmask "MKDIR"
-    changelog_chmask "CLOSE"
-
-    test_mkdir -p $DIR/$tdir/pics/2008/sofia
-    echo "zzzzzz" > $DIR/$tdir/pics/zach/file
-
-    $LFS changelog $MDT0
-    MKDIRS=$($LFS changelog $MDT0 | tail -5 | grep -c "MKDIR")
-    CLOSES=$($LFS changelog $MDT0 | tail -5 | grep -c "CLOSE")
-    [ $MKDIRS -eq 1 ] || err17935 "MKDIR changelog mask count $DIRS != 1"
-    [ $CLOSES -eq 1 ] || err17935 "CLOSE changelog mask count $DIRS != 1"
-
-    # verify contents
-    echo "verifying target fid"
-    fidc=$($LFS changelog $MDT0 | grep timestamp | grep "CREAT" | \
-       tail -1 | awk '{print $6}')
-    fidf=$($LFS path2fid $DIR/$tdir/pics/zach/timestamp)
-    [ "$fidc" == "t=$fidf" ] || \
-       err17935 "fid in changelog $fidc != file fid $fidf"
-    echo "verifying parent fid"
-    fidc=$($LFS changelog $MDT0 | grep timestamp | grep "CREAT" | \
-       tail -1 | awk '{print $7}')
-    fidf=$($LFS path2fid $DIR/$tdir/pics/zach)
-    [ "$fidc" == "p=$fidf" ] || \
-       err17935 "pfid in changelog $fidc != dir fid $fidf"
-
-    USER_REC1=$(do_facet $SINGLEMDS $LCTL get_param -n \
-       mdd.$MDT0.changelog_users | grep $USER | awk '{print $2}')
-    $LFS changelog_clear $MDT0 $USER $(($USER_REC1 + 5))
-    USER_REC2=$(do_facet $SINGLEMDS $LCTL get_param -n \
-       mdd.$MDT0.changelog_users | grep $USER | awk '{print $2}')
-    echo "verifying user clear: $(( $USER_REC1 + 5 )) == $USER_REC2"
-    [ $USER_REC2 == $(($USER_REC1 + 5)) ] || \
-       err17935 "user index should be $(($USER_REC1 + 5)); is $USER_REC2"
-
-    MIN_REC=$(do_facet $SINGLEMDS $LCTL get_param mdd.$MDT0.changelog_users | \
-       awk 'min == "" || $2 < min {min = $2}; END {print min}')
-    FIRST_REC=$($LFS changelog $MDT0 | head -1 | awk '{print $1}')
-    echo "verifying min purge: $(( $MIN_REC + 1 )) == $FIRST_REC"
-    [ $FIRST_REC == $(($MIN_REC + 1)) ] || \
-       err17935 "first index should be $(($MIN_REC + 1)); is $FIRST_REC"
-
-    echo "verifying user deregister"
-    do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
-    do_facet $SINGLEMDS $LCTL get_param -n mdd.$MDT0.changelog_users | \
-       grep -q $USER && error "User $USER still found in changelog_users"
-
-    USERS=$(( $(do_facet $SINGLEMDS $LCTL get_param -n \
-       mdd.$MDT0.changelog_users | wc -l) - 2 ))
-    if [ $USERS -eq 0 ]; then
-       LAST_REC1=$(do_facet $SINGLEMDS $LCTL get_param -n \
-           mdd.$MDT0.changelog_users | head -1 | awk '{print $3}')
-       touch $DIR/$tdir/chloe
-       LAST_REC2=$(do_facet $SINGLEMDS $LCTL get_param -n \
-           mdd.$MDT0.changelog_users | head -1 | awk '{print $3}')
-       echo "verify changelogs are off if we were the only user: $LAST_REC1 == $LAST_REC2"
-       [ $LAST_REC1 == $LAST_REC2 ] || error "changelogs not off"
-    else
-       echo "$USERS other changelog users; can't verify off"
-    fi
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+       [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] ||
+               { skip "Need MDS version at least 2.2.0"; return; }
+
+       local CL_USERS="mdd.$MDT0.changelog_users"
+       local GET_CL_USERS="do_facet $SINGLEMDS $LCTL get_param -n $CL_USERS"
+       USER=$(do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_register -n)
+       echo "Registered as changelog user $USER"
+       $GET_CL_USERS | grep -q $USER ||
+               error "User $USER not found in changelog_users"
+
+       # change something
+       test_mkdir -p $DIR/$tdir/pics/2008/zachy
+       touch $DIR/$tdir/pics/2008/zachy/timestamp
+       cp /etc/hosts $DIR/$tdir/pics/2008/zachy/pic1.jpg
+       mv $DIR/$tdir/pics/2008/zachy $DIR/$tdir/pics/zach
+       ln $DIR/$tdir/pics/zach/pic1.jpg $DIR/$tdir/pics/2008/portland.jpg
+       ln -s $DIR/$tdir/pics/2008/portland.jpg $DIR/$tdir/pics/desktop.jpg
+       rm $DIR/$tdir/pics/desktop.jpg
+
+       $LFS changelog $MDT0 | tail -5
+
+       echo "verifying changelog mask"
+       changelog_chmask "MKDIR"
+       changelog_chmask "CLOSE"
+
+       test_mkdir -p $DIR/$tdir/pics/zach/sofia
+       echo "zzzzzz" > $DIR/$tdir/pics/zach/file
+
+       changelog_chmask "MKDIR"
+       changelog_chmask "CLOSE"
+
+       test_mkdir -p $DIR/$tdir/pics/2008/sofia
+       echo "zzzzzz" > $DIR/$tdir/pics/zach/file
+
+       $LFS changelog $MDT0
+       MKDIRS=$($LFS changelog $MDT0 | tail -5 | grep -c "MKDIR")
+       CLOSES=$($LFS changelog $MDT0 | tail -5 | grep -c "CLOSE")
+       [ $MKDIRS -eq 1 ] || err17935 "MKDIR changelog mask count $DIRS != 1"
+       [ $CLOSES -eq 1 ] || err17935 "CLOSE changelog mask count $DIRS != 1"
+
+       # verify contents
+       echo "verifying target fid"
+       fidc=$(changelog_extract_field $MDT0 "CREAT" "timestamp" "t=")
+       fidf=$($LFS path2fid $DIR/$tdir/pics/zach/timestamp)
+       [ "$fidc" == "$fidf" ] ||
+               err17935 "fid in changelog $fidc != file fid $fidf"
+       echo "verifying parent fid"
+       fidc=$(changelog_extract_field $MDT0 "CREAT" "timestamp" "p=")
+       fidf=$($LFS path2fid $DIR/$tdir/pics/zach)
+       [ "$fidc" == "$fidf" ] ||
+               err17935 "pfid in changelog $fidc != dir fid $fidf"
+
+       USER_REC1=$($GET_CL_USERS | awk "\$1 == \"$USER\" {print \$2}")
+       $LFS changelog_clear $MDT0 $USER $(($USER_REC1 + 5))
+       USER_REC2=$($GET_CL_USERS | awk "\$1 == \"$USER\" {print \$2}")
+       echo "verifying user clear: $(( $USER_REC1 + 5 )) == $USER_REC2"
+       [ $USER_REC2 == $(($USER_REC1 + 5)) ] ||
+               err17935 "user index expected $(($USER_REC1 + 5)) is $USER_REC2"
+
+       MIN_REC=$($GET_CL_USERS |
+               awk 'min == "" || $2 < min {min = $2}; END {print min}')
+       FIRST_REC=$($LFS changelog $MDT0 | head -1 | awk '{print $1}')
+       echo "verifying min purge: $(( $MIN_REC + 1 )) == $FIRST_REC"
+       [ $FIRST_REC == $(($MIN_REC + 1)) ] ||
+               err17935 "first index should be $(($MIN_REC + 1)) is $FIRST_REC"
+
+       # LU-3446 changelog index reset on MDT restart
+       local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/})
+       CUR_REC1=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+       $LFS changelog_clear $MDT0 $USER 0
+       stop $SINGLEMDS || error "Fail to stop MDT."
+       start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || error "Fail to start MDT."
+       CUR_REC2=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+       echo "verifying index survives MDT restart: $CUR_REC1 == $CUR_REC2"
+       [ $CUR_REC1 == $CUR_REC2 ] ||
+               err17935 "current index should be $CUR_REC1 is $CUR_REC2"
+
+       echo "verifying user deregister"
+       do_facet $SINGLEMDS $LCTL --device $MDT0 changelog_deregister $USER
+       $GET_CL_USERS | grep -q $USER &&
+               error "User $USER still in changelog_users"
+
+       USERS=$(( $($GET_CL_USERS | wc -l) - 2 ))
+       if [ $USERS -eq 0 ]; then
+               LAST_REC1=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+               touch $DIR/$tdir/chloe
+               LAST_REC2=$($GET_CL_USERS | head -1 | cut -f3 -d' ')
+               echo "verify changelogs are off: $LAST_REC1 == $LAST_REC2"
+               [ $LAST_REC1 == $LAST_REC2 ] || error "changelogs not off"
+       else
+               echo "$USERS other changelog users; can't verify off"
+       fi
 }
 run_test 160 "changelog sanity"
 
@@ -9411,20 +9498,6 @@ test_162() {
 }
 run_test 162 "path lookup sanity"
 
-test_163() {
-       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
-       remote_mds_nodsh && skip "remote MDS with nodsh" && return
-       copytool --test $FSNAME || { skip "copytool not runnable: $?" && return; }
-       copytool $FSNAME &
-       sleep 1
-       local uuid=$($LCTL get_param -n mdc.${FSNAME}-MDT0000-mdc-*.uuid)
-       # this proc file is temporary and linux-only
-       do_facet $SINGLEMDS lctl set_param mdt.${FSNAME}-MDT0000.mdccomm=$uuid ||\
-         error "kernel->userspace send failed"
-       kill -INT $!
-}
-run_test 163 "kernel <-> userspace comms"
-
 test_169() {
        # do directio so as not to populate the page cache
        log "creating a 10 Mb file"
@@ -9541,6 +9614,7 @@ cleanup_obdecho_osc () {
 obdecho_test() {
         local OBD=$1
         local node=$2
+       local pages=${3:-64}
         local rc=0
         local id
         do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
@@ -9553,8 +9627,8 @@ obdecho_test() {
         echo "New object id is $id"
        [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
                           rc=4; }
-       [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec test_brw 10 w v 64 $id" ||
-                          rc=4; }
+       [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec "                 \
+                          "test_brw 10 w v $pages $id" || rc=4; }
        [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
                           rc=4; }
        [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec "    \
@@ -9607,6 +9681,32 @@ test_180b() {
 }
 run_test 180b "test obdecho directly on obdfilter"
 
+test_180c() { # LU-2598
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.0) ]] &&
+               skip "Need MDS version at least 2.4.0" && return
+
+       local rc=0
+       local rmmod_remote=false
+       local pages=16384 # 64MB bulk I/O RPC size
+       local target
+
+       do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
+               rmmod_remote=true || error "failed to load module obdecho"
+
+       target=$(do_facet ost1 $LCTL dl | awk '/obdfilter/ {print $4}'|head -1)
+       if [[ -n $target ]]; then
+               obdecho_test "$target" ost1 "$pages" ||
+                       rc=${PIPESTATUS[0]}
+       else
+               echo "there is no obdfilter target on ost1"
+               rc=2
+       fi
+       $rmmod_remote && do_facet ost1 "rmmod obdecho" || true
+       return $rc
+}
+run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
+
 test_181() { # bug 22177
        test_mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
        # create enough files to index the directory
@@ -9654,6 +9754,9 @@ test_182() {
 run_test 182 "Disable MDC RPCs semaphore wouldn't crash client ================"
 
 test_183() { # LU-2275
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.56) ]] &&
+               skip "Need MDS version at least 2.3.56" && return
+
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
        echo aaa > $DIR/$tdir/$tfile
@@ -9813,6 +9916,10 @@ run_test 184d "allow stripeless layouts swap"
 
 
 test_185() { # LU-2441
+       # LU-3553 - no volatile file support in old servers
+       [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.60) ]] ||
+               { skip "Need MDS version at least 2.3.60"; return 0; }
+
        mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
        touch $DIR/$tdir/spoo
        local mtime1=$(stat -c "%Y" $DIR/$tdir)
@@ -9842,6 +9949,37 @@ test_185() { # LU-2441
 }
 run_test 185 "Volatile file support"
 
+test_187a() {
+       local dir0=$DIR/$tdir/$testnum
+       mkdir -p $dir0 || error "creating dir $dir0"
+
+       local file=$dir0/file1
+       dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
+       local dv1=$($LFS data_version $file)
+       dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
+       local dv2=$($LFS data_version $file)
+       [[ $dv1 != $dv2 ]] ||
+               error "data version did not change on write $dv1 == $dv2"
+
+       # clean up
+       rm -f $file1
+}
+run_test 187a "Test data version change"
+
+test_187b() {
+       local dir0=$DIR/$tdir/$testnum
+       mkdir -p $dir0 || error "creating dir $dir0"
+
+       declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
+       [[ ${DV[0]} != ${DV[1]} ]] ||
+               error "data version did not change on write"\
+                     " ${DV[0]} == ${DV[1]}"
+
+       # clean up
+       rm -f $file1
+}
+run_test 187b "Test data version change on volatile file"
+
 # OST pools tests
 check_file_in_pool()
 {
@@ -10403,6 +10541,57 @@ test_207b() {
 }
 run_test 207b "can refresh layout at open"
 
+test_208() {
+       # FIXME: in this test suite, only RD lease is used. This is okay
+       # for now as only exclusive open is supported. After generic lease
+       # is done, this test suite should be revised. - Jinshan
+
+       [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.4.52) ]] ||
+               { skip "Need MDS version at least 2.4.52"; return 0; }
+
+       echo "==== test 1: verify get lease work"
+       $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error"
+
+       echo "==== test 2: verify lease can be broken by upcoming open"
+       $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
+       local PID=$!
+       sleep 1
+
+       $MULTIOP $DIR/$tfile oO_RDONLY:c
+       kill -USR1 $PID && wait $PID || error "break lease error"
+
+       echo "==== test 3: verify lease can't be granted if an open already exists"
+       $MULTIOP $DIR/$tfile oO_RDONLY:_c &
+       local PID=$!
+       sleep 1
+
+       $MULTIOP $DIR/$tfile oO_RDONLY:eReUc && error "apply lease should fail"
+       kill -USR1 $PID && wait $PID || error "open file error"
+
+       echo "==== test 4: lease can sustain over recovery"
+       $MULTIOP $DIR/$tfile oO_RDONLY:eR_E+eUc &
+       PID=$!
+       sleep 1
+
+       fail mds1
+
+       kill -USR1 $PID && wait $PID || error "lease broken over recovery"
+
+       echo "==== test 5: lease broken can't be regained by replay"
+       $MULTIOP $DIR/$tfile oO_RDONLY:eR_E-eUc &
+       PID=$!
+       sleep 1
+
+       # open file to break lease and then recovery
+       $MULTIOP $DIR/$tfile oO_RDWR:c || error "open file error"
+       fail mds1
+
+       kill -USR1 $PID && wait $PID || error "lease not broken over recovery"
+
+       rm -f $DIR/$tfile
+}
+run_test 208 "Exclusive open"
+
 test_212() {
        size=`date +%s`
        size=$((size % 8192 + 1))
@@ -10503,12 +10692,13 @@ test_215() { # for bugs 18102, 21079, 21517
 
        # /proc/sys/lnet/routes should look like this:
        # Routing disabled/enabled
-       # net hops state router
-       # where net is a string like tcp0, hops >= 0, state is up/down,
+       # net hops priority state router
+       # where net is a string like tcp0, hops > 0, priority >= 0,
+       # state is up/down,
        # router is a string like 192.168.1.1@tcp2
        L1="^Routing (disabled|enabled)$"
-       L2="^net +hops +state +router$"
-       BR="^$NET +$N +(up|down) +$NID$"
+       L2="^net +hops +priority +state +router$"
+       BR="^$NET +$N +(0|1) +(up|down) +$NID$"
        create_lnet_proc_files "routes"
        check_lnet_proc_entry "routes.out" "/proc/sys/lnet/routes" "$BR" "$L1" "$L2"
        check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2"
@@ -11071,6 +11261,49 @@ test_228c() {
 }
 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
 
+test_229() { # LU-2482, LU-3448
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+
+       rm -f $DIR/$tfile
+
+       # Create a file with a released layout and stripe count 2.
+       $MULTIOP $DIR/$tfile H2c ||
+               error "failed to create file with released layout"
+
+       $GETSTRIPE -v $DIR/$tfile
+
+       local pattern=$($GETSTRIPE -L $DIR/$tfile)
+       [ X"$pattern" = X"80000001" ] || error "pattern error ($pattern)"
+
+       local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
+       [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
+       stat $DIR/$tfile || error "failed to stat released file"
+
+       $TRUNCATE $DIR/$tfile 200000 &&
+               error "truncate of released file should fail"
+
+       # Ensure that nothing happened anyway.
+       $CHECKSTAT -s 0 $DIR/$tfile ||
+               error "released file size should not change"
+
+       # Stripe count should be no change after truncate
+       stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe failed"
+       [ $stripe_count -eq 2 ] || error "after trunc: ($stripe_count)"
+
+       chown $RUNAS_ID $DIR/$tfile ||
+               error "chown $RUNAS_ID $DIR/$tfile failed"
+
+       chgrp $RUNAS_ID $DIR/$tfile ||
+               error "chgrp $RUNAS_ID $DIR/$tfile failed"
+
+       touch $DIR/$tfile ||
+               error "touch $DIR/$tfile failed"
+
+       rm $DIR/$tfile || error "failed to remove released file"
+}
+run_test 229 "getstripe/stat/rm/attr changes work on released files"
+
 test_230a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return
@@ -11204,6 +11437,45 @@ test_233() {
 }
 run_test 233 "checking that OBF of the FS root succeeds"
 
+test_234() {
+       local p="$TMP/sanityN-$TESTNAME.parameters"
+       save_lustre_params client "llite.*.xattr_cache" > $p
+       lctl set_param llite.*.xattr_cache 1 ||
+               { skip "xattr cache is not supported"; return 0; }
+
+       mkdir -p $DIR/$tdir || error "mkdir failed"
+       touch $DIR/$tdir/$tfile || error "touch failed"
+       # OBD_FAIL_LLITE_XATTR_ENOMEM
+       $LCTL set_param fail_loc=0x1405
+       setfattr -n user.attr -v value $DIR/$tdir/$tfile &&
+               error "setfattr should have failed with ENOMEM"
+       # attr pre-2.4.44-7 had a bug with rc
+       getfattr -n user.attr $DIR/$tdir/$tfile &&
+               error "getfattr should have failed with ENOMEM"
+       $LCTL set_param fail_loc=0x0
+       rm -rf $DIR/$tdir
+
+       restore_lustre_params < $p
+       rm -f $p
+}
+run_test 234 "xattr cache should not crash on ENOMEM"
+
+test_235() {
+        [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.52) ] &&
+               skip "Need MDS version at least 2.4.52" && return
+       flock_deadlock $DIR/$tfile
+       local RC=$?
+       case $RC in
+               0)
+               ;;
+               124) error "process hangs on a deadlock"
+               ;;
+               *) error "error executing flock_deadlock $DIR/$tfile"
+               ;;
+       esac
+}
+run_test 235 "LU-1715: flock deadlock detection does not work properly"
+
 #
 # tests that do cleanup/setup should be run at the end
 #