提交 aba809cf 编写于 作者: A Al Viro

namespace.c: get rid of mnt_ghosts

Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 9559f689
...@@ -55,7 +55,7 @@ struct mount { ...@@ -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 */
......
...@@ -1136,20 +1136,8 @@ static void namespace_unlock(void) ...@@ -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);
} }
} }
...@@ -1181,8 +1169,12 @@ void umount_tree(struct mount *mnt, int propagate) ...@@ -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);
......
...@@ -278,8 +278,7 @@ int propagate_mnt(struct mount *dest_mnt, struct mountpoint *dest_mp, ...@@ -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);
} }
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册