aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2015-04-01 19:30:06 -0400
committerEric W. Biederman <ebiederm@xmission.com>2015-04-09 12:39:57 -0400
commite0c9c0afd2fc958ffa34b697972721d81df8a56f (patch)
treed90b2370714bb9bcbcf482039eaf97d0bd79f6b0 /fs
parentf53e57975151f54ad8caa1b0ac8a78091cd5700a (diff)
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')
-rw-r--r--fs/namespace.c8
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)
1348enum umount_tree_flags { 1348enum umount_tree_flags {
1349 UMOUNT_SYNC = 1, 1349 UMOUNT_SYNC = 1,
1350 UMOUNT_PROPAGATE = 2, 1350 UMOUNT_PROPAGATE = 2,
1351 UMOUNT_CONNECTED = 4,
1351}; 1352};
1352/* 1353/*
1353 * mount_lock must be held 1354 * mount_lock must be held
@@ -1386,7 +1387,10 @@ static void umount_tree(struct mount *mnt, enum umount_tree_flags how)
1386 if (how & UMOUNT_SYNC) 1387 if (how & UMOUNT_SYNC)
1387 p->mnt.mnt_flags |= MNT_SYNC_UMOUNT; 1388 p->mnt.mnt_flags |= MNT_SYNC_UMOUNT;
1388 1389
1389 disconnect = !IS_MNT_LOCKED_AND_LAZY(p); 1390 disconnect = !(((how & UMOUNT_CONNECTED) &&
1391 mnt_has_parent(p) &&
1392 (p->mnt_parent->mnt.mnt_flags & MNT_UMOUNT)) ||
1393 IS_MNT_LOCKED_AND_LAZY(p));
1390 1394
1391 pin_insert_group(&p->mnt_umount, &p->mnt_parent->mnt, 1395 pin_insert_group(&p->mnt_umount, &p->mnt_parent->mnt,
1392 disconnect ? &unmounted : NULL); 1396 disconnect ? &unmounted : NULL);
@@ -1529,7 +1533,7 @@ void __detach_mounts(struct dentry *dentry)
1529 umount_mnt(p); 1533 umount_mnt(p);
1530 } 1534 }
1531 } 1535 }
1532 else umount_tree(mnt, 0); 1536 else umount_tree(mnt, UMOUNT_CONNECTED);
1533 } 1537 }
1534 unlock_mount_hash(); 1538 unlock_mount_hash();
1535 put_mountpoint(mp); 1539 put_mountpoint(mp);