Whamcloud - gitweb
Branch HEAD
[fs/lustre-release.git] / lustre / llite / dcache.c
index 2627a45..0f7c7e6 100644 (file)
@@ -216,7 +216,7 @@ int ll_drop_dentry(struct dentry *dentry)
                 spin_lock(&dcache_lock);
                 return 1;
         }
-        /* disconected dentry can not be find without lookup, because we 
+        /* disconected dentry can not be find without lookup, because we
          * not need his to unhash or mark invalid. */
         if (dentry->d_flags & DCACHE_DISCONNECTED) {
                 unlock_dentry(dentry);
@@ -309,7 +309,7 @@ int ll_revalidate_it_finish(struct ptlrpc_request *request,
         if (!request)
                 RETURN(0);
 
-        if (it_disposition(it, DISP_LOOKUP_NEG)) 
+        if (it_disposition(it, DISP_LOOKUP_NEG))
                 RETURN(-ENOENT);
 
         rc = ll_prep_inode(&de->d_inode, request, NULL);
@@ -346,7 +346,7 @@ void ll_frob_intent(struct lookup_intent **itp, struct lookup_intent *deft)
         struct lookup_intent *it = *itp;
 #ifdef HAVE_VFS_INTENT_PATCHES
         if (it) {
-                LASSERTF(it->it_magic == INTENT_MAGIC, 
+                LASSERTF(it->it_magic == INTENT_MAGIC,
                          "%p has bad intent magic: %x\n",
                          it, it->it_magic);
         }
@@ -477,7 +477,10 @@ do_lock:
         it->it_flags &= ~O_CHECK_STALE;
         ll_finish_md_op_data(op_data);
         if (it->it_op == IT_GETATTR && !first)
-                ll_statahead_exit(de, rc);
+                /* If there are too many locks on client-side, then some
+                 * locks taken by statahead maybe dropped automatically
+                 * before the real "revalidate" using them. */
+                ll_statahead_exit(de, req == NULL ? rc : 0);
         else if (first == -EEXIST)
                 ll_statahead_mark(de);
 
@@ -493,6 +496,13 @@ do_lock:
                 if (rc != -ESTALE) {
                         CDEBUG(D_INFO, "ll_intent_lock: rc %d : it->it_status "
                                "%d\n", rc, it->d.lustre.it_status);
+                } else {
+#ifndef HAVE_VFS_INTENT_PATCHES
+                        if (it_disposition(it, DISP_OPEN_OPEN) &&
+                            !it_open_error(DISP_OPEN_OPEN, it))
+                                /* server have valid open - close file first*/
+                                ll_release_openhandle(de, it);
+#endif
                 }
                 GOTO(out, rc = 0);
         }
@@ -505,8 +515,8 @@ revalidate_finish:
                 GOTO(out, rc = 0);
         }
 
-        if ((it->it_op & IT_OPEN) && de->d_inode && 
-            !S_ISREG(de->d_inode->i_mode) && 
+        if ((it->it_op & IT_OPEN) && de->d_inode &&
+            !S_ISREG(de->d_inode->i_mode) &&
             !S_ISDIR(de->d_inode->i_mode)) {
                 ll_release_openhandle(de, it);
         }
@@ -614,7 +624,7 @@ out_sa:
         if (it && it->it_op == IT_GETATTR && rc == 1) {
                 first = ll_statahead_enter(de->d_parent->d_inode, &de, 0);
                 if (!first)
-                        ll_statahead_exit(de, rc);
+                        ll_statahead_exit(de, 1);
                 else if (first == -EEXIST)
                         ll_statahead_mark(de);
         }
@@ -751,16 +761,20 @@ int ll_revalidate_nd(struct dentry *dentry, struct nameidata *nd)
                                                (struct ptlrpc_request *)
                                                   it->d.lustre.it_data);
                         } else {
-                                struct file *filp;
-
-                                nd->intent.open.file->private_data = it;
-                                filp = lookup_instantiate_filp(nd, dentry,NULL);
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17))
 /* 2.6.1[456] have a bug in open_namei() that forgets to check
  * nd->intent.open.file for error, so we need to return it as lookup's result
  * instead */
-                                if (IS_ERR(filp))
-                                        rc = 0;
+                                struct file *filp;
+
+                                nd->intent.open.file->private_data = it;
+                                filp = lookup_instantiate_filp(nd, dentry,NULL);
+                                if (IS_ERR(filp)) {
+                                        rc = PTR_ERR(filp);
+                                }
+#else
+                                nd->intent.open.file->private_data = it;
+                                (void)lookup_instantiate_filp(nd, dentry,NULL);
 #endif
                         }
 #else