From 06ce0d8a1f24b8f7d3887b9139a243a0d9436f16 Mon Sep 17 00:00:00 2001 From: yury Date: Mon, 24 Apr 2006 08:18:25 +0000 Subject: [PATCH] - remove ll_have_md_lock(). It accessed md namespace directly what is not allowed for lmv case. It is done in md_intent_lock() handlers normaly. --- lustre/llite/dcache.c | 8 ++-- lustre/llite/file.c | 90 ++++++++++++++----------------------------- lustre/llite/llite_internal.h | 2 + 3 files changed, 35 insertions(+), 65 deletions(-) diff --git a/lustre/llite/dcache.c b/lustre/llite/dcache.c index 8287c11..bc781b4 100644 --- a/lustre/llite/dcache.c +++ b/lustre/llite/dcache.c @@ -216,9 +216,9 @@ restart: EXIT; } -static int revalidate_it_finish(struct ptlrpc_request *request, int offset, - struct lookup_intent *it, - struct dentry *de) +int ll_revalidate_it_finish(struct ptlrpc_request *request, + int offset, struct lookup_intent *it, + struct dentry *de) { struct ll_sb_info *sbi; int rc = 0; @@ -333,7 +333,7 @@ int ll_revalidate_it(struct dentry *de, int lookup_flags, GOTO(out, rc = 0); } - rc = revalidate_it_finish(req, 1, it, de); + rc = ll_revalidate_it_finish(req, 1, it, de); if (rc != 0) { ll_intent_release(it); GOTO(out, rc = 0); diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 4493700..c17c997 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -1808,39 +1808,14 @@ int ll_file_flock(struct file *file, int cmd, struct file_lock *file_lock) RETURN(rc); } -static int ll_have_md_lock(struct dentry *de) -{ - struct ll_sb_info *sbi = ll_s2sbi(de->d_sb); - struct lustre_handle lockh; - struct ldlm_res_id res_id = { .name = {0} }; - struct obd_device *obddev; - ldlm_policy_data_t policy = { .l_inodebits = {MDS_INODELOCK_UPDATE}}; - int flags; - ENTRY; - - if (!de->d_inode) - RETURN(0); - - obddev = sbi->ll_md_exp->exp_obd; - res_id.name[0] = fid_seq(ll_inode2fid(de->d_inode)); - res_id.name[1] = fid_num(ll_inode2fid(de->d_inode)); - - CDEBUG(D_INFO, "trying to match res "LPU64"\n", res_id.name[0]); - - flags = LDLM_FL_BLOCK_GRANTED | LDLM_FL_CBPENDING | LDLM_FL_TEST_LOCK; - if (ldlm_lock_match(obddev->obd_namespace, flags, &res_id, LDLM_IBITS, - &policy, LCK_CR|LCK_CW|LCK_PR, &lockh)) { - RETURN(1); - } - - RETURN(0); -} - int ll_inode_revalidate_it(struct dentry *dentry, struct lookup_intent *it) { + struct lookup_intent oit = { .it_op = IT_GETATTR }; + struct md_op_data op_data = { { 0 } }; struct inode *inode = dentry->d_inode; + struct ptlrpc_request *req = NULL; struct ll_inode_info *lli; - struct lov_stripe_md *lsm; + struct ll_sb_info *sbi; int rc; ENTRY; @@ -1848,47 +1823,40 @@ int ll_inode_revalidate_it(struct dentry *dentry, struct lookup_intent *it) CERROR("REPORT THIS LINE TO PETER\n"); RETURN(0); } + sbi = ll_i2sbi(inode); lli = ll_i2info(inode); + CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p),name=%s\n", inode->i_ino, inode->i_generation, inode, dentry->d_name.name); #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0)) lprocfs_counter_incr(ll_i2sbi(inode)->ll_stats, LPROC_LL_REVALIDATE); #endif - if (!ll_have_md_lock(dentry)) { - struct ptlrpc_request *req = NULL; - struct ll_sb_info *sbi = ll_i2sbi(dentry->d_inode); - obd_valid valid = OBD_MD_FLGETATTR; - int ealen = 0; - - if (S_ISREG(inode->i_mode)) { - rc = ll_get_max_mdsize(sbi, &ealen); - if (rc) - RETURN(rc); - valid |= OBD_MD_FLEASIZE | OBD_MD_FLMODEASIZE; - } - rc = md_getattr(sbi->ll_md_exp, ll_inode2fid(inode), - valid, ealen, &req); - if (rc) { - CERROR("failure %d inode %lu\n", rc, inode->i_ino); - RETURN(-abs(rc)); - } - rc = ll_prep_inode(&inode, req, 0, NULL); - if (rc) { - ptlrpc_req_finished(req); - RETURN(rc); - } - ptlrpc_req_finished(req); - } + ll_prepare_md_op_data(&op_data, inode, inode, NULL, 0, 0); + + rc = md_intent_lock(sbi->ll_md_exp, &op_data, NULL, 0, &oit, 0, + &req, ll_mdc_blocking_ast, 0); - lsm = lli->lli_smd; - if (lsm == NULL) /* object not yet allocated, don't validate size */ - RETURN(0); + if (rc < 0) + GOTO(out, rc); - /* ll_glimpse_size will prefer locally cached writes if they extend - * the file */ - rc = ll_glimpse_size(inode, 0); - RETURN(rc); + rc = ll_revalidate_it_finish(req, 1, &oit, dentry); + if (rc) + GOTO(out, rc); + + ll_lookup_finish_locks(&oit, dentry); + + /* object is allocated, validate size */ + if (lli->lli_smd) { + /* ll_glimpse_size will prefer locally cached writes if they + * extend the file */ + rc = ll_glimpse_size(inode, 0); + } + EXIT; +out: + if (req) + ptlrpc_req_finished(req); + return rc; } #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h index 0f28202..c6efc05 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -404,6 +404,8 @@ void ll_unhash_aliases(struct inode *); void ll_frob_intent(struct lookup_intent **itp, struct lookup_intent *deft); void ll_lookup_finish_locks(struct lookup_intent *it, struct dentry *dentry); int ll_dcompare(struct dentry *parent, struct qstr *d_name, struct qstr *name); +int ll_revalidate_it_finish(struct ptlrpc_request *request, int offset, + struct lookup_intent *it, struct dentry *de); /* llite/llite_lib.c */ -- 1.8.3.1