diff --git a/acinclude.m4 b/acinclude.m4 index 655fb11ada..c3f5e15b06 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -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 diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c index e2a3e283bd..3118ec73d9 100644 --- a/src/afs/LINUX/osi_vnodeops.c +++ b/src/afs/LINUX/osi_vnodeops.c @@ -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(); diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 index 2f426ce647..b428f37549 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -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 ], + [struct dentry _d; + dget(&_d); + _d.d_count = 1;], + [D_COUNT_INT], + [define if dentry->d_count is an int], + [-Werror]) +])