Commit 01619491 authored by Ian Kent's avatar Ian Kent Committed by Al Viro

vfs: add path_has_submounts()

d_mountpoint() can only be used reliably to establish if a dentry is
not mounted in any namespace. It isn't aware of the possibility there
may be multiple mounts using the given dentry, possibly in a different

Add function, path_has_submounts(), that checks is a struct path contains
mounts (or is a mountpoint itself) to handle this case.

Link: default avatarIan Kent <>
Cc: Al Viro <>
Cc: Eric W. Biederman <>
Cc: Omar Sandoval <>
Signed-off-by: default avatarAndrew Morton <>
Signed-off-by: default avatarAl Viro <>
parent c6609c0a
......@@ -1306,6 +1306,45 @@ int have_submounts(struct dentry *parent)
struct check_mount {
struct vfsmount *mnt;
unsigned int mounted;
static enum d_walk_ret path_check_mount(void *data, struct dentry *dentry)
struct check_mount *info = data;
struct path path = { .mnt = info->mnt, .dentry = dentry };
if (likely(!d_mountpoint(dentry)))
if (__path_is_mountpoint(&path)) {
info->mounted = 1;
return D_WALK_QUIT;
* path_has_submounts - check for mounts over a dentry in the
* current namespace.
* @parent: path to check.
* Return true if the parent or its subdirectories contain
* a mount point in the current namespace.
int path_has_submounts(const struct path *parent)
struct check_mount data = { .mnt = parent->mnt, .mounted = 0 };
d_walk(parent->dentry, &data, path_check_mount, NULL);
return data.mounted;
* 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
......@@ -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 path_has_submounts(const struct path *);
* This adds the entry to the hash queues.
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment