TRACE=${TRACE:-""}
check_kernel_version() {
- VERSION_FILE=$LPROC/version
+ VERSION_FILE=version
WANT_VER=$1
[ ! -f $VERSION_FILE ] && echo "can't find kernel version" && return 1
- GOT_VER=$(awk '/kernel:/ {print $2}' $VERSION_FILE)
+ GOT_VER=$(lctl get_param $VERSION_FILE | awk '/kernel:/ {print $2}')
[ $GOT_VER -ge $WANT_VER ] && return 0
log "test needs at least kernel version $WANT_VER, running $GOT_VER"
return 1
[ "$SANITYLOG" ] && rm -f $SANITYLOG || true
error() {
- sysctl -w lustre.fail_loc=0
+ lctl set_param fail_loc=0
log "FAIL: $TESTNAME $@"
$LCTL dk $TMP/lustre-log-$TESTNAME.log
if [ "$SANITYLOG" ]; then
DIR=${DIR:-$MOUNT}
[ -z "`echo $DIR | grep $MOUNT`" ] && echo "$DIR not in $MOUNT" && exit 99
-LOVNAME=`cat $LPROC/llite/*/lov/common_name | tail -n 1`
-OSTCOUNT=`cat $LPROC/lov/$LOVNAME/numobd`
-STRIPECOUNT=`cat $LPROC/lov/$LOVNAME/stripecount`
-STRIPESIZE=`cat $LPROC/lov/$LOVNAME/stripesize`
-ORIGFREE=`cat $LPROC/lov/$LOVNAME/kbytesavail`
+LOVNAME=`lctl get_param -n llite.*.lov.common_name | tail -n 1`
+OSTCOUNT=`lctl get_param -n lov.$LOVNAME.numobd`
+STRIPECOUNT=`lctl get_param -n lov.$LOVNAME.stripecount`
+STRIPESIZE=`lctl get_param -n lov.$LOVNAME.stripesize`
+ORIGFREE=`lctl get_param -n lov.$LOVNAME.kbytesavail`
MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
-MDS=$(\ls $LPROC/mdt 2> /dev/null | grep -v num_refs | tail -n 1)
+MDS=$(lctl get_param -N mdt.* | grep -v num_refs | tail -n 1 | cut -d"." -f2)
[ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
[ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
## this test is very time-consuming, don't run it by default
#run_test 4a " FIDS/ nlink overflow test ============================="
+test_5a() {
+ mount_client $MOUNT2
+ # create a cross-ref file
+ mkdir -p $MOUNT/$tdir/d1
+ mkdir -p $MOUNT2/$tdir/d2
+ dd if=/dev/zero of=$MOUNT/$tdir/d1/f1 count=1
+ mv $MOUNT2/$tdir/d1/f1 $MOUNT2/$tdir/d2/
+ # XXX: a check the file is a cross-ref one is needed.
+ cancel_lru_locks mdc
+ cancel_lru_locks osc
+ dd if=$MOUNT2/$tdir/d2/f1 of=/dev/null
+ stat $MOUNT2/$tdir/d2 $MOUNT2/$tdir/d2/f1 > /dev/null
+ can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
+ awk '/ldlm_cancel/ {print $2}'`
+ blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}'`
+ unlink $MOUNT2/$tdir/d2/f1
+ can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
+ awk '/ldlm_cancel/ {print $2}'`
+ blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}'`
+ umount $MOUNT2
+ [ $can1 -eq $can2 ] && error "It does not look like a cross-ref file."
+ [ $[$can1+1] -eq $can2 ] || error $[$[$can2-$can1]] "cancel RPC occured."
+ [ $blk1 -eq $blk2 ] || error $[$[$blk2-$blk1]] "blocking RPC occured."
+}
+run_test 5a "Early Lock Cancel: cross-ref unlink"
+
+test_5b() {
+ mount_client $MOUNT2
+ # create a cross-ref file
+ mkdir -p $MOUNT/$tdir/d1
+ mkdir -p $MOUNT2/$tdir/d2
+ dd if=/dev/zero of=$MOUNT/$tdir/d1/f1 count=1
+ cancel_lru_locks mdc
+ cancel_lru_locks osc
+ dd if=$MOUNT2/$tdir/d1/f1 of=/dev/null
+ stat $MOUNT2/$tdir/d1/f1 $MOUNT2/$tdir/d2 > /dev/null
+ can1=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
+ awk '/ldlm_cancel/ {print $2}'`
+ blk1=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}'`
+ ln $MOUNT2/$tdir/d1/f1 $MOUNT2/$tdir/d2/f2
+ can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats |
+ awk '/ldlm_cancel/ {print $2}'`
+ blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats |
+ awk '/ldlm_bl_callback/ {print $2}'`
+ umount $MOUNT2
+ [ $can1 -eq $can2 ] && error "It does not look like a cross-ref file."
+ [ $[$can1+1] -eq $can2 ] || error $[$[$can2-$can1]] "cancel RPC occured."
+ [ $blk1 -eq $blk2 ] || error $[$[$blk2-$blk1]] "blocking RPC occured."
+}
+run_test 5b "Early Lock Cancel: cross-ref link"
+
TMPDIR=$OLDTMPDIR
TMP=$OLDTMP
HOME=$OLDHOME