mfd->mfd_mode = flags;
mfd->mfd_dentry = dentry;
mfd->mfd_xid = req->rq_xid;
-
- spin_lock(&med->med_open_lock);
- list_add(&mfd->mfd_list, &med->med_open_head);
- spin_unlock(&med->med_open_lock);
-
body->handle.cookie = mfd->mfd_handle.h_cookie;
+ if (req->rq_export->exp_disconnected) {
+ mds_mfd_unlink(mfd, 0);
+ MDS_DOWN_WRITE_ORPHAN_SEM(dentry->d_inode);
+ mds_mfd_close(NULL, REQ_REC_OFF, req->rq_export->exp_obd,
+ mfd, 0, NULL, 0, NULL, 0, NULL);
+ } else {
+ spin_lock(&med->med_open_lock);
+ list_add(&mfd->mfd_list, &med->med_open_head);
+ spin_unlock(&med->med_open_lock);
+ }
+
RETURN(mfd);
cleanup_mfd:
}
void
-ptlrpc_save_lock (struct ptlrpc_request *req,
- struct lustre_handle *lock, int mode)
+ptlrpc_save_lock(struct ptlrpc_request *req,
+ struct lustre_handle *lock, int mode)
{
struct ptlrpc_reply_state *rs = req->rq_reply_state;
int idx;
LASSERT(rs != NULL);
LASSERT(rs->rs_nlocks < RS_MAX_LOCKS);
- idx = rs->rs_nlocks++;
- rs->rs_locks[idx] = *lock;
- rs->rs_modes[idx] = mode;
- rs->rs_difficult = 1;
+ if (req->rq_export->exp_disconnected) {
+ ldlm_lock_decref(lock, mode);
+ } else {
+ idx = rs->rs_nlocks++;
+ rs->rs_locks[idx] = *lock;
+ rs->rs_modes[idx] = mode;
+ rs->rs_difficult = 1;
+ }
}
void
}
run_test 83 "open replay with barrier between transactions"
+test_84() {
+#define OBD_FAIL_OBD_FAIL_MDS_SPLIT_OPEN 0x142
+ do_facet mds "lctl set_param fail_loc=0x80000142"
+ createmany -o $DIR/$tfile- 1 &
+ PID=$!
+ mds_evict_client
+ wait $PID
+}
+run_test 84 "stale open during export disconnect"
+
equals_msg `basename $0`: test complete, cleaning up
check_and_cleanup_lustre
[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true