vfs: check unlinked ancestors before mount
authorMiklos Szeredi <miklos@szeredi.hu>
Thu, 5 Sep 2013 12:39:11 +0000 (14:39 +0200)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 5 Sep 2013 20:23:50 +0000 (16:23 -0400)
commiteed810076685c77dc9a8c5c3593e641c93caed1c
tree5aba507073b0a7e29dfa0739272dfeda16eb5e29
parent848ac114e847af3f1f9141c90a39ebe79bdb13b3
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>
fs/dcache.c
fs/internal.h
fs/namespace.c