Whamcloud - gitweb
LU-3409 llite: silence lockdep warning in ll_md_blocking_ast
[fs/lustre-release.git] / lustre / llite / dcache.c
index 6ce32f7..029e621 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, Whamcloud, Inc.
+ * Copyright (c) 2011, 2013, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -191,7 +191,8 @@ static int ll_ddelete(HAVE_D_DELETE_CONST struct dentry *de)
 
        /* Disable this piece of code temproarily because this is called
         * inside dcache_lock so it's not appropriate to do lots of work
-        * here. */
+        * here. ATTENTION: Before this piece of code enabling, LU-2487 must be
+        * resolved. */
 #if 0
        /* if not ldlm lock for this inode, set i_nlink to 0 so that
         * this inode can be recycled later b=20433 */
@@ -259,31 +260,28 @@ int ll_dops_init(struct dentry *de, int block, int init_sa)
 
 void ll_intent_drop_lock(struct lookup_intent *it)
 {
-        struct lustre_handle *handle;
-
         if (it->it_op && it->d.lustre.it_lock_mode) {
-               struct ldlm_lock *lock;
-
-               handle = (struct lustre_handle *)&it->d.lustre.it_lock_handle;
-               lock = ldlm_handle2lock(handle);
-               if (lock != NULL) {
-                       /* it can only be allowed to match after layout is
-                        * applied to inode otherwise false layout would be
-                        * seen. Applying layout shoud happen before dropping
-                        * the intent lock. */
-                       if (it->d.lustre.it_lock_bits & MDS_INODELOCK_LAYOUT)
-                               ldlm_lock_allow_match(lock);
-                       LDLM_LOCK_PUT(lock);
-               }
+               struct lustre_handle handle;
+
+               handle.cookie = it->d.lustre.it_lock_handle;
 
                 CDEBUG(D_DLMTRACE, "releasing lock with cookie "LPX64
-                       " from it %p\n", handle->cookie, it);
-                ldlm_lock_decref(handle, it->d.lustre.it_lock_mode);
+                       " from it %p\n", handle.cookie, it);
+                ldlm_lock_decref(&handle, it->d.lustre.it_lock_mode);
 
                 /* bug 494: intent_release may be called multiple times, from
                  * this thread and we don't want to double-decref this lock */
                 it->d.lustre.it_lock_mode = 0;
-        }
+               if (it->d.lustre.it_remote_lock_mode != 0) {
+                       handle.cookie = it->d.lustre.it_remote_lock_handle;
+
+                       CDEBUG(D_DLMTRACE, "releasing remote lock with cookie"
+                              LPX64" from it %p\n", handle.cookie, it);
+                       ldlm_lock_decref(&handle,
+                                        it->d.lustre.it_remote_lock_mode);
+                       it->d.lustre.it_remote_lock_mode = 0;
+               }
+       }
 }
 
 void ll_intent_release(struct lookup_intent *it)
@@ -331,7 +329,7 @@ void ll_invalidate_aliases(struct inode *inode)
                         libcfs_debug_dumpstack(NULL);
                 }
 
-               d_lustre_invalidate(dentry);
+               d_lustre_invalidate(dentry, 0);
        }
        ll_unlock_dcache(inode);
 
@@ -351,7 +349,7 @@ int ll_revalidate_it_finish(struct ptlrpc_request *request,
         if (it_disposition(it, DISP_LOOKUP_NEG))
                 RETURN(-ENOENT);
 
-        rc = ll_prep_inode(&de->d_inode, request, NULL);
+        rc = ll_prep_inode(&de->d_inode, request, NULL, it);
 
         RETURN(rc);
 }
@@ -563,16 +561,33 @@ out:
                ll_invalidate_aliases(de->d_inode);
        } else {
                __u64 bits = 0;
+               __u64 matched_bits = 0;
 
                CDEBUG(D_DENTRY, "revalidated dentry %.*s (%p) parent %p "
                       "inode %p refc %d\n", de->d_name.len,
                       de->d_name.name, de, de->d_parent, de->d_inode,
                       d_refcount(de));
+
                ll_set_lock_data(exp, de->d_inode, it, &bits);
-               if ((bits & MDS_INODELOCK_LOOKUP) && d_lustre_invalid(de))
+
+               /* Note: We have to match both LOOKUP and PERM lock
+                * here to make sure the dentry is valid and no one
+                * changing the permission.
+                * But if the client connects < 2.4 server, which will
+                * only grant LOOKUP lock, so we can only Match LOOKUP
+                * lock for old server */
+               if (exp_connect_flags(ll_i2mdexp(de->d_inode)) &&
+                                                       OBD_CONNECT_LVB_TYPE)
+                       matched_bits =
+                               MDS_INODELOCK_LOOKUP | MDS_INODELOCK_PERM;
+               else
+                       matched_bits = MDS_INODELOCK_LOOKUP;            
+
+               if (((bits & matched_bits) == matched_bits) &&
+                   d_lustre_invalid(de))
                        d_lustre_revalidate(de);
-                ll_lookup_finish_locks(it, de);
-        }
+               ll_lookup_finish_locks(it, de);
+       }
 
 mark:
         if (it != NULL && it->it_op == IT_GETATTR && rc > 0)