Linux: 2.6.38: dentry->d_count is not an atomic

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 281f5bf5fb)

Change-Id: Id6b17d9cfe18d348a66df02f6b309fc53b00da86
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>
Reviewed-on: http://gerrit.openafs.org/4044
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>
This commit is contained in:
Marc Dionne 2011-02-02 21:55:27 -05:00 committed by Derrick Brashear
parent 2c3b79c8c2
commit 7c3999e05c
3 changed files with 22 additions and 0 deletions

View File

@ -818,6 +818,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
LINUX_SYSCTL_TABLE_CHECKING
LINUX_STRUCT_CTL_TABLE_HAS_CTL_NAME
LINUX_HAVE_IGET

View File

@ -1396,8 +1396,17 @@ afs_linux_rename(struct inode *oldip, struct dentry *olddp,
#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
#endif
AFS_GLOCK();

View File

@ -1327,3 +1327,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])
])