Whamcloud - gitweb
b=17807
[fs/lustre-release.git] / lustre / llite / dcache.c
index 95e0694..31fdff5 100644 (file)
@@ -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);
         }
@@ -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);
         }
@@ -760,7 +770,7 @@ int ll_revalidate_nd(struct dentry *dentry, struct nameidata *nd)
  * nd->intent.open.file for error, so we need to return it as lookup's result
  * instead */
                                 if (IS_ERR(filp))
-                                        rc = 0;
+                                        rc = PTR_ERR(filp);
 #endif
                         }
 #else