diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2013-09-05 14:39:11 +0200 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-09-05 16:23:50 -0400 |
commit | eed810076685c77dc9a8c5c3593e641c93caed1c (patch) | |
tree | 5aba507073b0a7e29dfa0739272dfeda16eb5e29 /fs/internal.h | |
parent | 848ac114e847af3f1f9141c90a39ebe79bdb13b3 (diff) | |
download | linux-eed810076685c77dc9a8c5c3593e641c93caed1c.tar.gz linux-eed810076685c77dc9a8c5c3593e641c93caed1c.tar.bz2 linux-eed810076685c77dc9a8c5c3593e641c93caed1c.zip |
vfs: check unlinked ancestors before mount
We check submounts before doing d_drop() on a non-empty directory dentry in
NFS (have_submounts()), but we do not exclude a racing mount. Nor do we
prevent mounts to be added to the disconnected subtree using relative paths
after the d_drop().
This patch fixes these issues by checking for unlinked (unhashed, non-root)
ancestors before proceeding with the mount. This is done with rename
seqlock taken for write and with ->d_lock grabbed on each ancestor in turn,
including our dentry itself. This ensures that the only one of
check_submounts_and_drop() or has_unlinked_ancestor() can succeed.
Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/internal.h')
-rw-r--r-- | fs/internal.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/internal.h b/fs/internal.h index 7c5f01cf619d..d20893795526 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -126,6 +126,7 @@ extern int invalidate_inodes(struct super_block *, bool); * dcache.c */ extern struct dentry *__d_alloc(struct super_block *, const struct qstr *); +extern int d_set_mounted(struct dentry *dentry); /* * read_write.c |