. ${CONFIG:=$LUSTRE/tests/cfg/local.sh}
-. $LUSTRE/tests/test-framework.sh
-
build_test_filter
do_facet client checkstat -v -p 0777 $MOUNT/f10 || return 3
do_facet client "munlink $MOUNT/f10"
}
-run_test 10 "finish request after client eviction (bug 1521)"
+run_test 10 "finish request on server after client eviction (bug 1521)"
+
+#bug 2460
+# wake up a thead waiting for completion after eviction
+test_11(){
+ do_facet client multiop $MOUNT/$tfile Ow || return 1
+ do_facet client multiop $MOUNT/$tfile or || return 2
+ cancel_lru_locks OSC
+
+ do_facet client multiop $MOUNT/$tfile or || return 3
+ drop_bl_callback multiop $MOUNT/$tfile Ow ||
+ echo "client evicted, as expected"
+
+ do_facet client unlink $MOUNT/$tfile || return 4
+}
+run_test 11 "wake up a thead waiting for completion after eviction (b=2460)"
$CLEANUP
+
set -e
+export REFORMAT=""
+export VERBOSE=false
+
# eg, assert_env LUSTRE MDSNODES OSTNODES CLIENTS
assert_env() {
local failed=""
shift
if $VERBOSE; then
- echo "CMD $HOST $@"
+ echo "CMD: $HOST $@"
fi
$PDSH $HOST "(PATH=\$PATH:$RLUSTRE/utils:$RLUSTRE/tests; cd $RPWD; sh -c \"$@\")"
}
return $RC
}
+drop_ldlm_cancel() {
+#define OBD_FAIL_LDLM_CANCEL 0x304
+ RC=0
+ do_facet client "echo 0x304 > /proc/sys/lustre/fail_loc"
+ do_facet client "$@" || RC=$?
+ do_facet client "echo 0 > /proc/sys/lustre/fail_loc"
+ return $RC
+}
+
drop_bl_callback() {
#define OBD_FAIL_LDLM_BL_CALLBACK 0x305
RC=0
return $RC
}
+cancel_lru_locks() {
+ for d in /proc/fs/lustre/ldlm/namespaces/$1*; do
+ if [ -f $d/lru_size ]; then
+ echo clear > $d/lru_size
+ grep [0-9] $d/lock_unused_count
+ fi
+ done
+}
+
##################################
# Test interface
error() {