diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2015-04-01 18:30:06 -0500 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2015-04-09 11:39:57 -0500 |
commit | e0c9c0afd2fc958ffa34b697972721d81df8a56f (patch) | |
tree | d90b2370714bb9bcbcf482039eaf97d0bd79f6b0 /fs/namespace.c | |
parent | f53e57975151f54ad8caa1b0ac8a78091cd5700a (diff) | |
download | linux-stable-e0c9c0afd2fc958ffa34b697972721d81df8a56f.tar.gz linux-stable-e0c9c0afd2fc958ffa34b697972721d81df8a56f.tar.bz2 linux-stable-e0c9c0afd2fc958ffa34b697972721d81df8a56f.zip |
mnt: Update detach_mounts to leave mounts connected
Now that it is possible to lazily unmount an entire mount tree and
leave the individual mounts connected to each other add a new flag
UMOUNT_CONNECTED to umount_tree to force this behavior and use
this flag in detach_mounts.
This closes a bug where the deletion of a file or directory could
trigger an unmount and reveal data under a mount point.
Cc: stable@vger.kernel.org
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Diffstat (limited to 'fs/namespace.c')
-rw-r--r-- | fs/namespace.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/namespace.c b/fs/namespace.c index e8f7f8c58c3c..1f4f9dac6e5a 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -1348,6 +1348,7 @@ static inline void namespace_lock(void) enum umount_tree_flags { UMOUNT_SYNC = 1, UMOUNT_PROPAGATE = 2, + UMOUNT_CONNECTED = 4, }; /* * mount_lock must be held @@ -1386,7 +1387,10 @@ static void umount_tree(struct mount *mnt, enum umount_tree_flags how) if (how & UMOUNT_SYNC) p->mnt.mnt_flags |= MNT_SYNC_UMOUNT; - disconnect = !IS_MNT_LOCKED_AND_LAZY(p); + disconnect = !(((how & UMOUNT_CONNECTED) && + mnt_has_parent(p) && + (p->mnt_parent->mnt.mnt_flags & MNT_UMOUNT)) || + IS_MNT_LOCKED_AND_LAZY(p)); pin_insert_group(&p->mnt_umount, &p->mnt_parent->mnt, disconnect ? &unmounted : NULL); @@ -1529,7 +1533,7 @@ void __detach_mounts(struct dentry *dentry) umount_mnt(p); } } - else umount_tree(mnt, 0); + else umount_tree(mnt, UMOUNT_CONNECTED); } unlock_mount_hash(); put_mountpoint(mp); |