OSDN Git Service

mnt: Add MNT_UMOUNT flag
authorEric W. Biederman <ebiederm@xmission.com>
Tue, 23 Dec 2014 00:30:08 +0000 (18:30 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 6 May 2015 20:03:50 +0000 (22:03 +0200)
commit 590ce4bcbfb4e0462a720a4ad901e84416080bba upstream.

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

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/namespace.c
fs/pnode.c
include/linux/mount.h

index 18df0af..9f3c7e5 100644 (file)
@@ -1333,8 +1333,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 */