@@ -1307,6 +1307,40 @@ int have_submounts(struct dentry *parent)
EXPORT_SYMBOL(have_submounts);
/*
+ * Search for at least 1 mount point in the dentry's subdirs.
+ * We descend to the next level whenever the d_subdirs
+ * list is non-empty and continue searching.
+ */
+
+static enum d_walk_ret check_local_mount(void *data, struct dentry *dentry)
+{
+ int *ret = data;
+ if (is_local_mountpoint(dentry)) {
+ *ret = 1;
+ return D_WALK_QUIT;
+ }
+ return D_WALK_CONTINUE;
+}
+
+/**
+ * have_local_submounts - check for mounts over a dentry
+ * in the current namespace
+ * @parent: dentry to check.
+ *
+ * Return true if the parent or its subdirectories contain
+ * a mount point
+ */
+int have_local_submounts(struct dentry *parent)
+{
+ int ret = 0;
+
+ d_walk(parent, &ret, check_local_mount, NULL);
+
+ return ret;
+}
+EXPORT_SYMBOL(have_local_submounts);
+
+/*
* Called by mount code to set a mountpoint and check if the mountpoint is
* reachable (e.g. NFS can unhash a directory dentry and then the complete
* subtree can become unreachable).
@@ -255,6 +255,7 @@ extern void d_prune_aliases(struct inode *);
/* test whether we have any submounts in a subdir tree */
extern int have_submounts(struct dentry *);
+extern int have_local_submounts(struct dentry *);
/*
* This adds the entry to the hash queues.
The have_submounts() function checks if a dentry is a mountpoint in any namespace but autofs needs to know if the dentry is a mountpoint within the current namespace. Add have_local_submounts() to to do this. Signed-off-by: Ian Kent <raven@themaw.net> Cc: Al Viro <viro@ZenIV.linux.org.uk> Cc: Eric W. Biederman <ebiederm@xmission.com> Cc: Omar Sandoval <osandov@osandov.com> --- fs/dcache.c | 34 ++++++++++++++++++++++++++++++++++ include/linux/dcache.h | 1 + 2 files changed, 35 insertions(+) -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html