Whamcloud - gitweb
LU-10698 obdclass: allow specifying complex jobids
[fs/lustre-release.git] / lustre / tests / sanity.sh
index 715a35f..c42f169 100755 (executable)
@@ -12,8 +12,8 @@ ONLY=${ONLY:-"$*"}
 ALWAYS_EXCEPT="$SANITY_EXCEPT  42a     42b     42c"
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
 
-# skipped tests: LU-8411 LU-9096 LU-9054
-ALWAYS_EXCEPT="  407     253     312     $ALWAYS_EXCEPT"
+# skipped tests: LU-8411 LU-9096 LU-9054 LU-10680 ..
+ALWAYS_EXCEPT="  407     253     312     160f  160g    $ALWAYS_EXCEPT"
 
 # Check Grants after these tests
 GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c"
@@ -40,7 +40,7 @@ SOCKETCLIENT=${SOCKETCLIENT:-socketclient}
 MEMHOG=${MEMHOG:-memhog}
 DIRECTIO=${DIRECTIO:-directio}
 ACCEPTOR_PORT=${ACCEPTOR_PORT:-988}
-STRIPES_PER_OBJ=-1
+DEF_STRIPE_COUNT=-1
 CHECK_GRANT=${CHECK_GRANT:-"yes"}
 GRANT_CHECK_LIST=${GRANT_CHECK_LIST:-""}
 export PARALLEL=${PARALLEL:-"no"}
@@ -69,11 +69,10 @@ if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then
        [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b"
 fi
 
-# Get the SLES version so we can make decisions on if a test should be run
+# Get the SLES distro version
 #
 # Returns a version string that should only be used in comparing
 # strings returned by version_code()
-
 sles_version_code()
 {
        local version=$(grep VERSION_ID /etc/os-release | cut -d'"' -f2)
@@ -83,6 +82,8 @@ sles_version_code()
        version_code $sles_version
 }
 
+# Check if we are running on Ubuntu or SLES so we can make decisions on
+# what tests to run
 if [ -r /etc/SuSE-release ]; then
        sles_version=$(sles_version_code)
        [ $sles_version -lt $(version_code 11.4.0) ] &&
@@ -91,6 +92,21 @@ if [ -r /etc/SuSE-release ]; then
        [ $sles_version -lt $(version_code 12.0.0) ] &&
                # bug number for skipped test: LU-3703
                ALWAYS_EXCEPT="$ALWAYS_EXCEPT  234"
+elif [ -r /etc/os-release ]; then
+       if grep -qi ubuntu /etc/os-release; then
+               ubuntu_version=$(version_code $(sed -n -e 's/"//g' \
+                                               -e 's/^VERSION=//p' \
+                                               /etc/os-release |
+                                               awk '{ print $1 }'))
+
+               if [[ $ubuntu_version -gt $(version_code 16.0.0) ]]; then
+                       # bug number for skipped test:
+                       #                LU-10334 LU-10335 LU-10335 LU-10335
+                       ALWAYS_EXCEPT+=" 103a     130a     130b     130c"
+                       #                LU-10335 LU-10335 LU-10365 LU-10366
+                       ALWAYS_EXCEPT+=" 130d     130e     400a     410"
+               fi
+       fi
 fi
 
 FAIL_ON_ERROR=false
@@ -652,6 +668,7 @@ test_17m() {
        df $MOUNT > /dev/null 2>&1
        [ $rc -eq 0 ] ||
                error "e2fsck detected error for short/long symlink: rc=$rc"
+       rm -f $wdir/*
 }
 run_test 17m "run e2fsck against MDT which contains short/long symlink"
 
@@ -2047,7 +2064,8 @@ test_27A() { # b=19102
                 error "stripe count $($GETSTRIPE -c $MOUNT) != 1"
         local default_size=$($GETSTRIPE -S $MOUNT)
         local default_offset=$($GETSTRIPE -i $MOUNT)
-        local dsize=$((1024 * 1024))
+       local dsize=$(do_facet $SINGLEMDS \
+               "$LCTL get_param -n lod.$(facet_svc $SINGLEMDS)*.stripesize")
         [ $default_size -eq $dsize ] ||
                 error "stripe size $default_size != $dsize"
         [ $default_offset -eq -1 ] ||error "stripe offset $default_offset != -1"
@@ -2183,6 +2201,7 @@ test_27E() {
 run_test 27E "check that default extended attribute size properly increases"
 
 test_27F() { # LU-5346/LU-7975
+       [[ $OSTCOUNT -lt 2 ]] && skip "needs >= 2 OSTs" && return
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.51) ]] &&
                skip "Need MDS version at least 2.8.51" && return
@@ -4660,9 +4679,14 @@ test_56a() {
        local ostidx=1
        local obduuid=$(ostuuid_from_index $ostidx)
        local found=$($LFS getstripe -r --obd $obduuid $dir |
-                     egrep -c "obdidx|l_ost_idx")
+               grep 'lmm_stripe_offset:' | grep -c " $ostidx\$")
+
+       filenum=$($LFS getstripe -ir $dir | grep -c "^$ostidx\$")
+       [[ $($LFS getstripe -id $dir) -ne $ostidx ]] ||
+               ((filenum--))
+       [[ $($LFS getstripe -id $dir/dir) -ne $ostidx ]] ||
+               ((filenum--))
 
-       filenum=$($LFS getstripe -ir $dir | grep "^$ostidx\$" | wc -l)
        [[ $found -eq $filenum ]] ||
                error "$LFS getstripe --obd: found $found expect $filenum"
        [[ $($LFS getstripe -r -v --obd $obduuid $dir |
@@ -4696,6 +4720,8 @@ test_56b() {
 run_test 56b "check $LFS getdirstripe"
 
 test_56c() {
+       remote_ost_nodsh && skip "remote OST with nodsh" && return
+
        local ost_idx=0
        local ost_name=$(ostname_from_index $ost_idx)
        local old_status=$(ost_dev_status $ost_idx)
@@ -5056,11 +5082,11 @@ test_56t() { # LU-611 #LU-9369
 
        setup_56 $dir 0 $NUMDIRS
        for i in $(seq $NUMDIRS); do
-               $LFS setstripe -S 4M $dir/dir$i/$tfile
+               $LFS setstripe -S 8M $dir/dir$i/$tfile
        done
 
        local expected=$NUMDIRS
-       local cmd="$LFS find -S 4M $dir"
+       local cmd="$LFS find -S 8M $dir"
        local nums=$($cmd | wc -l)
 
        [ $nums -eq $expected ] || {
@@ -5372,6 +5398,7 @@ test_56wc() {
 
        echo -n "Creating test dir..."
        test_mkdir $DIR/$tdir &> /dev/null || error "cannot create dir"
+       local def_stripe_size=$($LFS getstripe -S $DIR/$tdir 2>/dev/null)
        $LFS setstripe -S 1M -c 1 "$DIR/$tdir" &> /dev/null ||
                error "cannot set stripe"
        echo "done"
@@ -5436,7 +5463,7 @@ test_56wc() {
        echo -n "Verifying restripe option uses parent stripe settings..."
        $LFS_MIGRATE -y -R "$file1" &> /dev/null ||
                error "migrate failed"
-       [ $($LFS getstripe -S "$file1") -eq 1048576 ] ||
+       [ $($LFS getstripe -S "$file1") -eq $def_stripe_size ] ||
                error "file not restriped to parent settings"
        [ $($LFS getstripe -c "$file1") -eq 1 ] ||
                error "file not restriped to parent settings"
@@ -5447,11 +5474,12 @@ test_56wc() {
        # Ensure striping is preserved if -R is not set, and no stripe
        # count or size is specified
        echo -n "Verifying striping size preserved when not specified..."
+       local orig_stripe_size=$($LFS getstripe -S "$file1" 2>/dev/null)
        $LFS setstripe -S 2M -c 1 "$DIR/$tdir" &> /dev/null ||
                error "cannot set stripe on parent directory"
        $LFS_MIGRATE -y "$file1" &> /dev/null ||
                error "migrate failed"
-       [ $($LFS getstripe -S "$file1") -eq 1048576 ] ||
+       [ $($LFS getstripe -S "$file1") -eq $orig_stripe_size ] ||
                error "file was restriped"
        echo "done."
 
@@ -5727,19 +5755,42 @@ test_56aa() { # LU-5937
        $LFS setdirstripe -c$MDSCOUNT $dir/striped_dir
 
        createmany -o $dir/striped_dir/${tfile}- 1024
-       local dirs=$(lfs find --size +8k $dir/)
+       local dirs=$($LFS find --size +8k $dir/)
 
        [ -n "$dirs" ] || error "lfs find --size wrong under striped dir"
 }
 run_test 56aa "lfs find --size under striped dir"
 
+test_56ab() { # LU-10705
+       test_mkdir $DIR/$tdir
+       dd if=/dev/zero of=$DIR/$tdir/$tfile.1 bs=8k count=1 seek=2k
+       dd if=/dev/zero of=$DIR/$tdir/$tfile.2 bs=4k count=1 seek=4k
+       dd if=/dev/zero of=$DIR/$tdir/$tfile.3 bs=1M count=2 seek=16
+       # Flush writes to ensure valid blocks.  Need to be more thorough for
+       # ZFS, since blocks are not allocated/returned to client immediately.
+       sync_all_data
+       wait_zfs_commit ost1 2
+       cancel_lru_locks osc
+       ls -ls $DIR/$tdir
+
+       local files=$($LFS find --size +16M $DIR/$tdir | wc -l)
+
+       [[ $files == 3 ]] || error ">16M size files $files isn't 3 as expected"
+
+       files=$($LFS find --blocks +1M $DIR/$tdir | wc -l)
+       [[ $files == 1 ]] || error ">1M blocks files $files isn't 1 as expected"
+
+       rm -f $DIR/$tdir/$tfile.[123]
+}
+run_test 56ab "lfs find --blocks"
+
 test_56ba() {
        # Create composite files with one component
        local dir=$DIR/$tdir
 
-       setup_56 $dir/1Mfiles 5 1 "--component-end 1M"
+       setup_56 $dir/1Mfiles 5 1 "-S 1M --component-end 1M"
        # Create composite files with three components
-       setup_56 $dir/2Mfiles 5 2 "-E 2M -E 4M -E 6M"
+       setup_56 $dir/2Mfiles 5 2 "-E 2M -S 1M -E 4M -E 6M"
        # Create non-composite files
        createmany -o $dir/${tfile}- 10
 
@@ -6062,6 +6113,8 @@ test_60a() {
 run_test 60a "llog_test run from kernel module and test llog_reader"
 
 test_60aa() {
+       remote_mgs_nodsh && skip "remote MGS with nodsh" && return
+
        # test old logid format
        if [ $(lustre_version_code mgs) -le $(version_code 3.1.53) ]; then
                do_facet mgs $LCTL dl | grep MGS
@@ -6276,6 +6329,7 @@ test_64d() {
                skip "OST < 2.10.55 doesn't limit grants enough" && return 0
 
        local tgt=$($LCTL dl | grep "0000-osc-[^mM]" | awk '{print $4}')
+       local file=$DIR/$tfile
 
        [[ $($LCTL get_param osc.${tgt}.import |
                    grep "connect_flags:.*grant_param") ]] || \
@@ -6286,9 +6340,10 @@ test_64d() {
        $LCTL set_param debug="$OLDDEBUG" 2> /dev/null || true
 
        local max_cur_granted=$(($(want_grant $tgt) + $(grant_chunk $tgt)))
+       stack_trap "rm -f $file" EXIT
 
-       $SETSTRIPE $DIR/$tfile -i 0 -c 1
-       dd if=/dev/zero of=$DIR/$tfile bs=1M count=1000 &
+       $SETSTRIPE $file -i 0 -c 1
+       dd if=/dev/zero of=$file bs=1M count=1000 &
        ddpid=$!
 
        while true
@@ -6835,6 +6890,8 @@ cleanup_77c() {
 }
 
 test_77c() {
+       remote_ost_nodsh && skip "remote OST with nodsh" && return
+
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        $GSS && skip "could not run with gss" && return
 
@@ -6960,11 +7017,14 @@ test_77g() { # bug 10889
 
        [ ! -f $F77_TMP ] && setup_f77
 
-       $SETSTRIPE -c 1 -i 0 $DIR/$tfile
+       local file=$DIR/$tfile
+       stack_trap "rm -f $file" EXIT
+
+       $SETSTRIPE -c 1 -i 0 $file
        #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/$tfile bs=1M count=$F77SZ ||
+       dd if=$F77_TMP of=$file bs=1M count=$F77SZ ||
                error "write error: rc=$?"
        do_facet ost1 lctl set_param fail_loc=0
        set_checksums 0
@@ -6973,7 +7033,7 @@ test_77g() { # bug 10889
        #define OBD_FAIL_OST_CHECKSUM_SEND          0x21b
        do_facet ost1 lctl set_param fail_loc=0x8000021b
        set_checksums 1
-       cmp $F77_TMP $DIR/$tfile || error "file compare failed"
+       cmp $F77_TMP $file || error "file compare failed"
        do_facet ost1 lctl set_param fail_loc=0
        set_checksums 0
 }
@@ -7176,6 +7236,7 @@ run_test 82 "Basic grouplock test"
 
 test_83() {
        local sfile="/boot/System.map-$(uname -r)"
+       [ ! -f $sfile ] && skip "No $sfile found" && return
        # define OBD_FAIL_LLITE_PTASK_IO_FAIL 0x140d
        $LCTL set_param fail_loc=0x140d
        cp $sfile $DIR/$tfile || error "write failed"
@@ -7544,6 +7605,7 @@ run_test 101f "check mmap read performance"
 test_101g_brw_size_test() {
        local mb=$1
        local pages=$((mb * 1048576 / $(page_size)))
+       local file=$DIR/$tfile
 
        $LCTL set_param osc.*.max_pages_per_rpc=${mb}M ||
                { error "unable to set max_pages_per_rpc=${mb}M"; return 1; }
@@ -7552,14 +7614,15 @@ test_101g_brw_size_test() {
                        return 2
        done
 
+       stack_trap "rm -f $file" EXIT
        $LCTL set_param -n osc.*.rpc_stats=0
 
        # 10 RPCs should be enough for the test
        local count=10
-       dd if=/dev/zero of=$DIR/$tfile bs=${mb}M count=$count ||
+       dd if=/dev/zero of=$file bs=${mb}M count=$count ||
                { error "dd write ${mb} MB blocks failed"; return 3; }
        cancel_lru_locks osc
-       dd of=/dev/null if=$DIR/$tfile bs=${mb}M count=$count ||
+       dd of=/dev/null if=$file bs=${mb}M count=$count ||
                { error "dd write ${mb} MB blocks failed"; return 4; }
 
        # calculate number of full-sized read and write RPCs
@@ -7576,6 +7639,8 @@ test_101g_brw_size_test() {
 }
 
 test_101g() {
+       remote_ost_nodsh && skip "remote OST with nodsh" && return
+
        local rpcs
        local osts=$(get_facets OST)
        local list=$(comma_list $(osts_nodes))
@@ -8205,7 +8270,37 @@ test_103a() {
                fi
        done
 }
-run_test 103a "acl test ========================================="
+run_test 103a "acl test"
+
+test_103b() {
+       local U
+
+       for U in {0..511}; do
+               {
+               local O=$(printf "%04o" $U)
+
+               umask $(printf "%04o" $((511 ^ $O)))
+               $LFS setstripe -c 1 $DIR/$tfile.s$O
+               local S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.s$O))
+
+               (( $S == ($O & 0666) )) ||
+                       error "lfs setstripe $DIR/$tfile.s$O '$S' != '$O'"
+
+               $LFS setstripe -E16M -c 1 -E1G -S4M $DIR/$tfile.p$O
+               S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.p$O))
+               (( $S == ($O & 0666) )) ||
+                       error "lfs setstripe -E $DIR/$tfile.p$O '$S' != '$O'"
+
+               $LFS setstripe -N2 -c 1 $DIR/$tfile.m$O
+               S=$(printf "%04o" 0$(stat -c%a $DIR/$tfile.m$O))
+               (( $S == ($O & 0666) )) ||
+                       error "lfs setstripe -N2 $DIR/$tfile.m$O '$S' != '$O'"
+               rm -f $DIR/$tfile.[smp]$0
+               } &
+       done
+       wait
+}
+run_test 103b "umask lfs setstripe"
 
 test_103c() {
        mkdir -p $DIR/$tdir
@@ -10481,12 +10576,13 @@ size_in_KMGT() {
 }
 
 get_rename_size() {
-    local size=$1
-    local context=${2:-.}
-    local sample=$(do_facet $SINGLEMDS $LCTL get_param mdt.*.rename_stats |
+       local size=$1
+       local context=${2:-.}
+       local sample=$(do_facet $SINGLEMDS $LCTL \
+               get_param mdt.$FSNAME-MDT0000.rename_stats |
                grep -A1 $context |
                awk '/ '${size}'/ {print $4}' | sed -e "s/,//g")
-    echo $sample
+       echo $sample
 }
 
 test_133d() {
@@ -10498,11 +10594,12 @@ test_133d() {
 
        local testdir1=$DIR/${tdir}/stats_testdir1
        local testdir2=$DIR/${tdir}/stats_testdir2
+       mkdir -p $DIR/${tdir}
 
        do_facet $SINGLEMDS $LCTL set_param mdt.*.rename_stats=clear
 
-       mkdir -p ${testdir1} || error "mkdir failed"
-       mkdir -p ${testdir2} || error "mkdir failed"
+       lfs mkdir -i 0 -c 1 ${testdir1} || error "mkdir failed"
+       lfs mkdir -i 0 -c 1 ${testdir2} || error "mkdir failed"
 
        createmany -o $testdir1/test 512 || error "createmany failed"
 
@@ -10523,7 +10620,9 @@ test_133d() {
        echo "source rename dir size: ${testdir1_size}"
        echo "target rename dir size: ${testdir2_size}"
 
-       local cmd="do_facet $SINGLEMDS $LCTL get_param mdt.*.rename_stats"
+       local cmd="do_facet $SINGLEMDS $LCTL "
+       cmd+="get_param mdt.$FSNAME-MDT0000.rename_stats"
+
        eval $cmd || error "$cmd failed"
        local samedir=$($cmd | grep 'same_dir')
        local same_sample=$(get_rename_size $testdir1_size)
@@ -11925,6 +12024,10 @@ test_160e() {
 run_test 160e "changelog negative testing (should return errors)"
 
 test_160f() {
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+       [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.10.56) ]] ||
+               { skip "Need MDS version at least 2.10.56"; return 0; }
+
        local mdts=$(comma_list $(mdts_nodes))
 
        # Create a user
@@ -11997,6 +12100,10 @@ test_160f() {
 run_test 160f "changelog garbage collect (timestamped users)"
 
 test_160g() {
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+       [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.10.56) ]] ||
+               { skip "Need MDS version at least 2.10.56"; return 0; }
+
        local mdts=$(comma_list $(mdts_nodes))
 
        #define OBD_FAIL_TIME_IN_CHLOG_USER     0x1314
@@ -12235,6 +12342,8 @@ test_161c() {
 run_test 161c "check CL_RENME[UNLINK] changelog record flags"
 
 test_161d() {
+       remote_mds_nodsh && skip "remote MDS with nodsh" && return
+
        local pid
        local fid
 
@@ -13116,6 +13225,7 @@ else
                JOBENV=FAKE_JOBID
        fi
 fi
+LUSTRE_JOBID_SIZE=31 # plus NUL terminator
 
 verify_jobstats() {
        local cmd=($1)
@@ -13134,16 +13244,16 @@ verify_jobstats() {
        [ "$JOBENV" = "FAKE_JOBID" ] &&
                FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
 
-       JOBVAL=${!JOBENV}
+       JOBVAL=${!JOBENV:0:$LUSTRE_JOBID_SIZE}
 
        [ "$JOBENV" = "nodelocal" ] && {
-               FAKE_JOBID=id.$testnum.$(basename ${cmd[0]}).$RANDOM
+               FAKE_JOBID=id.$testnum.%e.$RANDOM
                $LCTL set_param jobid_name=$FAKE_JOBID
-               JOBVAL=$FAKE_JOBID
+               JOBVAL=${FAKE_JOBID/\%e/$(basename ${cmd[0]})}
        }
 
        log "Test: ${cmd[*]}"
-       log "Using JobID environment variable $JOBENV=$JOBVAL"
+       log "Using JobID environment $($LCTL get_param -n jobid_var)=$JOBVAL"
 
        if [ $JOBENV = "FAKE_JOBID" ]; then
                FAKE_JOBID=$JOBVAL ${cmd[*]}
@@ -13154,8 +13264,10 @@ verify_jobstats() {
        # all files are created on OST0000
        for facet in $facets; do
                local stats="*.$(convert_facet2label $facet).job_stats"
+
+               # strip out libtool wrappers for in-tree executables
                if [ $(do_facet $facet lctl get_param $stats |
-                      grep -c $JOBVAL) -ne 1 ]; then
+                      sed -e 's/\.lt-/./' | grep -c $JOBVAL) -ne 1 ]; then
                        do_facet $facet lctl get_param $stats
                        error "No jobstats for $JOBVAL found on $facet::$stats"
                fi
@@ -13183,11 +13295,9 @@ test_205() { # Job stats
        [[ $JOBID_VAR = disable ]] && skip "jobstats is disabled" && return
 
        local old_jobenv=$($LCTL get_param -n jobid_var)
-       if [ $old_jobenv != $JOBENV ]; then
-               jobstats_set $JOBENV
-               stack_trap "do_facet mgs \
-                       $LCTL conf_param $FSNAME.sys.jobid_var=$old_jobenv" EXIT
-       fi
+       [ $old_jobenv != $JOBENV ] && jobstats_set $JOBENV
+       stack_trap "do_facet mgs \
+               $LCTL conf_param $FSNAME.sys.jobid_var=$old_jobenv" EXIT
 
        changelog_register
 
@@ -13264,6 +13374,12 @@ test_205() { # Job stats
                [ $jobids -eq 0 ] ||
                        error "Unexpected jobids when jobid_var=$JOBENV"
        fi
+
+       lctl set_param jobid_var=USER jobid_name="S.%j.%e.%u.%h.E"
+       JOBENV="JOBCOMPLEX"
+       JOBCOMPLEX="S.$USER.touch.$(id -u).$(hostname).E"
+
+       verify_jobstats "touch $DIR/$tfile" $SINGLEMDS
 }
 run_test 205 "Verify job stats"
 
@@ -14642,6 +14758,8 @@ test_232a() {
 run_test 232a "failed lock should not block umount"
 
 test_232b() {
+       [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.10.58) ] ||
+               { skip "Need MDS version at least 2.10.58"; return; }
        mkdir -p $DIR/$tdir
        $LFS setstripe -c1 -i0 $DIR/$tdir/$tfile
        dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=1
@@ -17031,6 +17149,7 @@ run_test 310c "open-unlink remote file with multiple links"
 
 #LU-4825
 test_311() {
+       [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
        [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.8.54) ] &&
                skip "lustre < 2.8.54 does not contain LU-4825 fix" && return
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
@@ -17201,6 +17320,8 @@ test_313() {
 run_test 313 "io should fail after last_rcvd update fail"
 
 test_314() {
+       [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+
        $SETSTRIPE -c 2 -i 0 $DIR/$tfile || error "setstripe failed"
        do_facet ost1 "$LCTL set_param fail_loc=0x720"
        rm -f $DIR/$tfile
@@ -17227,6 +17348,19 @@ test_315() { # LU-618
 }
 run_test 315 "read should be accounted"
 
+test_316() {
+       [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
+       large_xattr_enabled || { skip "large_xattr disabled" && return; }
+
+       rm -rf $DIR/$tdir/d
+       mkdir -p $DIR/$tdir/d
+       chown nobody $DIR/$tdir/d
+       touch $DIR/$tdir/d/file
+
+       $LFS mv -M1 $DIR/$tdir/d || error "lfs mv failed"
+}
+run_test 316 "lfs mv"
+
 test_fake_rw() {
        local read_write=$1
        if [ "$read_write" = "write" ]; then
@@ -18206,6 +18340,52 @@ test_804() {
 }
 run_test 804 "verify agent entry for remote entry"
 
+cleanup_805() {
+       do_facet $SINGLEMDS zfs set quota=$old $fsset
+       unlinkmany $DIR/$tdir/f- 1000000
+       trap 0
+}
+
+test_805() {
+       local zfs_version=$(do_node $SINGLEMDS cat /sys/module/zfs/version)
+       [ "$(facet_fstype mds1)" != "zfs" ] &&
+               skip "ZFS specific test" && return
+       [ $(version_code $zfs_version) -lt $(version_code 0.7.2) ] &&
+               skip "netfree not implemented before 0.7" && return
+       [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.10.57) ]] ||
+               { skip "Need MDS version at least 2.10.57" && return 0; }
+
+       local fsset
+       local freekb
+       local usedkb
+       local old
+       local quota
+       local pref="osd-zfs.lustre-MDT0000."
+
+       # limit available space on MDS dataset to meet nospace issue
+       # quickly. then ZFS 0.7.2 can use reserved space if asked
+       # properly (using netfree flag in osd_declare_destroy()
+       fsset=$(do_facet $SINGLEMDS lctl get_param -n $pref.mntdev)
+       old=$(do_facet $SINGLEMDS zfs get -H quota $fsset | \
+               gawk '{print $3}')
+       freekb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytesfree)
+       usedkb=$(do_facet $SINGLEMDS lctl get_param -n $pref.kbytestotal)
+       let "usedkb=usedkb-freekb"
+       let "freekb=freekb/2"
+       if let "freekb > 5000"; then
+               let "freekb=5000"
+       fi
+       do_facet $SINGLEMDS zfs set quota=$(((usedkb+freekb)*1024)) $fsset
+       trap cleanup_805 EXIT
+       mkdir $DIR/$tdir
+       $LFS setstripe -E 1M -L mdt $DIR/$tdir || error "DoM not working"
+       createmany -m $DIR/$tdir/f- 1000000 && error "ENOSPC wasn't met"
+       rm -rf $DIR/$tdir || error "not able to remove"
+       do_facet $SINGLEMDS zfs set quota=$old $fsset
+       trap 0
+}
+run_test 805 "ZFS can remove from full fs"
+
 #
 # tests that do cleanup/setup should be run at the end
 #