#define OBD_FAIL_LDLM_GRANT_CHECK 0x32a
#define OBD_FAIL_LDLM_PROLONG_PAUSE 0x32b
+#define OBD_FAIL_LDLM_LOCAL_CANCEL_PAUSE 0x32c
/* LOCKLESS IO */
#define OBD_FAIL_LDLM_SET_CONTENTION 0x385
* granted lock will be cancelled immediately after
* sending completion AST.
*/
- if (dlm_rep->lock_flags & LDLM_FL_CANCEL_ON_BLOCK) {
+ if (ldlm_is_cancel_on_block(lock)) {
unlock_res_and_lock(lock);
ldlm_lock_cancel(lock);
lock_res_and_lock(lock);
}
ldlm_set_cbpending(lock);
- if (ldlm_is_cancel_on_block(lock))
- ldlm_set_cancel(lock);
-
do_ast = (!lock->l_readers && !lock->l_writers);
unlock_res_and_lock(lock);
if (*flags & LDLM_FL_ATOMIC_CB)
ldlm_set_atomic_cb(lock);
+ if (*flags & LDLM_FL_CANCEL_ON_BLOCK)
+ ldlm_set_cancel_on_block(lock);
+
if (policy != NULL)
lock->l_policy_data = *policy;
if (client_cookie != NULL)
ldlm_set_canceling(lock);
unlock_res_and_lock(lock);
+ if (cancel_flags & LCF_LOCAL)
+ OBD_FAIL_TIMEOUT(OBD_FAIL_LDLM_LOCAL_CANCEL_PAUSE,
+ cfs_fail_val);
+
rc = ldlm_cli_cancel_local(lock);
if (rc == LDLM_FL_LOCAL_ONLY || cancel_flags & LCF_LOCAL) {
LDLM_LOCK_RELEASE(lock);
if (rc == 0) {
LASSERT(request != NULL);
ll_update_times(request, parent);
+ }
+ if (rc == 0 || rc == -EAGAIN) {
body = req_capsule_server_get(&request->rq_pill, &RMF_MDT_BODY);
LASSERT(body != NULL);
request = NULL;
}
- /* Try again if the file layout has changed. */
+ /* Try again if the lease has cancelled. */
if (rc == -EAGAIN && S_ISREG(child_inode->i_mode))
goto again;
/* Only enqueue LOOKUP lock for remote object */
LASSERT(ergo(mdt_object_remote(o), *ibits == MDS_INODELOCK_LOOKUP));
+ /* Lease lock are granted with LDLM_FL_CANCEL_ON_BLOCK */
+ if (lh->mlh_type == MDT_REG_LOCK && lh->mlh_reg_mode == LCK_EX &&
+ *ibits == MDS_INODELOCK_OPEN)
+ dlmflags |= LDLM_FL_CANCEL_ON_BLOCK;
+
if (lh->mlh_type == MDT_PDO_LOCK) {
/* check for exists after object is locked */
if (mdt_object_exists(o) == 0) {
CDEBUG(D_INODE, "normal open:"DFID" lease count: %d, lm: %d\n",
PFID(mdt_object_fid(obj)),
- atomic_read(&obj->mot_open_count), lm);
+ atomic_read(&obj->mot_lease_count), lm);
}
mdt_lock_reg_init(lhc, lm);
}
run_test 317 "Verify blocks get correctly update after truncate"
+test_319() {
+ [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0
+
+ local before=$(date +%s)
+ local evict
+ local mdir=$DIR/$tdir
+ local file=$mdir/xxx
+
+ $LFS mkdir -i0 $mdir || error "mkdir $mdir fails"
+ touch $file
+
+#define OBD_FAIL_LDLM_LOCAL_CANCEL_PAUSE 0x32c
+ $LCTL set_param fail_val=5 fail_loc=0x8000032c
+ $LFS mv -m1 $file &
+
+ sleep 1
+ dd if=$file of=/dev/null
+ wait
+ evict=$($LCTL get_param mdc.$FSNAME-MDT*.state |
+ awk -F"[ [,]" '/EVICTED ]$/ { if (mx<$5) {mx=$5;} } END { print mx }')
+
+ [ -z "$evict" ] || [[ $evict -le $before ]] || error "eviction happened"
+}
+run_test 319 "lost lease lock on migrate error"
+
test_fake_rw() {
local read_write=$1
if [ "$read_write" = "write" ]; then