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.
Reviewed-on: http://gerrit.openafs.org/3883
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
(cherry picked from commit
281f5bf5fbb0a546edcce62ef4e097ae9bbdbf73)
Change-Id: Id30054cb110720632f6f4a7fc4d7860cb69cb1e7
Signed-off-by: Anders Kaseorg <andersk@mit.edu>
Reviewed-on: http://gerrit.openafs.org/3999
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Russ Allbery <rra@stanford.edu>
(cherry picked from commit
fe8d833e53938319d1fb6e20153a50a74bed5860)
LINUX_INIT_WORK_HAS_DATA
LINUX_REGISTER_SYSCTL_TABLE_NOFLAG
LINUX_HAVE_DCACHE_LOCK
+ LINUX_D_COUNT_IS_INT
LINUX_SYSCTL_TABLE_CHECKING
LINUX_STRUCT_CTL_TABLE_HAS_CTL_NAME
LINUX_HAVE_IGET
#endif
#if defined(AFS_LINUX24_ENV)
+#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), oldname, VTOAFS(newip), newname, credp);
AFS_GUNLOCK();
[])
])
+
+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])
+])