Whamcloud - gitweb
ORNL-7 replace statahead hacking with its own cache
[fs/lustre-release.git] / lustre / llite / namei.c
index 26c5e6e..dbf6ee0 100644 (file)
@@ -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;
 }