Whamcloud - gitweb
ORNL-26 prevent call md_set_lock_data() repeatly
[fs/lustre-release.git] / lustre / llite / namei.c
index 783283c..26c5e6e 100644 (file)
@@ -132,10 +132,12 @@ struct inode *ll_iget(struct super_block *sb, ino_t hash,
 
         if (inode) {
                 if (inode->i_state & I_NEW) {
-                        int rc;
+                        int rc = 0;
 
                         ll_read_inode2(inode, md);
-                        rc = cl_inode_init(inode, md);
+                        if (S_ISREG(inode->i_mode) &&
+                            ll_i2info(inode)->lli_clob == NULL)
+                                rc = cl_inode_init(inode, md);
                         if (rc != 0) {
                                 md->lsm = NULL;
                                 make_bad_inode(inode);
@@ -430,7 +432,6 @@ int ll_lookup_it_finish(struct ptlrpc_request *request,
         struct it_cb_data *icbd = data;
         struct dentry **de = icbd->icbd_childp;
         struct inode *parent = icbd->icbd_parent;
-        struct ll_sb_info *sbi = ll_i2sbi(parent);
         struct inode *inode = NULL;
         int rc;
         ENTRY;
@@ -439,16 +440,13 @@ int ll_lookup_it_finish(struct ptlrpc_request *request,
          * when I return */
         if (!it_disposition(it, DISP_LOOKUP_NEG)) {
                 struct dentry *save = *de;
-                __u32 bits;
+                __u64 bits = 0;
 
                 rc = ll_prep_inode(&inode, request, (*de)->d_sb);
                 if (rc)
                         RETURN(rc);
 
-                CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%lu/%u)\n",
-                       inode, inode->i_ino, inode->i_generation);
-                md_set_lock_data(sbi->ll_md_exp,
-                                 &it->d.lustre.it_lock_handle, inode, &bits);
+                ll_set_lock_data(ll_i2sbi(parent)->ll_md_exp, inode, it, &bits);
 
                 /* We used to query real size from OSTs here, but actually
                    this is not needed. For stat() calls size would be updated
@@ -468,7 +466,8 @@ int ll_lookup_it_finish(struct ptlrpc_request *request,
                                 ll_dops_init(*de, 1, 1);
                 }
                 /* we have lookup look - unhide dentry */
-                if (bits & MDS_INODELOCK_LOOKUP) {
+                if ((*de)->d_flags & DCACHE_LUSTRE_INVALID &&
+                    bits & MDS_INODELOCK_LOOKUP) {
                         lock_dentry(*de);
                         (*de)->d_flags &= ~DCACHE_LUSTRE_INVALID;
                         unlock_dentry(*de);
@@ -748,8 +747,7 @@ static struct inode *ll_create_node(struct inode *dir, const char *name,
          * stuff it in the lock. */
         CDEBUG(D_DLMTRACE, "setting l_ast_data to inode %p (%lu/%u)\n",
                inode, inode->i_ino, inode->i_generation);
-        md_set_lock_data(sbi->ll_md_exp,
-                         &it->d.lustre.it_lock_handle, inode, NULL);
+        ll_set_lock_data(sbi->ll_md_exp, inode, it, NULL);
         EXIT;
  out:
         ptlrpc_req_finished(request);