namespace.c: get rid of mnt_ghosts
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 29 Sep 2013 03:10:55 +0000 (23:10 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 25 Oct 2013 03:34:58 +0000 (23:34 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/mount.h
fs/namespace.c
fs/pnode.c

index 64a858143ff923ab80499d5a865bde9de2257314..3168dc41bad5b5529f0aa4d68868c0060f65ccef 100644 (file)
@@ -55,7 +55,7 @@ struct mount {
        int mnt_group_id;               /* peer group identifier */
        int mnt_expiry_mark;            /* true if marked for expiry */
        int mnt_pinned;
-       int mnt_ghosts;
+       struct path mnt_ex_mountpoint;
 };
 
 #define MNT_NS_INTERNAL ERR_PTR(-EINVAL) /* distinct from any mnt_namespace */
index c8d214ce30c67ed303f412a110df49f9d711c0b9..846ea43ab0c6392cb817504a25f93d35c98d0564 100644 (file)
@@ -1136,20 +1136,8 @@ static void namespace_unlock(void)
        while (!list_empty(&head)) {
                mnt = list_first_entry(&head, struct mount, mnt_hash);
                list_del_init(&mnt->mnt_hash);
-               if (mnt_has_parent(mnt)) {
-                       struct dentry *dentry;
-                       struct mount *m;
-
-                       br_write_lock(&vfsmount_lock);
-                       dentry = mnt->mnt_mountpoint;
-                       m = mnt->mnt_parent;
-                       mnt->mnt_mountpoint = mnt->mnt.mnt_root;
-                       mnt->mnt_parent = mnt;
-                       m->mnt_ghosts--;
-                       br_write_unlock(&vfsmount_lock);
-                       dput(dentry);
-                       mntput(&m->mnt);
-               }
+               if (mnt->mnt_ex_mountpoint.mnt)
+                       path_put(&mnt->mnt_ex_mountpoint);
                mntput(&mnt->mnt);
        }
 }
@@ -1181,8 +1169,12 @@ void umount_tree(struct mount *mnt, int propagate)
                p->mnt_ns = NULL;
                list_del_init(&p->mnt_child);
                if (mnt_has_parent(p)) {
-                       p->mnt_parent->mnt_ghosts++;
                        put_mountpoint(p->mnt_mp);
+                       /* move the reference to mountpoint into ->mnt_ex_mountpoint */
+                       p->mnt_ex_mountpoint.dentry = p->mnt_mountpoint;
+                       p->mnt_ex_mountpoint.mnt = &p->mnt_parent->mnt;
+                       p->mnt_mountpoint = p->mnt.mnt_root;
+                       p->mnt_parent = p;
                        p->mnt_mp = NULL;
                }
                change_mnt_propagation(p, MS_PRIVATE);
index 9af0df15256e9405082fdb59d1a2c6fe97fb8e59..3cfd48cf887e1524fba01dc70d616597a3866ad8 100644 (file)
@@ -278,8 +278,7 @@ out:
  */
 static inline int do_refcount_check(struct mount *mnt, int count)
 {
-       int mycount = mnt_get_count(mnt) - mnt->mnt_ghosts;
-       return (mycount > count);
+       return mnt_get_count(mnt) > count;
 }
 
 /*