Linux: 2.6.38: dentry->d_count is not an atomic
authorMarc Dionne <marc.c.dionne@gmail.com>
Thu, 3 Feb 2011 02:55:27 +0000 (21:55 -0500)
committerDerrick Brashear <shadow@dementia.org>
Sat, 12 Feb 2011 22:38:28 +0000 (14:38 -0800)
d_count is now an int protected by the dentry's d_lock.
Take the lock when we use it, instead of using an atomic_*
function.

Change-Id: Ib70e4a5315cc343518fa983e47bc7ff925acfc7f
Reviewed-on: http://gerrit.openafs.org/3883
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>

acinclude.m4
src/afs/LINUX/osi_vnodeops.c
src/cf/linux-test4.m4

index 8041547..5103388 100644 (file)
@@ -904,6 +904,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
                 LINUX_INIT_WORK_HAS_DATA
                 LINUX_REGISTER_SYSCTL_TABLE_NOFLAG
                 LINUX_HAVE_DCACHE_LOCK
+                LINUX_D_COUNT_IS_INT
 
                 dnl If we are guaranteed that keyrings will work - that is
                 dnl  a) The kernel has keyrings enabled
index abf4bf1..b0df0f3 100644 (file)
@@ -1320,8 +1320,17 @@ afs_linux_rename(struct inode *oldip, struct dentry *olddp,
        rehash = newdp;
     }
 
+#if defined(D_COUNT_INT)
+    spin_lock(&olddp->d_lock);
+    if (olddp->d_count > 1) {
+       spin_unlock(&olddp->d_lock);
+       shrink_dcache_parent(olddp);
+    } else
+       spin_unlock(&olddp->d_lock);
+#else
     if (atomic_read(&olddp->d_count) > 1)
        shrink_dcache_parent(olddp);
+#endif
 
     AFS_GLOCK();
     code = afs_rename(VTOAFS(oldip), (char *)oldname, VTOAFS(newip), (char *)newname, credp);
index 6f0fd11..670bd5d 100644 (file)
@@ -582,3 +582,15 @@ AC_DEFUN([LINUX_HAVE_DCACHE_LOCK], [
                        [])
 ])
 
+
+AC_DEFUN([LINUX_D_COUNT_IS_INT], [
+  AC_CHECK_LINUX_BUILD([if dentry->d_count is an int],
+                       [ac_cv_linux_d_count_int],
+                       [#include <linux/dcache.h> ],
+                       [struct dentry _d;
+                       dget(&_d);
+                       _d.d_count = 1;],
+                       [D_COUNT_INT],
+                       [define if dentry->d_count is an int],
+                       [-Werror])
+])