X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fllite%2Fnamei.c;h=dbf6ee0b80d12de395e14f7e5c7530081ca4a706;hp=26c5e6ee8d3511254a3890dc0362199eff7ab68a;hb=51074e76259ac428a7e7a7ac3f189971bf20122f;hpb=c7b8ecade6cdd591aa202e4a2afb53ed20f43cd8 diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c index 26c5e6ee..dbf6ee0 100644 --- a/lustre/llite/namei.c +++ b/lustre/llite/namei.c @@ -348,7 +348,7 @@ static void ll_d_add(struct dentry *de, struct inode *inode) * in ll_revalidate_it. After revaliadate inode will be have hashed aliases * and it triggers BUG_ON in d_instantiate_unique (bug #10954). */ -static struct dentry *ll_find_alias(struct inode *inode, struct dentry *de) +struct dentry *ll_find_alias(struct inode *inode, struct dentry *de) { struct list_head *tmp; struct dentry *dentry; @@ -385,11 +385,8 @@ static struct dentry *ll_find_alias(struct inode *inode, struct dentry *de) continue; dget_locked(dentry); - lock_dentry(dentry); - __d_drop(dentry); - unlock_dentry(dentry); ll_dops_init(dentry, 0, 1); - d_rehash_cond(dentry, 0); /* avoid taking dcache_lock inside */ + ll_dentry_rehash(dentry, 1); spin_unlock(&dcache_lock); cfs_spin_unlock(&ll_lookup_lock); iput(inode); @@ -466,12 +463,7 @@ int ll_lookup_it_finish(struct ptlrpc_request *request, ll_dops_init(*de, 1, 1); } /* we have lookup look - unhide dentry */ - if ((*de)->d_flags & DCACHE_LUSTRE_INVALID && - bits & MDS_INODELOCK_LOOKUP) { - lock_dentry(*de); - (*de)->d_flags &= ~DCACHE_LUSTRE_INVALID; - unlock_dentry(*de); - } + ll_dentry_reset_flags(*de, bits); } else { __u64 ibits; @@ -514,7 +506,7 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry, struct md_op_data *op_data; struct it_cb_data icbd; __u32 opc; - int rc, first = 0; + int rc; ENTRY; if (dentry->d_name.len > ll_i2sbi(parent)->ll_namelen) @@ -540,11 +532,11 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry, } if (it->it_op == IT_GETATTR) { - first = ll_statahead_enter(parent, &dentry, 1); - if (first >= 0) { - ll_statahead_exit(parent, dentry, first); - if (first == 1) - RETURN(retval = dentry); + rc = ll_statahead_enter(parent, &dentry, 0); + if (rc == 1) { + if (dentry == save) + GOTO(out, retval = NULL); + GOTO(out, retval = dentry); } } @@ -577,9 +569,6 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry, GOTO(out, retval = ERR_PTR(rc)); } - if (first == -EEXIST) - ll_statahead_mark(parent, dentry); - if ((it->it_op & IT_OPEN) && dentry->d_inode && !S_ISREG(dentry->d_inode->i_mode) && !S_ISDIR(dentry->d_inode->i_mode)) { @@ -594,6 +583,8 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry, out: if (req) ptlrpc_req_finished(req); + if (it->it_op == IT_GETATTR && (retval == NULL || retval == dentry)) + ll_statahead_mark(parent, dentry); return retval; }