From c9dec5e331c5a60dfd77add3292c9457ba4c8bd6 Mon Sep 17 00:00:00 2001 From: zhanghc Date: Mon, 22 Dec 2008 16:06:16 +0000 Subject: [PATCH] b=17757 restore "open lock" in reconstruct_open in case MDS_OPEN_LOCK is set i=Green i=Johann --- lustre/mds/mds_open.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lustre/mds/mds_open.c b/lustre/mds/mds_open.c index 2dad39d..661def8 100644 --- a/lustre/mds/mds_open.c +++ b/lustre/mds/mds_open.c @@ -519,7 +519,9 @@ static void reconstruct_open(struct mds_update_record *rec, int offset, struct obd_export *exp = req->rq_export; struct obd_device *obd = exp->exp_obd; struct dentry *parent, *dchild; + struct ldlm_request *dlmreq; struct ldlm_reply *rep; + struct ldlm_lock *lock; struct mds_body *body; int rc; struct list_head *t; @@ -680,6 +682,23 @@ static void reconstruct_open(struct mds_update_record *rec, int offset, mds_mfd_put(mfd); + if (!intent_disposition(rep, DISP_OPEN_LOCK)) + GOTO(out_dput, 0); + + dlmreq = lustre_msg_buf(req->rq_reqmsg, DLM_LOCKREQ_OFF, + sizeof(*dlmreq)); + /* find granted lock in obd_export->exp_lock_hash by remote handle */ + lock = lustre_hash_lookup(exp->exp_lock_hash, &dlmreq->lock_handle[0]); + + if (lock != NULL) { + /* grant the lock again! */ + ldlm_lock2handle(lock, child_lockh); + lh_put(exp->exp_lock_hash, &lock->l_exp_hash); + } else { + /* the lock is already canceled! clear DISP_OPEN_LOCK */ + intent_disposition(rep, ~DISP_OPEN_LOCK); + } + out_dput: if (put_child) l_dput(dchild); -- 1.8.3.1