#define OBD_FAIL_LDLM_WATERMARK_LOW 0x327
#define OBD_FAIL_LDLM_WATERMARK_HIGH 0x328
+#define OBD_FAIL_LDLM_GRANT_CHECK 0x32a
+
/* LOCKLESS IO */
#define OBD_FAIL_LDLM_SET_CONTENTION 0x385
/* even though we use interval tree to manage the extent lock, we also
* add the locks into grant list, for debug purpose, .. */
ldlm_resource_add_lock(res, &res->lr_granted, lock);
+
+ if (OBD_FAIL_CHECK(OBD_FAIL_LDLM_GRANT_CHECK)) {
+ struct ldlm_lock *lck;
+
+ list_for_each_entry_reverse(lck, &res->lr_granted,
+ l_res_link) {
+ if (lck == lock)
+ continue;
+ if (lockmode_compat(lck->l_granted_mode,
+ lock->l_granted_mode))
+ continue;
+ if (ldlm_extent_overlap(&lck->l_req_extent,
+ &lock->l_req_extent)) {
+ CDEBUG(D_ERROR, "granting conflicting lock %p "
+ "%p\n", lck, lock);
+ ldlm_resource_dump(D_ERROR, res);
+ LBUG();
+ }
+ }
+ }
}
/** Remove cancelled lock from resource interval tree. */
* bug 17614: locks being actively cancelled. Get a reference
* on a lock so that it does not disapear under us (e.g. due to cancel)
*/
- if (!(lock->l_flags & (LDLM_FL_FAILED|LDLM_FL_CANCELING))) {
+ if (!(lock->l_flags & (LDLM_FL_FAILED|LDLM_FL_BL_DONE))) {
list_add(&lock->l_pending_chain, list);
LDLM_LOCK_GET(lock);
}
/* Bug 11974: Do not replay a lock which is actively being canceled */
- if (ldlm_is_canceling(lock)) {
+ if (ldlm_is_bl_done(lock)) {
LDLM_DEBUG(lock, "Not replaying canceled lock:");
RETURN(0);
}
DEBUG_REQ(D_INODE, req, "%d pages, aa %p. now %ur/%uw in flight",
page_count, aa, cli->cl_r_in_flight,
cli->cl_w_in_flight);
- OBD_FAIL_TIMEOUT(OBD_FAIL_OSC_DELAY_IO, 4);
+ OBD_FAIL_TIMEOUT(OBD_FAIL_OSC_DELAY_IO, cfs_fail_val);
ptlrpcd_add_req(req);
rc = 0;
# another IO under the same lock
#define OBD_FAIL_OSC_DELAY_IO 0x414
$LCTL set_param fail_loc=0x80000414
+ $LCTL set_param fail_val=4 fail_loc=0x80000414
dd if=/dev/zero of=$DIR/$tfile count=1 conv=notrunc oflag=dsync &
local pid=$!
sleep 1
}
run_test 9 "Verify that no req deadline happened during recovery"
+test_10() {
+ rm -f $TDIR/$tfile
+
+ dd if=/dev/zero of=$TDIR/$tfile count=10 || error "dd failed"
+
+ #define OBD_FAIL_OSC_DELAY_IO 0x414
+ $LCTL set_param fail_val=60 fail_loc=0x414
+ cancel_lru_locks OST0000-osc &
+ sleep 2
+ facet_failover ost1 || error "failover: $?"
+
+ #define OBD_FAIL_LDLM_GRANT_CHECK 0x32a
+ $LCTL set_param fail_loc=0x32a
+ stat $TDIR/$tfile
+
+ wait
+}
+run_test 10 "conflicting PW & PR locks on a client"
+
complete $SECONDS
check_and_cleanup_lustre
exit_status