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: I45caa6aef451a7f93bfa43dfb1ebe9b0b856fbd0
Reviewed-on: http://gerrit.openafs.org/3935
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
This commit is contained in:
Marc Dionne 2011-02-02 21:55:27 -05:00 committed by Jeffrey Altman
parent 66a5faefc7
commit 9a91e1a9b1
3 changed files with 22 additions and 0 deletions

View File

@ -905,6 +905,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
LINUX_INIT_WORK_HAS_DATA LINUX_INIT_WORK_HAS_DATA
LINUX_REGISTER_SYSCTL_TABLE_NOFLAG LINUX_REGISTER_SYSCTL_TABLE_NOFLAG
LINUX_HAVE_DCACHE_LOCK LINUX_HAVE_DCACHE_LOCK
LINUX_D_COUNT_IS_INT
dnl If we are guaranteed that keyrings will work - that is dnl If we are guaranteed that keyrings will work - that is
dnl a) The kernel has keyrings enabled dnl a) The kernel has keyrings enabled

View File

@ -1306,8 +1306,17 @@ afs_linux_rename(struct inode *oldip, struct dentry *olddp,
rehash = newdp; 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) if (atomic_read(&olddp->d_count) > 1)
shrink_dcache_parent(olddp); shrink_dcache_parent(olddp);
#endif
AFS_GLOCK(); AFS_GLOCK();
code = afs_rename(VTOAFS(oldip), (char *)oldname, VTOAFS(newip), (char *)newname, credp); code = afs_rename(VTOAFS(oldip), (char *)oldname, VTOAFS(newip), (char *)newname, credp);

View File

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