Loading fs/mount.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -55,7 +55,7 @@ struct mount { int mnt_group_id; /* peer group identifier */ int mnt_group_id; /* peer group identifier */ int mnt_expiry_mark; /* true if marked for expiry */ int mnt_expiry_mark; /* true if marked for expiry */ int mnt_pinned; int mnt_pinned; int mnt_ghosts; struct path mnt_ex_mountpoint; }; }; #define MNT_NS_INTERNAL ERR_PTR(-EINVAL) /* distinct from any mnt_namespace */ #define MNT_NS_INTERNAL ERR_PTR(-EINVAL) /* distinct from any mnt_namespace */ Loading fs/namespace.c +7 −15 Original line number Original line Diff line number Diff line Loading @@ -1136,20 +1136,8 @@ static void namespace_unlock(void) while (!list_empty(&head)) { while (!list_empty(&head)) { mnt = list_first_entry(&head, struct mount, mnt_hash); mnt = list_first_entry(&head, struct mount, mnt_hash); list_del_init(&mnt->mnt_hash); list_del_init(&mnt->mnt_hash); if (mnt_has_parent(mnt)) { if (mnt->mnt_ex_mountpoint.mnt) struct dentry *dentry; path_put(&mnt->mnt_ex_mountpoint); 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); } mntput(&mnt->mnt); mntput(&mnt->mnt); } } } } Loading Loading @@ -1181,8 +1169,12 @@ void umount_tree(struct mount *mnt, int propagate) p->mnt_ns = NULL; p->mnt_ns = NULL; list_del_init(&p->mnt_child); list_del_init(&p->mnt_child); if (mnt_has_parent(p)) { if (mnt_has_parent(p)) { p->mnt_parent->mnt_ghosts++; put_mountpoint(p->mnt_mp); 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; p->mnt_mp = NULL; } } change_mnt_propagation(p, MS_PRIVATE); change_mnt_propagation(p, MS_PRIVATE); Loading fs/pnode.c +1 −2 Original line number Original line Diff line number Diff line Loading @@ -278,8 +278,7 @@ int propagate_mnt(struct mount *dest_mnt, struct mountpoint *dest_mp, */ */ static inline int do_refcount_check(struct mount *mnt, int count) static inline int do_refcount_check(struct mount *mnt, int count) { { int mycount = mnt_get_count(mnt) - mnt->mnt_ghosts; return mnt_get_count(mnt) > count; return (mycount > count); } } /* /* Loading Loading
fs/mount.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -55,7 +55,7 @@ struct mount { int mnt_group_id; /* peer group identifier */ int mnt_group_id; /* peer group identifier */ int mnt_expiry_mark; /* true if marked for expiry */ int mnt_expiry_mark; /* true if marked for expiry */ int mnt_pinned; int mnt_pinned; int mnt_ghosts; struct path mnt_ex_mountpoint; }; }; #define MNT_NS_INTERNAL ERR_PTR(-EINVAL) /* distinct from any mnt_namespace */ #define MNT_NS_INTERNAL ERR_PTR(-EINVAL) /* distinct from any mnt_namespace */ Loading
fs/namespace.c +7 −15 Original line number Original line Diff line number Diff line Loading @@ -1136,20 +1136,8 @@ static void namespace_unlock(void) while (!list_empty(&head)) { while (!list_empty(&head)) { mnt = list_first_entry(&head, struct mount, mnt_hash); mnt = list_first_entry(&head, struct mount, mnt_hash); list_del_init(&mnt->mnt_hash); list_del_init(&mnt->mnt_hash); if (mnt_has_parent(mnt)) { if (mnt->mnt_ex_mountpoint.mnt) struct dentry *dentry; path_put(&mnt->mnt_ex_mountpoint); 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); } mntput(&mnt->mnt); mntput(&mnt->mnt); } } } } Loading Loading @@ -1181,8 +1169,12 @@ void umount_tree(struct mount *mnt, int propagate) p->mnt_ns = NULL; p->mnt_ns = NULL; list_del_init(&p->mnt_child); list_del_init(&p->mnt_child); if (mnt_has_parent(p)) { if (mnt_has_parent(p)) { p->mnt_parent->mnt_ghosts++; put_mountpoint(p->mnt_mp); 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; p->mnt_mp = NULL; } } change_mnt_propagation(p, MS_PRIVATE); change_mnt_propagation(p, MS_PRIVATE); Loading
fs/pnode.c +1 −2 Original line number Original line Diff line number Diff line Loading @@ -278,8 +278,7 @@ int propagate_mnt(struct mount *dest_mnt, struct mountpoint *dest_mp, */ */ static inline int do_refcount_check(struct mount *mnt, int count) static inline int do_refcount_check(struct mount *mnt, int count) { { int mycount = mnt_get_count(mnt) - mnt->mnt_ghosts; return mnt_get_count(mnt) > count; return (mycount > count); } } /* /* Loading