#define OBD_FAIL_LDLM_OST_FAIL_RACE 0x316
#define OBD_FAIL_LDLM_INTR_CP_AST 0x317
#define OBD_FAIL_LDLM_CP_BL_RACE 0x318
+#define OBD_FAIL_LDLM_ENQUEUE_LOCAL 0x319
/* LOCKLESS IO */
#define OBD_FAIL_LDLM_SET_CONTENTION 0x385
int idx;
LASSERT(lock->l_granted_mode == lock->l_req_mode);
+ LASSERT(!lock->l_destroyed);
node = lock->l_tree_node;
LASSERT(node != NULL);
if (!local && (*flags & LDLM_FL_REPLAY) && res->lr_type == LDLM_EXTENT)
OBD_SLAB_ALLOC(node, ldlm_interval_slab, CFS_ALLOC_IO,
sizeof(*node));
+ if(res->lr_type == LDLM_EXTENT)
+ OBD_FAIL_TIMEOUT(OBD_FAIL_LDLM_ENQUEUE_LOCAL, 30);
lock_res_and_lock(lock);
+ if (lock->l_destroyed)
+ GOTO(out, rc = -EAGAIN);
+
if (local && lock->l_req_mode == lock->l_granted_mode) {
/* The server returned a blocked lock, but it was granted
* before we got a chance to actually enqueue it. We don't
"new_mode %u, granted %u\n", new_mode, lock->l_granted_mode);
lock_res_and_lock(lock);
+ if (unlikely(lock->l_destroyed != 0)) {
+ unlock_res_and_lock(lock);
+ RETURN(NULL);
+ }
res = lock->l_resource;
ns = res->lr_namespace;
}
run_test 20b "ldlm_handle_enqueue error (should return error)"
+test_20c() {
+ # bug 19039 -- a race between ldlm_enqueue and lock
+ # destroying when the client export is disconnected
+
+ local ddpid
+
+ mkdir -p $DIR/$tdir
+ rm -f $DIR/$tdir/$tfile
+ # OBD_FAIL_LDLM_ENQUEUE_LOCAL 0x319
+ do_facet ost1 lctl set_param fail_loc=0x80000319
+ lfs setstripe -c 1 -o 0 $DIR/$tdir/$tfile
+ dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M conv=notrunc count=1 &
+ ddpid=$!
+ sleep 3
+ kill $ddpid
+ stop ost1
+ sleep 30
+ start ost1 $(ostdevname 1) $OST_MOUNT_OPTS
+ rm -rf $DIR/$tdir
+ return 0
+}
+run_test 20c "ldlm_lock_enqueue is called for a destroyed lock (shouldn't LBUG)"
+
test_21a() {
mkdir -p $DIR/$tdir-1
mkdir -p $DIR/$tdir-2