mnt: Add MNT_UMOUNT flag
authorEric W. Biederman <ebiederm@xmission.com>
Tue, 23 Dec 2014 00:30:08 +0000 (18:30 -0600)
committerEric W. Biederman <ebiederm@xmission.com>
Fri, 3 Apr 2015 01:34:18 +0000 (20:34 -0500)
In some instances it is necessary to know if the the unmounting
process has begun on a mount.  Add MNT_UMOUNT to make that reliably
testable.

This fix gets used in fixing locked mounts in MNT_DETACH

Cc: stable@vger.kernel.org
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
fs/namespace.c
fs/pnode.c
include/linux/mount.h

index 54cbef1..d170814 100644 (file)
@@ -1331,8 +1331,10 @@ static void umount_tree(struct mount *mnt, enum umount_tree_flags how)
        struct mount *p;
 
        /* Gather the mounts to umount */
-       for (p = mnt; p; p = next_mnt(p, mnt))
+       for (p = mnt; p; p = next_mnt(p, mnt)) {
+               p->mnt.mnt_flags |= MNT_UMOUNT;
                list_move(&p->mnt_list, &tmp_list);
+       }
 
        /* Hide the mounts from lookup_mnt and mnt_mounts */
        list_for_each_entry(p, &tmp_list, mnt_list) {
index bf012af..ac3aa0d 100644 (file)
@@ -384,6 +384,7 @@ static void __propagate_umount(struct mount *mnt)
                if (child && list_empty(&child->mnt_mounts)) {
                        list_del_init(&child->mnt_child);
                        hlist_del_init_rcu(&child->mnt_hash);
+                       child->mnt.mnt_flags |= MNT_UMOUNT;
                        list_move_tail(&child->mnt_list, &mnt->mnt_list);
                }
        }
index c2c561d..564beee 100644 (file)
@@ -61,6 +61,7 @@ struct mnt_namespace;
 #define MNT_DOOMED             0x1000000
 #define MNT_SYNC_UMOUNT                0x2000000
 #define MNT_MARKED             0x4000000
+#define MNT_UMOUNT             0x8000000
 
 struct vfsmount {
        struct dentry *mnt_root;        /* root of the mounted tree */