In preparation for upcoming changes in the 3.12 cycle, d_lockref
was introduced late in the 3.11 cycle. The dentry's d_lock and
d_count are moved to this new structure. A new d_lock macro makes
the change transparent for locking, but direct users of d_count
must adapt. A new d_count() helper function is provided and
should now be used.
Use the new d_count() helper function if available, and move
some of the ifdef logic into a helper compatibility function.
Reviewed-on: http://gerrit.openafs.org/10219
Tested-by: Jeffrey Altman <jaltman@your-file-system.com>
Reviewed-by: Simon Wilkinson <simonxwilkinson@gmail.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>
(cherry picked from commit
1f577e41b65e9bd213a915a296ecf5bedd17fcc1)
Reviewed-on: http://gerrit.openafs.org/10241
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
(cherry picked from commit
8e14537c605b3b6867c923dfef782492191939c7)
Change-Id: Ia16740e45824971dc8016971429c7926e1378f6c
Reviewed-on: http://gerrit.openafs.org/10276
Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
Tested-by: Stephan Wiesand <stephan.wiesand@desy.de>
AC_CHECK_LINUX_FUNC([d_alloc_anon],
[#include <linux/fs.h>],
[d_alloc_anon(NULL);])
+ AC_CHECK_LINUX_FUNC([d_count],
+ [#include <linux/dcache.h>],
+ [d_count(NULL);])
AC_CHECK_LINUX_FUNC([d_make_root],
[#include <linux/fs.h>],
[d_make_root(NULL);])
#endif
}
+static inline int
+afs_dentry_count(struct dentry *dp)
+{
+#if defined(HAVE_LINUX_D_COUNT)
+ return d_count(dp);
+#elif defined(D_COUNT_INT)
+ return dp->d_count;
+#else
+ return atomic_read(&dp->d_count);
+#endif
+}
+
+static inline void
+afs_maybe_shrink_dcache(struct dentry *dp)
+{
+#if defined(HAVE_LINUX_D_COUNT) || defined(D_COUNT_INT)
+ spin_lock(&dp->d_lock);
+ if (afs_dentry_count(dp) > 1) {
+ spin_unlock(&dp->d_lock);
+ shrink_dcache_parent(dp);
+ } else
+ spin_unlock(&dp->d_lock);
+#else
+ if (afs_dentry_count(dp) > 1)
+ shrink_dcache_parent(dp);
+#endif
+}
+
#endif /* AFS_LINUX_OSI_COMPAT_H */
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)
- shrink_dcache_parent(olddp);
-#endif
+ afs_maybe_shrink_dcache(olddp);
AFS_GLOCK();
code = afs_rename(VTOAFS(oldip), (char *)oldname, VTOAFS(newip), (char *)newname, credp);