ALWAYS_EXCEPT+=" 407 312 "
if $SHARED_KEY; then
- # bug number: LU-9795 LU-9795 LU-9795 LU-9795
- ALWAYS_EXCEPT+=" 17n 60a 133g 300f "
+ # bug number: LU-9795 LU-9795 LU-9795 LU-9795 LU-12781
+ ALWAYS_EXCEPT+=" 17n 60a 133g 300f 272a"
+fi
+
+selinux_status=$(getenforce)
+if [ "$selinux_status" != "Disabled" ]; then
+ # bug number:
+ ALWAYS_EXCEPT+=""
fi
# skip the grant tests for ARM until they are fixed
test_127a() { # bug 15521
[ $PARALLEL == "yes" ] && skip "skip parallel run"
+ local name count samp unit min max sum sumsq
$LFS setstripe -i 0 -c 1 $DIR/$tfile || error "setstripe failed"
+ echo "stats before reset"
+ $LCTL get_param osc.*.stats
$LCTL set_param osc.*.stats=0
- FSIZE=$((2048 * 1024))
- dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1
+ local fsize=$((2048 * 1024))
+
+ dd if=/dev/zero of=$DIR/$tfile bs=$fsize count=1
cancel_lru_locks osc
- dd if=$DIR/$tfile of=/dev/null bs=$FSIZE
-
- $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/${tfile}.tmp
- while read NAME COUNT SAMP UNIT MIN MAX SUM SUMSQ; do
- echo "got $COUNT $NAME"
- [ ! $MIN ] && error "Missing min value for $NAME proc entry"
- eval $NAME=$COUNT || error "Wrong proc format"
-
- case $NAME in
- read_bytes|write_bytes)
- [ $MIN -lt 4096 ] && error "min is too small: $MIN"
- [ $MIN -gt $FSIZE ] && error "min is too big: $MIN"
- [ $MAX -lt 4096 ] && error "max is too small: $MAX"
- [ $MAX -gt $FSIZE ] && error "max is too big: $MAX"
- [ $SUM -ne $FSIZE ] && error "sum is wrong: $SUM"
- [ $SUMSQ -lt $(((FSIZE /4096) * (4096 * 4096))) ] &&
- error "sumsquare is too small: $SUMSQ"
- [ $SUMSQ -gt $((FSIZE * FSIZE)) ] &&
- error "sumsquare is too big: $SUMSQ"
- ;;
- *) ;;
- esac
- done < $DIR/${tfile}.tmp
-
- #check that we actually got some stats
- [ "$read_bytes" ] || error "Missing read_bytes stats"
- [ "$write_bytes" ] || error "Missing write_bytes stats"
- [ "$read_bytes" != 0 ] || error "no read done"
- [ "$write_bytes" != 0 ] || error "no write done"
+ dd if=$DIR/$tfile of=/dev/null bs=$fsize
+
+ $LCTL get_param osc.*0000-osc-*.stats | grep samples > $DIR/$tfile.tmp
+ stack_trap "rm -f $TMP/$tfile.tmp"
+ while read name count samp unit min max sum sumsq; do
+ echo "got name=$name count=$count unit=$unit min=$min max=$max"
+ [ ! $min ] && error "Missing min value for $name proc entry"
+ eval $name=$count || error "Wrong proc format"
+
+ case $name in
+ read_bytes|write_bytes)
+ [[ "$unit" =~ "bytes" ]] ||
+ error "unit is not 'bytes': $unit"
+ (( $min >= 4096 )) || error "min is too small: $min"
+ (( $min <= $fsize )) || error "min is too big: $min"
+ (( $max >= 4096 )) || error "max is too small: $max"
+ (( $max <= $fsize )) || error "max is too big: $max"
+ (( $sum == $fsize )) || error "sum is wrong: $sum"
+ (( $sumsq >= ($fsize / 4096) * (4096 * 4096) )) ||
+ error "sumsquare is too small: $sumsq"
+ (( $sumsq <= $fsize * $fsize )) ||
+ error "sumsquare is too big: $sumsq"
+ ;;
+ ost_read|ost_write)
+ [[ "$unit" =~ "usec" ]] ||
+ error "unit is not 'usec': $unit"
+ ;;
+ *) ;;
+ esac
+ done < $DIR/$tfile.tmp
+
+ #check that we actually got some stats
+ [ "$read_bytes" ] || error "Missing read_bytes stats"
+ [ "$write_bytes" ] || error "Missing write_bytes stats"
+ [ "$read_bytes" != 0 ] || error "no read done"
+ [ "$write_bytes" != 0 ] || error "no write done"
}
run_test 127a "verify the client stats are sane"
[ $PARALLEL == "yes" ] && skip "skip parallel run"
local name count samp unit min max sum sumsq
+ echo "stats before reset"
+ $LCTL get_param llite.*.stats
$LCTL set_param llite.*.stats=0
# perform 2 reads and writes so MAX is different from SUM.
dd if=$DIR/$tfile of=/dev/null bs=$PAGE_SIZE count=1
$LCTL get_param llite.*.stats | grep samples > $TMP/$tfile.tmp
+ stack_trap "rm -f $TMP/$tfile.tmp"
while read name count samp unit min max sum sumsq; do
- echo "got $count $name"
+ echo "got name=$name count=$count unit=$unit min=$min max=$max"
eval $name=$count || error "Wrong proc format"
case $name in
- read_bytes)
- [ $count -ne 2 ] && error "count is not 2: $count"
- [ $min -ne $PAGE_SIZE ] &&
+ read_bytes|write_bytes)
+ [[ "$unit" =~ "bytes" ]] ||
+ error "unit is not 'bytes': $unit"
+ (( $count == 2 )) || error "count is not 2: $count"
+ (( $min == $PAGE_SIZE )) ||
error "min is not $PAGE_SIZE: $min"
- [ $max -ne $PAGE_SIZE ] &&
- error "max is incorrect: $max"
- [ $sum -ne $((PAGE_SIZE * 2)) ] &&
- error "sum is wrong: $sum"
+ (( $max == $PAGE_SIZE )) ||
+ error "max is not $PAGE_SIZE: $max"
+ (( $sum == $PAGE_SIZE * 2 )) ||
+ error "sum is not $((PAGE_SIZE * 2)): $sum"
;;
- write_bytes)
- [ $count -ne 2 ] && error "count is not 2: $count"
- [ $min -ne $PAGE_SIZE ] &&
- error "min is not $PAGE_SIZE: $min"
- [ $max -ne $PAGE_SIZE ] &&
- error "max is incorrect: $max"
- [ $sum -ne $((PAGE_SIZE * 2)) ] &&
- error "sum is wrong: $sum"
+ read|write)
+ [[ "$unit" =~ "usec" ]] ||
+ error "unit is not 'usec': $unit"
;;
- *) ;;
+ *) ;;
esac
done < $TMP/$tfile.tmp
[ "$write_bytes" ] || error "Missing write_bytes stats"
[ "$read_bytes" != 0 ] || error "no read done"
[ "$write_bytes" != 0 ] || error "no write done"
-
- rm -f $TMP/${tfile}.tmp
}
run_test 127b "verify the llite client stats are sane"
error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
fi
- # the following read invalidates the cache
cancel_lru_locks osc
+ # invalidates OST cache
+ do_nodes $list "echo 1 > /proc/sys/vm/drop_caches"
set_osd_param $list '' read_cache_enable 0
cat $DIR/$tfile >/dev/null
cat $file >/dev/null
AFTER=$(roc_hit)
if ! let "AFTER - BEFORE == CPAGES"; then
- error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+ error "NOT IN CACHE (2): before: $BEFORE, after: $AFTER"
else
- log "cache hits:: before: $BEFORE, after: $AFTER"
+ log "cache hits: before: $BEFORE, after: $AFTER"
fi
log "Read again; it should be satisfied from the cache."
cat $file >/dev/null
AFTER=$(roc_hit)
if ! let "AFTER - BEFORE == CPAGES"; then
- error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+ error "NOT IN CACHE (3): before: $BEFORE, after: $AFTER"
else
log "cache hits:: before: $BEFORE, after: $AFTER"
fi
cat $file >/dev/null
AFTER=$(roc_hit)
if ! let "AFTER - BEFORE == CPAGES"; then
- error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+ error "NOT IN CACHE (4): before: $BEFORE, after: $AFTER"
else
log "cache hits:: before: $BEFORE, after: $AFTER"
fi
- log "Read again; it should not be satisfied from the cache."
- BEFORE=$AFTER
- cancel_lru_locks osc
- cat $file >/dev/null
- AFTER=$(roc_hit)
- if ! let "AFTER - BEFORE == 0"; then
- error "IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
+ if [ $OST1_VERSION -lt $(version_code 2.12.55) ]; then
+ # > 2.12.56 uses pagecache if cached
+ log "Read again; it should not be satisfied from the cache."
+ BEFORE=$AFTER
+ cancel_lru_locks osc
+ cat $file >/dev/null
+ AFTER=$(roc_hit)
+ if ! let "AFTER - BEFORE == 0"; then
+ error "IN CACHE (5): before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
fi
log "Write data and read it back."
cat $file >/dev/null
AFTER=$(roc_hit)
if ! let "AFTER - BEFORE == CPAGES"; then
- error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+ error "NOT IN CACHE (6): before: $BEFORE, after: $AFTER"
else
log "cache hits:: before: $BEFORE, after: $AFTER"
fi
- log "Read again; it should not be satisfied from the cache."
- BEFORE=$AFTER
- cancel_lru_locks osc
- cat $file >/dev/null
- AFTER=$(roc_hit)
- if ! let "AFTER - BEFORE == 0"; then
- error "IN CACHE: before: $BEFORE, after: $AFTER"
- else
- log "cache hits:: before: $BEFORE, after: $AFTER"
+ if [ $OST1_VERSION -lt $(version_code 2.12.55) ]; then
+ # > 2.12.56 uses pagecache if cached
+ log "Read again; it should not be satisfied from the cache."
+ BEFORE=$AFTER
+ cancel_lru_locks osc
+ cat $file >/dev/null
+ AFTER=$(roc_hit)
+ if ! let "AFTER - BEFORE == 0"; then
+ error "IN CACHE (7): before: $BEFORE, after: $AFTER"
+ else
+ log "cache hits:: before: $BEFORE, after: $AFTER"
+ fi
fi
log "Turn off read and write cache"
cat $file >/dev/null
AFTER=$(roc_hit)
if ! let "AFTER - BEFORE == 0"; then
- error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
+ error_ignore bz20762 "IN CACHE (8):before:$BEFORE,after:$AFTER"
else
log "cache hits:: before: $BEFORE, after: $AFTER"
fi
cat $file >/dev/null
AFTER=$(roc_hit)
if ! let "AFTER - BEFORE == 0"; then
- error_ignore bz20762 "IN CACHE: before: $BEFORE, after: $AFTER"
+ error_ignore bz20762 "IN CACHE (9):before:$BEFORE,after:$AFTER"
else
log "cache hits:: before: $BEFORE, after: $AFTER"
fi
cat $file >/dev/null
AFTER=$(roc_hit)
if ! let "AFTER - BEFORE == CPAGES"; then
- error "NOT IN CACHE: before: $BEFORE, after: $AFTER"
+ error "NOT IN CACHE (1): before: $BEFORE, after: $AFTER"
else
log "cache hits:: before: $BEFORE, after: $AFTER"
fi
}
run_test 230l "readdir between MDTs won't crash"
+test_230m() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs"
+ [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
+ skip "Need MDS version at least 2.11.56"
+
+ local MDTIDX=1
+ local mig_dir=$DIR/$tdir/migrate_dir
+ local longstr="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ local shortstr="b"
+ local val
+
+ echo "Creating files and dirs with xattrs"
+ test_mkdir $DIR/$tdir
+ test_mkdir -i0 -c1 $mig_dir
+ mkdir $mig_dir/dir
+ setfattr -n user.attr1 -v $longstr $mig_dir/dir ||
+ error "cannot set xattr attr1 on dir"
+ setfattr -n user.attr2 -v $shortstr $mig_dir/dir ||
+ error "cannot set xattr attr2 on dir"
+ touch $mig_dir/dir/f0
+ setfattr -n user.attr1 -v $longstr $mig_dir/dir/f0 ||
+ error "cannot set xattr attr1 on file"
+ setfattr -n user.attr2 -v $shortstr $mig_dir/dir/f0 ||
+ error "cannot set xattr attr2 on file"
+ sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
+ val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
+ [ "$val" = $longstr ] || error "xattr attr1 not set properly on dir"
+ val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
+ [ "$val" = $shortstr ] || error "xattr attr2 not set properly on dir"
+ val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
+ [ "$val" = $longstr ] || error "xattr attr1 not set properly on file"
+ val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
+ [ "$val" = $shortstr ] || error "xattr attr2 not set properly on file"
+
+ echo "Migrating to MDT1"
+ $LFS migrate -m $MDTIDX $mig_dir ||
+ error "fails on migrating dir to MDT1"
+
+ sync ; sync ; echo 3 > /proc/sys/vm/drop_caches
+ echo "Checking xattrs"
+ val=$(getfattr --only-values -n user.attr1 $mig_dir/dir 2>/dev/null)
+ [ "$val" = $longstr ] ||
+ error "expecting xattr1 $longstr on dir, found $val"
+ val=$(getfattr --only-values -n user.attr2 $mig_dir/dir 2>/dev/null)
+ [ "$val" = $shortstr ] ||
+ error "expecting xattr2 $shortstr on dir, found $val"
+ val=$(getfattr --only-values -n user.attr1 $mig_dir/dir/f0 2>/dev/null)
+ [ "$val" = $longstr ] ||
+ error "expecting xattr1 $longstr on file, found $val"
+ val=$(getfattr --only-values -n user.attr2 $mig_dir/dir/f0 2>/dev/null)
+ [ "$val" = $shortstr ] ||
+ error "expecting xattr2 $shortstr on file, found $val"
+}
+run_test 230m "xattrs not changed after dir migration"
+
test_231a()
{
# For simplicity this test assumes that max_pages_per_rpc
}
run_test 245 "check mdc connection flag/data: multiple modify RPCs"
-test_246() { # LU-7371
- remote_ost_nodsh && skip "remote OST with nodsh"
- [ $OST1_VERSION -lt $(version_code 2.7.62) ] &&
- skip "Need OST version >= 2.7.62"
-
- do_facet ost1 $LCTL set_param fail_val=4095
-#define OBD_FAIL_OST_READ_SIZE 0x234
- do_facet ost1 $LCTL set_param fail_loc=0x234
- $LFS setstripe $DIR/$tfile -i 0 -c 1
- dd if=/dev/zero of=$DIR/$tfile bs=4095 count=1 > /dev/null 2>&1
- cancel_lru_locks $FSNAME-OST0000
- dd if=$DIR/$tfile of=/dev/null bs=1048576 || error "Read failed"
-}
-run_test 246 "Read file of size 4095 should return right length"
-
cleanup_247() {
local submount=$1
}
run_test 247e "mount .. as fileset"
-test_248() {
+test_248a() {
local fast_read_sav=$($LCTL get_param -n llite.*.fast_read 2>/dev/null)
[ -z "$fast_read_sav" ] && skip "no fast read support"
$LCTL set_param -n llite.*.fast_read=$fast_read_sav
rm -f $DIR/$tfile
}
-run_test 248 "fast read verification"
+run_test 248a "fast read verification"
+
+test_248b() {
+ # Default short_io_bytes=16384, try both smaller and larger sizes.
+ # Lustre O_DIRECT read and write needs to be a multiple of PAGE_SIZE.
+ # 6017024 = 2^12*13*113 = 47008*128 = 11752*512 = 4096*1469 = 53248*113
+ echo "bs=53248 count=113 normal buffered write"
+ dd if=/dev/urandom of=$TMP/$tfile.0 bs=53248 count=113 ||
+ error "dd of initial data file failed"
+ stack_trap "rm -f $DIR/$tfile.[0-3] $TMP/$tfile.[0-3]" EXIT
+
+ echo "bs=47008 count=128 oflag=dsync normal write $tfile.0"
+ dd if=$TMP/$tfile.0 of=$DIR/$tfile.0 bs=47008 count=128 oflag=dsync ||
+ error "dd with sync normal writes failed"
+ cmp $TMP/$tfile.0 $DIR/$tfile.0 || error "compare $DIR/$tfile.0 failed"
+
+ echo "bs=11752 count=512 oflag=dsync small write $tfile.1"
+ dd if=$TMP/$tfile.0 of=$DIR/$tfile.1 bs=11752 count=512 oflag=dsync ||
+ error "dd with sync small writes failed"
+ cmp $TMP/$tfile.0 $DIR/$tfile.1 || error "compare $DIR/$tfile.1 failed"
+
+ cancel_lru_locks osc
+
+ # calculate the small O_DIRECT size and count for the client PAGE_SIZE
+ local num=$((13 * 113 / (PAGE_SIZE / 4096)))
+ echo "bs=$PAGE_SIZE count=$num iflag=direct small read $tfile.1"
+ dd if=$DIR/$tfile.1 of=$TMP/$tfile.1 bs=$PAGE_SIZE count=$num \
+ iflag=direct || error "dd with O_DIRECT small read failed"
+ # adjust bytes checked to handle larger PAGE_SIZE for ARM/PPC
+ cmp --bytes=$((PAGE_SIZE * num)) $TMP/$tfile.0 $TMP/$tfile.1 ||
+ error "compare $TMP/$tfile.1 failed"
+
+ local save=$($LCTL get_param -n osc.*OST000*.short_io_bytes | head -n 1)
+ stack_trap "$LCTL set_param osc.$FSNAME-*.short_io_bytes=$save" EXIT
+
+ # just to see what the maximum tunable value is, and test parsing
+ echo "test invalid parameter 2MB"
+ $LCTL set_param osc.$FSNAME-OST0000*.short_io_bytes=2M &&
+ error "too-large short_io_bytes allowed"
+ echo "test maximum parameter 512KB"
+ # if we can set a larger short_io_bytes, run test regardless of version
+ if ! $LCTL set_param osc.$FSNAME-OST0000*.short_io_bytes=512K; then
+ # older clients may not allow setting it this large, that's OK
+ [ $CLIENT_VERSION -ge $(version_code 2.13.50) ] ||
+ skip "Need at least client version 2.13.50"
+ error "medium short_io_bytes failed"
+ fi
+ $LCTL get_param osc.$FSNAME-OST0000*.short_io_bytes
+ size=$($LCTL get_param -n osc.$FSNAME-OST0000*.short_io_bytes)
+
+ echo "test large parameter 64KB"
+ $LCTL set_param osc.$FSNAME-*.short_io_bytes=65536
+ $LCTL get_param osc.$FSNAME-OST0000*.short_io_bytes
+
+ echo "bs=47008 count=128 oflag=dsync large write $tfile.2"
+ dd if=$TMP/$tfile.0 of=$DIR/$tfile.2 bs=47008 count=128 oflag=dsync ||
+ error "dd with sync large writes failed"
+ cmp $TMP/$tfile.0 $DIR/$tfile.2 || error "compare $DIR/$tfile.2 failed"
+
+ # calculate the large O_DIRECT size and count for the client PAGE_SIZE
+ local size=$(((4096 * 13 + PAGE_SIZE - 1) / PAGE_SIZE * PAGE_SIZE))
+ num=$((113 * 4096 / PAGE_SIZE))
+ echo "bs=$size count=$num oflag=direct large write $tfile.3"
+ dd if=$TMP/$tfile.0 of=$DIR/$tfile.3 bs=$size count=$num oflag=direct ||
+ error "dd with O_DIRECT large writes failed"
+ cmp --bytes=$((size * num)) $TMP/$tfile.0 $DIR/$tfile.3 ||
+ error "compare $DIR/$tfile.3 failed"
+
+ cancel_lru_locks osc
+
+ echo "bs=$size count=$num iflag=direct large read $tfile.2"
+ dd if=$DIR/$tfile.2 of=$TMP/$tfile.2 bs=$size count=$num iflag=direct ||
+ error "dd with O_DIRECT large read failed"
+ cmp --bytes=$((size * num)) $TMP/$tfile.0 $TMP/$tfile.2 ||
+ error "compare $TMP/$tfile.2 failed"
+
+ echo "bs=$size count=$num iflag=direct large read $tfile.3"
+ dd if=$DIR/$tfile.3 of=$TMP/$tfile.3 bs=$size count=$num iflag=direct ||
+ error "dd with O_DIRECT large read failed"
+ cmp --bytes=$((size * num)) $TMP/$tfile.0 $TMP/$tfile.3 ||
+ error "compare $TMP/$tfile.3 failed"
+}
+run_test 248b "test short_io read and write for both small and large sizes"
test_249() { # LU-7890
[ $MDS1_VERSION -lt $(version_code 2.8.53) ] &&
lod.lustre-MDT0000-mdtlov.mdt_qos_prio_free | head -n1)
lod_qos_prio_free=${lod_qos_prio_free%%%}
lod_qos_threshold_rr=$(do_facet mds1 $LCTL get_param -n \
- lod.lustre-MDT0000-mdtlov.mdt_qos_thresholdrr | head -n1)
+ lod.lustre-MDT0000-mdtlov.mdt_qos_threshold_rr | head -n1)
lod_qos_threshold_rr=${lod_qos_threshold_rr%%%}
lod_qos_maxage=$(do_facet mds1 $LCTL get_param -n \
lod.lustre-MDT0000-mdtlov.qos_maxage | awk '{ print $1 }')
stack_trap "do_nodes $mdts $LCTL set_param \
lod.*.mdt_qos_prio_free=$lod_qos_prio_free > /dev/null" EXIT
stack_trap "do_nodes $mdts $LCTL set_param \
- lod.*.mdt_qos_thresholdrr=$lod_qos_threshold_rr > /dev/null" \
+ lod.*.mdt_qos_threshold_rr=$lod_qos_threshold_rr > /dev/null" \
EXIT
stack_trap "do_nodes $mdts $LCTL set_param \
lod.*.mdt_qos_maxage=$lod_qos_maxage > /dev/null" EXIT
echo "Mkdir (stripe_count $stripe_count) roundrobin:"
$LCTL set_param lmv.*.qos_threshold_rr=100 > /dev/null
- do_nodes $mdts $LCTL set_param lod.*.mdt_qos_thresholdrr=100 > /dev/null
+ do_nodes $mdts $LCTL set_param lod.*.mdt_qos_threshold_rr=100 > /dev/null
testdir=$DIR/$tdir-s$stripe_count/rr
$LCTL set_param lmv.*.qos_threshold_rr=$lmv_qos_threshold_rr > /dev/null
do_nodes $mdts $LCTL set_param \
- lod.*.mdt_qos_thresholdrr=$lod_qos_threshold_rr > /dev/null
+ lod.*.mdt_qos_threshold_rr=$lod_qos_threshold_rr > /dev/null
echo
echo "Check for uneven MDTs: "
}
run_test 900 "umount should not race with any mgc requeue thread"
+# LUS-6253/LU-11185
+test_901() {
+ local oldc
+ local newc
+ local olds
+ local news
+ [ $PARALLEL == "yes" ] && skip "skip parallel run"
+
+ # some get_param have a bug to handle dot in param name
+ cancel_lru_locks MGC
+ oldc=$($LCTL get_param -n 'ldlm.namespaces.MGC*.lock_count')
+ olds=$(do_facet mgs $LCTL get_param -n 'ldlm.namespaces.MGS*.lock_count')
+ umount_client $MOUNT || error "umount failed"
+ mount_client $MOUNT || error "mount failed"
+ cancel_lru_locks MGC
+ newc=$($LCTL get_param -n 'ldlm.namespaces.MGC*.lock_count')
+ news=$(do_facet mgs $LCTL get_param -n 'ldlm.namespaces.MGS*.lock_count')
+
+ [ $oldc -lt $newc ] && error "mgc lock leak ($oldc != $newc)"
+ [ $olds -lt $news ] && error "mgs lock leak ($olds != $news)"
+
+ return 0
+}
+run_test 901 "don't leak a mgc lock on client umount"
+
complete $SECONDS
[ -f $EXT2_DEV ] && rm $EXT2_DEV || true
check_and_cleanup_lustre