Whamcloud - gitweb
- landing of b_hd_cleanup_merge to HEAD.
[fs/lustre-release.git] / lustre / kernel_patches / patches / vfs_races-2.6-vanilla.patch
diff --git a/lustre/kernel_patches/patches/vfs_races-2.6-vanilla.patch b/lustre/kernel_patches/patches/vfs_races-2.6-vanilla.patch
new file mode 100644 (file)
index 0000000..ccca64d
--- /dev/null
@@ -0,0 +1,65 @@
+Index: linux-2.6.7-vanilla/fs/dcache.c
+===================================================================
+--- linux-2.6.7-vanilla.orig/fs/dcache.c       2004-07-01 12:09:19.000000000 +0300
++++ linux-2.6.7-vanilla/fs/dcache.c    2004-07-01 12:29:12.510193264 +0300
+@@ -219,7 +219,14 @@
+               spin_unlock(&dcache_lock);
+               return 0;
+       }
+-      /*
++
++        /* network invalidation by Lustre */
++      if (dentry->d_flags & DCACHE_LUSTRE_INVALID) {
++              spin_unlock(&dcache_lock);
++              return 0;
++      }
++
++        /*
+        * Check whether to do a partial shrink_dcache
+        * to get rid of unused child entries.
+        */
+@@ -1114,19 +1121,28 @@
+  * Adds a dentry to the hash according to its name.
+  */
+  
+-void d_rehash(struct dentry * entry)
++void __d_rehash(struct dentry * entry, int lock)
+ {
+       struct hlist_head *list = d_hash(entry->d_parent, entry->d_name.hash);
+-      spin_lock(&dcache_lock);
++      if (lock)
++              spin_lock(&dcache_lock);
+       spin_lock(&entry->d_lock);
+       entry->d_flags &= ~DCACHE_UNHASHED;
+       spin_unlock(&entry->d_lock);
+       entry->d_bucket = list;
+       hlist_add_head_rcu(&entry->d_hash, list);
+-      spin_unlock(&dcache_lock);
++      if (lock)
++              spin_unlock(&dcache_lock);
+ }
++EXPORT_SYMBOL(__d_rehash);
++
++void d_rehash(struct dentry * entry)
++{
++      __d_rehash(entry, 1);
++ }
++
+ #define do_switch(x,y) do { \
+       __typeof__ (x) __tmp = x; \
+       x = y; y = __tmp; } while (0)
+Index: linux-2.6.7-vanilla/include/linux/dcache.h
+===================================================================
+--- linux-2.6.7-vanilla.orig/include/linux/dcache.h    2004-07-01 12:24:53.602553208 +0300
++++ linux-2.6.7-vanilla/include/linux/dcache.h 2004-07-01 12:27:29.757814000 +0300
+@@ -159,6 +159,8 @@
+ #define DCACHE_REFERENCED     0x0008  /* Recently used, don't discard. */
+ #define DCACHE_UNHASHED               0x0010  
++#define DCACHE_LUSTRE_INVALID     0x0020  /* Lustre invalidated */
++
+ extern spinlock_t dcache_lock;