mirror of
https://git.openafs.org/openafs.git
synced 2025-01-19 07:20:11 +00:00
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:
parent
66a5faefc7
commit
9a91e1a9b1
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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])
|
||||||
|
])
|
||||||
|
Loading…
Reference in New Issue
Block a user