From b2dba1af3c4157040303a76d25216b1713d333d0 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Wed, 23 Nov 2011 19:26:23 -0500 Subject: vfs: new internal helper: mnt_has_parent(mnt) vfsmounts have ->mnt_parent pointing either to a different vfsmount or to itself; it's never NULL and termination condition in loops traversing the tree towards root is mnt == mnt->mnt_parent. At least one place (see the next patch) is confused about what's going on; let's add an explicit helper checking it right way and use it in all places where we need it. Not that there had been too many, but... Signed-off-by: Al Viro --- fs/pnode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index d42514e32380..f1cd958b92e5 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -36,7 +36,7 @@ static inline struct vfsmount *next_slave(struct vfsmount *p) static bool is_path_reachable(struct vfsmount *mnt, struct dentry *dentry, const struct path *root) { - while (mnt != root->mnt && mnt->mnt_parent != mnt) { + while (mnt != root->mnt && mnt_has_parent(mnt)) { dentry = mnt->mnt_mountpoint; mnt = mnt->mnt_parent; } -- cgit v1.2.3 From afac7cba7ed31968a95e181dc25e204e45009ea8 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Wed, 23 Nov 2011 19:34:49 -0500 Subject: vfs: more mnt_parent cleanups a) mount --move is checking that ->mnt_parent is non-NULL before looking if that parent happens to be shared; ->mnt_parent is never NULL and it's not even an misspelled !mnt_has_parent() b) pivot_root open-codes is_path_reachable(), poorly. c) so does path_is_under(), while we are at it. Signed-off-by: Al Viro --- fs/pnode.c | 15 --------------- 1 file changed, 15 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index f1cd958b92e5..4d5a06ea57a2 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -28,21 +28,6 @@ static inline struct vfsmount *next_slave(struct vfsmount *p) return list_entry(p->mnt_slave.next, struct vfsmount, mnt_slave); } -/* - * Return true if path is reachable from root - * - * namespace_sem is held, and mnt is attached - */ -static bool is_path_reachable(struct vfsmount *mnt, struct dentry *dentry, - const struct path *root) -{ - while (mnt != root->mnt && mnt_has_parent(mnt)) { - dentry = mnt->mnt_mountpoint; - mnt = mnt->mnt_parent; - } - return mnt == root->mnt && is_subdir(dentry, root->dentry); -} - static struct vfsmount *get_peer_under_root(struct vfsmount *mnt, struct mnt_namespace *ns, const struct path *root) -- cgit v1.2.3 From c71053659e3bb27d44b79da0bb4abf5838c2060a Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 18:22:03 -0500 Subject: vfs: spread struct mount - __lookup_mnt() result switch __lookup_mnt() to returning struct mount *; callers adjusted. Signed-off-by: Al Viro --- fs/pnode.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 4d5a06ea57a2..e996d039c0f2 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -289,7 +289,8 @@ static inline int do_refcount_check(struct vfsmount *mnt, int count) */ int propagate_mount_busy(struct vfsmount *mnt, int refcnt) { - struct vfsmount *m, *child; + struct vfsmount *m; + struct mount *child; struct vfsmount *parent = mnt->mnt_parent; int ret = 0; @@ -307,8 +308,8 @@ int propagate_mount_busy(struct vfsmount *mnt, int refcnt) for (m = propagation_next(parent, parent); m; m = propagation_next(m, parent)) { child = __lookup_mnt(m, mnt->mnt_mountpoint, 0); - if (child && list_empty(&child->mnt_mounts) && - (ret = do_refcount_check(child, 1))) + if (child && list_empty(&child->mnt.mnt_mounts) && + (ret = do_refcount_check(&child->mnt, 1))) break; } return ret; @@ -328,14 +329,14 @@ static void __propagate_umount(struct vfsmount *mnt) for (m = propagation_next(parent, parent); m; m = propagation_next(m, parent)) { - struct vfsmount *child = __lookup_mnt(m, + struct mount *child = __lookup_mnt(m, mnt->mnt_mountpoint, 0); /* * umount the child only if the child has no * other children */ - if (child && list_empty(&child->mnt_mounts)) - list_move_tail(&child->mnt_hash, &mnt->mnt_hash); + if (child && list_empty(&child->mnt.mnt_mounts)) + list_move_tail(&child->mnt.mnt_hash, &mnt->mnt_hash); } } -- cgit v1.2.3 From 61ef47b1e4ba9f2b939e6772e2f96082df0ae7eb Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 18:25:28 -0500 Subject: vfs: spread struct mount - __propagate_umount() argument Signed-off-by: Al Viro --- fs/pnode.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index e996d039c0f2..ae5b1bda31ba 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -319,24 +319,24 @@ int propagate_mount_busy(struct vfsmount *mnt, int refcnt) * NOTE: unmounting 'mnt' naturally propagates to all other mounts its * parent propagates to. */ -static void __propagate_umount(struct vfsmount *mnt) +static void __propagate_umount(struct mount *mnt) { - struct vfsmount *parent = mnt->mnt_parent; + struct vfsmount *parent = mnt->mnt.mnt_parent; struct vfsmount *m; - BUG_ON(parent == mnt); + BUG_ON(parent == &mnt->mnt); for (m = propagation_next(parent, parent); m; m = propagation_next(m, parent)) { struct mount *child = __lookup_mnt(m, - mnt->mnt_mountpoint, 0); + mnt->mnt.mnt_mountpoint, 0); /* * umount the child only if the child has no * other children */ if (child && list_empty(&child->mnt.mnt_mounts)) - list_move_tail(&child->mnt.mnt_hash, &mnt->mnt_hash); + list_move_tail(&child->mnt.mnt_hash, &mnt->mnt.mnt_hash); } } @@ -349,9 +349,9 @@ static void __propagate_umount(struct vfsmount *mnt) */ int propagate_umount(struct list_head *list) { - struct vfsmount *mnt; + struct mount *mnt; - list_for_each_entry(mnt, list, mnt_hash) + list_for_each_entry(mnt, list, mnt.mnt_hash) __propagate_umount(mnt); return 0; } -- cgit v1.2.3 From 4b8b21f4fe16ee15eec5c69ea5fb41b30e428e59 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 19:54:23 -0500 Subject: vfs: spread struct mount - mount group id handling Signed-off-by: Al Viro --- fs/pnode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index ae5b1bda31ba..a824a097b523 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -83,7 +83,7 @@ static int do_make_slave(struct vfsmount *mnt) peer_mnt = NULL; } if (IS_MNT_SHARED(mnt) && list_empty(&mnt->mnt_share)) - mnt_release_group_id(mnt); + mnt_release_group_id(real_mount(mnt)); list_del_init(&mnt->mnt_share); mnt->mnt_group_id = 0; -- cgit v1.2.3 From 0f0afb1dcf01afc44581b3c0da251ac07dfb6e4a Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 20:43:10 -0500 Subject: vfs: spread struct mount - change_mnt_propagation/set_mnt_shared Signed-off-by: Al Viro --- fs/pnode.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index a824a097b523..4bd3721867a7 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -114,20 +114,20 @@ static int do_make_slave(struct vfsmount *mnt) /* * vfsmount lock must be held for write */ -void change_mnt_propagation(struct vfsmount *mnt, int type) +void change_mnt_propagation(struct mount *mnt, int type) { if (type == MS_SHARED) { set_mnt_shared(mnt); return; } - do_make_slave(mnt); + do_make_slave(&mnt->mnt); if (type != MS_SLAVE) { - list_del_init(&mnt->mnt_slave); - mnt->mnt_master = NULL; + list_del_init(&mnt->mnt.mnt_slave); + mnt->mnt.mnt_master = NULL; if (type == MS_UNBINDABLE) - mnt->mnt_flags |= MNT_UNBINDABLE; + mnt->mnt.mnt_flags |= MNT_UNBINDABLE; else - mnt->mnt_flags &= ~MNT_UNBINDABLE; + mnt->mnt.mnt_flags &= ~MNT_UNBINDABLE; } } -- cgit v1.2.3 From cb338d06e9716c92d5a7855e7c67b8f111ced722 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 20:55:08 -0500 Subject: vfs: spread struct mount - clone_mnt/copy_tree result Signed-off-by: Al Viro --- fs/pnode.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 4bd3721867a7..916c8e87cf4e 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -221,7 +221,8 @@ static struct vfsmount *get_source(struct vfsmount *dest, int propagate_mnt(struct vfsmount *dest_mnt, struct dentry *dest_dentry, struct vfsmount *source_mnt, struct list_head *tree_list) { - struct vfsmount *m, *child; + struct vfsmount *m; + struct mount *child; int ret = 0; struct vfsmount *prev_dest_mnt = dest_mnt; struct vfsmount *prev_src_mnt = source_mnt; @@ -245,23 +246,23 @@ int propagate_mnt(struct vfsmount *dest_mnt, struct dentry *dest_dentry, } if (is_subdir(dest_dentry, m->mnt_root)) { - mnt_set_mountpoint(m, dest_dentry, child); - list_add_tail(&child->mnt_hash, tree_list); + mnt_set_mountpoint(m, dest_dentry, &child->mnt); + list_add_tail(&child->mnt.mnt_hash, tree_list); } else { /* * This can happen if the parent mount was bind mounted * on some subdirectory of a shared/slave mount. */ - list_add_tail(&child->mnt_hash, &tmp_list); + list_add_tail(&child->mnt.mnt_hash, &tmp_list); } prev_dest_mnt = m; - prev_src_mnt = child; + prev_src_mnt = &child->mnt; } out: br_write_lock(vfsmount_lock); while (!list_empty(&tmp_list)) { - child = list_first_entry(&tmp_list, struct vfsmount, mnt_hash); - umount_tree(child, 0, &umount_list); + child = list_first_entry(&tmp_list, struct mount, mnt.mnt_hash); + umount_tree(&child->mnt, 0, &umount_list); } br_write_unlock(vfsmount_lock); release_mounts(&umount_list); -- cgit v1.2.3 From 1b8e5564b9d34cbeb3047dd2be8ec9cd5e2785e2 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 21:01:32 -0500 Subject: vfs: the first spoils - mnt_hash moved taken out of struct vfsmount into struct mount Signed-off-by: Al Viro --- fs/pnode.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 916c8e87cf4e..a2f0f3e0e127 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -247,13 +247,13 @@ int propagate_mnt(struct vfsmount *dest_mnt, struct dentry *dest_dentry, if (is_subdir(dest_dentry, m->mnt_root)) { mnt_set_mountpoint(m, dest_dentry, &child->mnt); - list_add_tail(&child->mnt.mnt_hash, tree_list); + list_add_tail(&child->mnt_hash, tree_list); } else { /* * This can happen if the parent mount was bind mounted * on some subdirectory of a shared/slave mount. */ - list_add_tail(&child->mnt.mnt_hash, &tmp_list); + list_add_tail(&child->mnt_hash, &tmp_list); } prev_dest_mnt = m; prev_src_mnt = &child->mnt; @@ -261,7 +261,7 @@ int propagate_mnt(struct vfsmount *dest_mnt, struct dentry *dest_dentry, out: br_write_lock(vfsmount_lock); while (!list_empty(&tmp_list)) { - child = list_first_entry(&tmp_list, struct mount, mnt.mnt_hash); + child = list_first_entry(&tmp_list, struct mount, mnt_hash); umount_tree(&child->mnt, 0, &umount_list); } br_write_unlock(vfsmount_lock); @@ -337,7 +337,7 @@ static void __propagate_umount(struct mount *mnt) * other children */ if (child && list_empty(&child->mnt.mnt_mounts)) - list_move_tail(&child->mnt.mnt_hash, &mnt->mnt.mnt_hash); + list_move_tail(&child->mnt_hash, &mnt->mnt_hash); } } @@ -352,7 +352,7 @@ int propagate_umount(struct list_head *list) { struct mount *mnt; - list_for_each_entry(mnt, list, mnt.mnt_hash) + list_for_each_entry(mnt, list, mnt_hash) __propagate_umount(mnt); return 0; } -- cgit v1.2.3 From 761d5c38eb3d8e2aa7394726dccab245bfe2f41c Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 21:07:43 -0500 Subject: vfs: spread struct mount - umount_tree argument Signed-off-by: Al Viro --- fs/pnode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index a2f0f3e0e127..efbe0c0d3f0d 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -262,7 +262,7 @@ out: br_write_lock(vfsmount_lock); while (!list_empty(&tmp_list)) { child = list_first_entry(&tmp_list, struct mount, mnt_hash); - umount_tree(&child->mnt, 0, &umount_list); + umount_tree(child, 0, &umount_list); } br_write_unlock(vfsmount_lock); release_mounts(&umount_list); -- cgit v1.2.3 From 87129cc0e3fcd89a1db3e99d62dc710e05749f77 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 21:24:27 -0500 Subject: vfs: spread struct mount - clone_mnt/copy_tree argument Signed-off-by: Al Viro --- fs/pnode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index efbe0c0d3f0d..5d79f38e3e8a 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -239,7 +239,7 @@ int propagate_mnt(struct vfsmount *dest_mnt, struct dentry *dest_dentry, source = get_source(m, prev_dest_mnt, prev_src_mnt, &type); - if (!(child = copy_tree(source, source->mnt_root, type))) { + if (!(child = copy_tree(real_mount(source), source->mnt_root, type))) { ret = -ENOMEM; list_splice(tree_list, tmp_list.prev); goto out; -- cgit v1.2.3 From 44d964d609c7c11b330a3d1caf30767fa13c7be3 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 21:28:22 -0500 Subject: vfs: spread struct mount mnt_set_mountpoint child argument Signed-off-by: Al Viro --- fs/pnode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 5d79f38e3e8a..89ea50dc2af3 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -246,7 +246,7 @@ int propagate_mnt(struct vfsmount *dest_mnt, struct dentry *dest_dentry, } if (is_subdir(dest_dentry, m->mnt_root)) { - mnt_set_mountpoint(m, dest_dentry, &child->mnt); + mnt_set_mountpoint(m, dest_dentry, child); list_add_tail(&child->mnt_hash, tree_list); } else { /* -- cgit v1.2.3 From 1ab597386205f8dc757cf8750465502aeae65154 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 21:35:16 -0500 Subject: vfs: spread struct mount - do_umount/propagate_mount_busy Signed-off-by: Al Viro --- fs/pnode.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 89ea50dc2af3..3105cca197ec 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -272,9 +272,9 @@ out: /* * return true if the refcount is greater than count */ -static inline int do_refcount_check(struct vfsmount *mnt, int count) +static inline int do_refcount_check(struct mount *mnt, int count) { - int mycount = mnt_get_count(mnt) - mnt->mnt_ghosts; + int mycount = mnt_get_count(&mnt->mnt) - mnt->mnt.mnt_ghosts; return (mycount > count); } @@ -288,14 +288,14 @@ static inline int do_refcount_check(struct vfsmount *mnt, int count) * * vfsmount lock must be held for write */ -int propagate_mount_busy(struct vfsmount *mnt, int refcnt) +int propagate_mount_busy(struct mount *mnt, int refcnt) { struct vfsmount *m; struct mount *child; - struct vfsmount *parent = mnt->mnt_parent; + struct vfsmount *parent = mnt->mnt.mnt_parent; int ret = 0; - if (mnt == parent) + if (&mnt->mnt == parent) return do_refcount_check(mnt, refcnt); /* @@ -303,14 +303,14 @@ int propagate_mount_busy(struct vfsmount *mnt, int refcnt) * If not, we don't have to go checking for all other * mounts */ - if (!list_empty(&mnt->mnt_mounts) || do_refcount_check(mnt, refcnt)) + if (!list_empty(&mnt->mnt.mnt_mounts) || do_refcount_check(mnt, refcnt)) return 1; for (m = propagation_next(parent, parent); m; m = propagation_next(m, parent)) { - child = __lookup_mnt(m, mnt->mnt_mountpoint, 0); + child = __lookup_mnt(m, mnt->mnt.mnt_mountpoint, 0); if (child && list_empty(&child->mnt.mnt_mounts) && - (ret = do_refcount_check(&child->mnt, 1))) + (ret = do_refcount_check(child, 1))) break; } return ret; -- cgit v1.2.3 From 643822b41e5e0f133438883b0be574cdaf168a2a Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 22:00:28 -0500 Subject: vfs: spread struct mount - is_path_reachable Signed-off-by: Al Viro --- fs/pnode.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 3105cca197ec..25f74b53dea6 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -32,15 +32,15 @@ static struct vfsmount *get_peer_under_root(struct vfsmount *mnt, struct mnt_namespace *ns, const struct path *root) { - struct vfsmount *m = mnt; + struct mount *m = real_mount(mnt); do { /* Check the namespace first for optimization */ - if (m->mnt_ns == ns && is_path_reachable(m, m->mnt_root, root)) - return m; + if (m->mnt.mnt_ns == ns && is_path_reachable(m, m->mnt.mnt_root, root)) + return &m->mnt; - m = next_peer(m); - } while (m != mnt); + m = real_mount(next_peer(&m->mnt)); + } while (&m->mnt != mnt); return NULL; } -- cgit v1.2.3 From 3376f34fff5be9954fd9a9c4fd68f4a0a36d480e Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 22:05:19 -0500 Subject: vfs: mnt_parent moved to struct mount the second victim... Signed-off-by: Al Viro --- fs/pnode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 25f74b53dea6..2ff4dfa018e1 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -292,7 +292,7 @@ int propagate_mount_busy(struct mount *mnt, int refcnt) { struct vfsmount *m; struct mount *child; - struct vfsmount *parent = mnt->mnt.mnt_parent; + struct vfsmount *parent = mnt->mnt_parent; int ret = 0; if (&mnt->mnt == parent) @@ -322,7 +322,7 @@ int propagate_mount_busy(struct mount *mnt, int refcnt) */ static void __propagate_umount(struct mount *mnt) { - struct vfsmount *parent = mnt->mnt.mnt_parent; + struct vfsmount *parent = mnt->mnt_parent; struct vfsmount *m; BUG_ON(parent == &mnt->mnt); -- cgit v1.2.3 From 0714a533805a0f8ebfc6fdb6bda9f129b8c7c6d7 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 22:19:58 -0500 Subject: vfs: now it can be done - make mnt_parent point to struct mount Signed-off-by: Al Viro --- fs/pnode.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 2ff4dfa018e1..7fddc671f729 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -292,10 +292,10 @@ int propagate_mount_busy(struct mount *mnt, int refcnt) { struct vfsmount *m; struct mount *child; - struct vfsmount *parent = mnt->mnt_parent; + struct mount *parent = mnt->mnt_parent; int ret = 0; - if (&mnt->mnt == parent) + if (mnt == parent) return do_refcount_check(mnt, refcnt); /* @@ -306,8 +306,8 @@ int propagate_mount_busy(struct mount *mnt, int refcnt) if (!list_empty(&mnt->mnt.mnt_mounts) || do_refcount_check(mnt, refcnt)) return 1; - for (m = propagation_next(parent, parent); m; - m = propagation_next(m, parent)) { + for (m = propagation_next(&parent->mnt, &parent->mnt); m; + m = propagation_next(m, &parent->mnt)) { child = __lookup_mnt(m, mnt->mnt.mnt_mountpoint, 0); if (child && list_empty(&child->mnt.mnt_mounts) && (ret = do_refcount_check(child, 1))) @@ -322,13 +322,13 @@ int propagate_mount_busy(struct mount *mnt, int refcnt) */ static void __propagate_umount(struct mount *mnt) { - struct vfsmount *parent = mnt->mnt_parent; + struct mount *parent = mnt->mnt_parent; struct vfsmount *m; - BUG_ON(parent == &mnt->mnt); + BUG_ON(parent == mnt); - for (m = propagation_next(parent, parent); m; - m = propagation_next(m, parent)) { + for (m = propagation_next(&parent->mnt, &parent->mnt); m; + m = propagation_next(m, &parent->mnt)) { struct mount *child = __lookup_mnt(m, mnt->mnt.mnt_mountpoint, 0); -- cgit v1.2.3 From a73324da7af4052e1d1ddec6a5980f552420e58b Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 22:25:07 -0500 Subject: vfs: move mnt_mountpoint to struct mount Signed-off-by: Al Viro --- fs/pnode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 7fddc671f729..bd280200bd37 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -308,7 +308,7 @@ int propagate_mount_busy(struct mount *mnt, int refcnt) for (m = propagation_next(&parent->mnt, &parent->mnt); m; m = propagation_next(m, &parent->mnt)) { - child = __lookup_mnt(m, mnt->mnt.mnt_mountpoint, 0); + child = __lookup_mnt(m, mnt->mnt_mountpoint, 0); if (child && list_empty(&child->mnt.mnt_mounts) && (ret = do_refcount_check(child, 1))) break; @@ -331,7 +331,7 @@ static void __propagate_umount(struct mount *mnt) m = propagation_next(m, &parent->mnt)) { struct mount *child = __lookup_mnt(m, - mnt->mnt.mnt_mountpoint, 0); + mnt->mnt_mountpoint, 0); /* * umount the child only if the child has no * other children -- cgit v1.2.3 From 83adc7532229f1909cf37c429780f02f06fe05ee Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 22:37:54 -0500 Subject: vfs: spread struct mount - work with counters Signed-off-by: Al Viro --- fs/pnode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index bd280200bd37..50fdb29eebfe 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -274,7 +274,7 @@ out: */ static inline int do_refcount_check(struct mount *mnt, int count) { - int mycount = mnt_get_count(&mnt->mnt) - mnt->mnt.mnt_ghosts; + int mycount = mnt_get_count(mnt) - mnt->mnt.mnt_ghosts; return (mycount > count); } -- cgit v1.2.3 From 6b41d536f7c84e7cb1c1462073150277e46f6ea8 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 23:24:33 -0500 Subject: vfs: take mnt_child/mnt_mounts to struct mount Signed-off-by: Al Viro --- fs/pnode.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 50fdb29eebfe..8cd90d2ec05e 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -303,13 +303,13 @@ int propagate_mount_busy(struct mount *mnt, int refcnt) * If not, we don't have to go checking for all other * mounts */ - if (!list_empty(&mnt->mnt.mnt_mounts) || do_refcount_check(mnt, refcnt)) + if (!list_empty(&mnt->mnt_mounts) || do_refcount_check(mnt, refcnt)) return 1; for (m = propagation_next(&parent->mnt, &parent->mnt); m; m = propagation_next(m, &parent->mnt)) { child = __lookup_mnt(m, mnt->mnt_mountpoint, 0); - if (child && list_empty(&child->mnt.mnt_mounts) && + if (child && list_empty(&child->mnt_mounts) && (ret = do_refcount_check(child, 1))) break; } @@ -336,7 +336,7 @@ static void __propagate_umount(struct mount *mnt) * umount the child only if the child has no * other children */ - if (child && list_empty(&child->mnt.mnt_mounts)) + if (child && list_empty(&child->mnt_mounts)) list_move_tail(&child->mnt_hash, &mnt->mnt_hash); } } -- cgit v1.2.3 From 6fc7871fed915914ef441efbe0f9a7c3d0f3bff1 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 23:35:54 -0500 Subject: vfs: spread struct mount - get_dominating_id / do_make_slave next pile of horrors, similar to mnt_parent one; this time it's mnt_master. Signed-off-by: Al Viro --- fs/pnode.c | 58 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 8cd90d2ec05e..29e366dec024 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -28,19 +28,19 @@ static inline struct vfsmount *next_slave(struct vfsmount *p) return list_entry(p->mnt_slave.next, struct vfsmount, mnt_slave); } -static struct vfsmount *get_peer_under_root(struct vfsmount *mnt, - struct mnt_namespace *ns, - const struct path *root) +static struct mount *get_peer_under_root(struct mount *mnt, + struct mnt_namespace *ns, + const struct path *root) { - struct mount *m = real_mount(mnt); + struct mount *m = mnt; do { /* Check the namespace first for optimization */ if (m->mnt.mnt_ns == ns && is_path_reachable(m, m->mnt.mnt_root, root)) - return &m->mnt; + return m; m = real_mount(next_peer(&m->mnt)); - } while (&m->mnt != mnt); + } while (m != mnt); return NULL; } @@ -51,22 +51,22 @@ static struct vfsmount *get_peer_under_root(struct vfsmount *mnt, * * Caller must hold namespace_sem */ -int get_dominating_id(struct vfsmount *mnt, const struct path *root) +int get_dominating_id(struct mount *mnt, const struct path *root) { - struct vfsmount *m; + struct mount *m; - for (m = mnt->mnt_master; m != NULL; m = m->mnt_master) { - struct vfsmount *d = get_peer_under_root(m, mnt->mnt_ns, root); + for (m = real_mount(mnt->mnt.mnt_master); m != NULL; m = real_mount(m->mnt.mnt_master)) { + struct mount *d = get_peer_under_root(m, mnt->mnt.mnt_ns, root); if (d) - return d->mnt_group_id; + return d->mnt.mnt_group_id; } return 0; } -static int do_make_slave(struct vfsmount *mnt) +static int do_make_slave(struct mount *mnt) { - struct vfsmount *peer_mnt = mnt, *master = mnt->mnt_master; + struct mount *peer_mnt = mnt, *master = real_mount(mnt->mnt.mnt_master); struct vfsmount *slave_mnt; /* @@ -74,31 +74,31 @@ static int do_make_slave(struct vfsmount *mnt) * same root dentry. If none is available then * slave it to anything that is available. */ - while ((peer_mnt = next_peer(peer_mnt)) != mnt && - peer_mnt->mnt_root != mnt->mnt_root) ; + while ((peer_mnt = real_mount(next_peer(&peer_mnt->mnt))) != mnt && + peer_mnt->mnt.mnt_root != mnt->mnt.mnt_root) ; if (peer_mnt == mnt) { - peer_mnt = next_peer(mnt); + peer_mnt = real_mount(next_peer(&mnt->mnt)); if (peer_mnt == mnt) peer_mnt = NULL; } - if (IS_MNT_SHARED(mnt) && list_empty(&mnt->mnt_share)) - mnt_release_group_id(real_mount(mnt)); + if (IS_MNT_SHARED(&mnt->mnt) && list_empty(&mnt->mnt.mnt_share)) + mnt_release_group_id(mnt); - list_del_init(&mnt->mnt_share); - mnt->mnt_group_id = 0; + list_del_init(&mnt->mnt.mnt_share); + mnt->mnt.mnt_group_id = 0; if (peer_mnt) master = peer_mnt; if (master) { - list_for_each_entry(slave_mnt, &mnt->mnt_slave_list, mnt_slave) - slave_mnt->mnt_master = master; - list_move(&mnt->mnt_slave, &master->mnt_slave_list); - list_splice(&mnt->mnt_slave_list, master->mnt_slave_list.prev); - INIT_LIST_HEAD(&mnt->mnt_slave_list); + list_for_each_entry(slave_mnt, &mnt->mnt.mnt_slave_list, mnt_slave) + slave_mnt->mnt_master = &master->mnt; + list_move(&mnt->mnt.mnt_slave, &master->mnt.mnt_slave_list); + list_splice(&mnt->mnt.mnt_slave_list, master->mnt.mnt_slave_list.prev); + INIT_LIST_HEAD(&mnt->mnt.mnt_slave_list); } else { - struct list_head *p = &mnt->mnt_slave_list; + struct list_head *p = &mnt->mnt.mnt_slave_list; while (!list_empty(p)) { slave_mnt = list_first_entry(p, struct vfsmount, mnt_slave); @@ -106,8 +106,8 @@ static int do_make_slave(struct vfsmount *mnt) slave_mnt->mnt_master = NULL; } } - mnt->mnt_master = master; - CLEAR_MNT_SHARED(mnt); + mnt->mnt.mnt_master = &master->mnt; + CLEAR_MNT_SHARED(&mnt->mnt); return 0; } @@ -120,7 +120,7 @@ void change_mnt_propagation(struct mount *mnt, int type) set_mnt_shared(mnt); return; } - do_make_slave(&mnt->mnt); + do_make_slave(mnt); if (type != MS_SLAVE) { list_del_init(&mnt->mnt.mnt_slave); mnt->mnt.mnt_master = NULL; -- cgit v1.2.3 From c937135d98f2306157fb8d8a03a4d8b0f1e3b511 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 23:56:26 -0500 Subject: vfs: spread struct mount - shared subtree iterators Signed-off-by: Al Viro --- fs/pnode.c | 97 ++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 47 insertions(+), 50 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 29e366dec024..f86cd4bc31ce 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -13,19 +13,19 @@ #include "pnode.h" /* return the next shared peer mount of @p */ -static inline struct vfsmount *next_peer(struct vfsmount *p) +static inline struct mount *next_peer(struct mount *p) { - return list_entry(p->mnt_share.next, struct vfsmount, mnt_share); + return list_entry(p->mnt.mnt_share.next, struct mount, mnt.mnt_share); } -static inline struct vfsmount *first_slave(struct vfsmount *p) +static inline struct mount *first_slave(struct mount *p) { - return list_entry(p->mnt_slave_list.next, struct vfsmount, mnt_slave); + return list_entry(p->mnt.mnt_slave_list.next, struct mount, mnt.mnt_slave); } -static inline struct vfsmount *next_slave(struct vfsmount *p) +static inline struct mount *next_slave(struct mount *p) { - return list_entry(p->mnt_slave.next, struct vfsmount, mnt_slave); + return list_entry(p->mnt.mnt_slave.next, struct mount, mnt.mnt_slave); } static struct mount *get_peer_under_root(struct mount *mnt, @@ -39,7 +39,7 @@ static struct mount *get_peer_under_root(struct mount *mnt, if (m->mnt.mnt_ns == ns && is_path_reachable(m, m->mnt.mnt_root, root)) return m; - m = real_mount(next_peer(&m->mnt)); + m = next_peer(m); } while (m != mnt); return NULL; @@ -74,11 +74,11 @@ static int do_make_slave(struct mount *mnt) * same root dentry. If none is available then * slave it to anything that is available. */ - while ((peer_mnt = real_mount(next_peer(&peer_mnt->mnt))) != mnt && + while ((peer_mnt = next_peer(peer_mnt)) != mnt && peer_mnt->mnt.mnt_root != mnt->mnt.mnt_root) ; if (peer_mnt == mnt) { - peer_mnt = real_mount(next_peer(&mnt->mnt)); + peer_mnt = next_peer(mnt); if (peer_mnt == mnt) peer_mnt = NULL; } @@ -141,21 +141,20 @@ void change_mnt_propagation(struct mount *mnt, int type) * vfsmount found while iterating with propagation_next() is * a peer of one we'd found earlier. */ -static struct vfsmount *propagation_next(struct vfsmount *m, - struct vfsmount *origin) +static struct mount *propagation_next(struct mount *m, + struct mount *origin) { /* are there any slaves of this mount? */ - if (!IS_MNT_NEW(m) && !list_empty(&m->mnt_slave_list)) + if (!IS_MNT_NEW(&m->mnt) && !list_empty(&m->mnt.mnt_slave_list)) return first_slave(m); while (1) { - struct vfsmount *next; - struct vfsmount *master = m->mnt_master; + struct mount *master = real_mount(m->mnt.mnt_master); - if (master == origin->mnt_master) { - next = next_peer(m); - return ((next == origin) ? NULL : next); - } else if (m->mnt_slave.next != &master->mnt_slave_list) + if (&master->mnt == origin->mnt.mnt_master) { + struct mount *next = next_peer(m); + return (next == origin) ? NULL : next; + } else if (m->mnt.mnt_slave.next != &master->mnt.mnt_slave_list) return next_slave(m); /* back at master */ @@ -172,25 +171,25 @@ static struct vfsmount *propagation_next(struct vfsmount *m, * @type return CL_SLAVE if the new mount has to be * cloned as a slave. */ -static struct vfsmount *get_source(struct vfsmount *dest, - struct vfsmount *last_dest, - struct vfsmount *last_src, - int *type) +static struct mount *get_source(struct mount *dest, + struct mount *last_dest, + struct mount *last_src, + int *type) { - struct vfsmount *p_last_src = NULL; - struct vfsmount *p_last_dest = NULL; + struct mount *p_last_src = NULL; + struct mount *p_last_dest = NULL; - while (last_dest != dest->mnt_master) { + while (&last_dest->mnt != dest->mnt.mnt_master) { p_last_dest = last_dest; p_last_src = last_src; - last_dest = last_dest->mnt_master; - last_src = last_src->mnt_master; + last_dest = real_mount(last_dest->mnt.mnt_master); + last_src = real_mount(last_src->mnt.mnt_master); } if (p_last_dest) { do { p_last_dest = next_peer(p_last_dest); - } while (IS_MNT_NEW(p_last_dest)); + } while (IS_MNT_NEW(&p_last_dest->mnt)); /* is that a peer of the earlier? */ if (dest == p_last_dest) { *type = CL_MAKE_SHARED; @@ -200,7 +199,7 @@ static struct vfsmount *get_source(struct vfsmount *dest, /* slave of the earlier, then */ *type = CL_SLAVE; /* beginning of peer group among the slaves? */ - if (IS_MNT_SHARED(dest)) + if (IS_MNT_SHARED(&dest->mnt)) *type |= CL_MAKE_SHARED; return last_src; } @@ -221,32 +220,31 @@ static struct vfsmount *get_source(struct vfsmount *dest, int propagate_mnt(struct vfsmount *dest_mnt, struct dentry *dest_dentry, struct vfsmount *source_mnt, struct list_head *tree_list) { - struct vfsmount *m; - struct mount *child; + struct mount *m, *child; int ret = 0; - struct vfsmount *prev_dest_mnt = dest_mnt; - struct vfsmount *prev_src_mnt = source_mnt; + struct mount *prev_dest_mnt = real_mount(dest_mnt); + struct mount *prev_src_mnt = real_mount(source_mnt); LIST_HEAD(tmp_list); LIST_HEAD(umount_list); - for (m = propagation_next(dest_mnt, dest_mnt); m; - m = propagation_next(m, dest_mnt)) { + for (m = propagation_next(real_mount(dest_mnt), real_mount(dest_mnt)); m; + m = propagation_next(m, real_mount(dest_mnt))) { int type; - struct vfsmount *source; + struct mount *source; - if (IS_MNT_NEW(m)) + if (IS_MNT_NEW(&m->mnt)) continue; source = get_source(m, prev_dest_mnt, prev_src_mnt, &type); - if (!(child = copy_tree(real_mount(source), source->mnt_root, type))) { + if (!(child = copy_tree(source, source->mnt.mnt_root, type))) { ret = -ENOMEM; list_splice(tree_list, tmp_list.prev); goto out; } - if (is_subdir(dest_dentry, m->mnt_root)) { - mnt_set_mountpoint(m, dest_dentry, child); + if (is_subdir(dest_dentry, m->mnt.mnt_root)) { + mnt_set_mountpoint(&m->mnt, dest_dentry, child); list_add_tail(&child->mnt_hash, tree_list); } else { /* @@ -256,7 +254,7 @@ int propagate_mnt(struct vfsmount *dest_mnt, struct dentry *dest_dentry, list_add_tail(&child->mnt_hash, &tmp_list); } prev_dest_mnt = m; - prev_src_mnt = &child->mnt; + prev_src_mnt = child; } out: br_write_lock(vfsmount_lock); @@ -290,8 +288,7 @@ static inline int do_refcount_check(struct mount *mnt, int count) */ int propagate_mount_busy(struct mount *mnt, int refcnt) { - struct vfsmount *m; - struct mount *child; + struct mount *m, *child; struct mount *parent = mnt->mnt_parent; int ret = 0; @@ -306,9 +303,9 @@ int propagate_mount_busy(struct mount *mnt, int refcnt) if (!list_empty(&mnt->mnt_mounts) || do_refcount_check(mnt, refcnt)) return 1; - for (m = propagation_next(&parent->mnt, &parent->mnt); m; - m = propagation_next(m, &parent->mnt)) { - child = __lookup_mnt(m, mnt->mnt_mountpoint, 0); + for (m = propagation_next(parent, parent); m; + m = propagation_next(m, parent)) { + child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint, 0); if (child && list_empty(&child->mnt_mounts) && (ret = do_refcount_check(child, 1))) break; @@ -323,14 +320,14 @@ int propagate_mount_busy(struct mount *mnt, int refcnt) static void __propagate_umount(struct mount *mnt) { struct mount *parent = mnt->mnt_parent; - struct vfsmount *m; + struct mount *m; BUG_ON(parent == mnt); - for (m = propagation_next(&parent->mnt, &parent->mnt); m; - m = propagation_next(m, &parent->mnt)) { + for (m = propagation_next(parent, parent); m; + m = propagation_next(m, parent)) { - struct mount *child = __lookup_mnt(m, + struct mount *child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint, 0); /* * umount the child only if the child has no -- cgit v1.2.3 From a8d56d8e4fa0cb9a023834363f8d79415d277a1d Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 24 Nov 2011 23:59:29 -0500 Subject: vfs: spread struct mount - propagate_mnt() Signed-off-by: Al Viro --- fs/pnode.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index f86cd4bc31ce..6519b3b4eb15 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -217,18 +217,18 @@ static struct mount *get_source(struct mount *dest, * @source_mnt: source mount. * @tree_list : list of heads of trees to be attached. */ -int propagate_mnt(struct vfsmount *dest_mnt, struct dentry *dest_dentry, - struct vfsmount *source_mnt, struct list_head *tree_list) +int propagate_mnt(struct mount *dest_mnt, struct dentry *dest_dentry, + struct mount *source_mnt, struct list_head *tree_list) { struct mount *m, *child; int ret = 0; - struct mount *prev_dest_mnt = real_mount(dest_mnt); - struct mount *prev_src_mnt = real_mount(source_mnt); + struct mount *prev_dest_mnt = dest_mnt; + struct mount *prev_src_mnt = source_mnt; LIST_HEAD(tmp_list); LIST_HEAD(umount_list); - for (m = propagation_next(real_mount(dest_mnt), real_mount(dest_mnt)); m; - m = propagation_next(m, real_mount(dest_mnt))) { + for (m = propagation_next(dest_mnt, dest_mnt); m; + m = propagation_next(m, dest_mnt)) { int type; struct mount *source; -- cgit v1.2.3 From 14cf1fa8f54353d9caf6174c1e4280c8c4dcfd7a Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 25 Nov 2011 00:01:17 -0500 Subject: vfs: spread struct mount - remaining argument of mnt_set_mountpoint() Signed-off-by: Al Viro --- fs/pnode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 6519b3b4eb15..0e1de28b1b2e 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -244,7 +244,7 @@ int propagate_mnt(struct mount *dest_mnt, struct dentry *dest_dentry, } if (is_subdir(dest_dentry, m->mnt.mnt_root)) { - mnt_set_mountpoint(&m->mnt, dest_dentry, child); + mnt_set_mountpoint(m, dest_dentry, child); list_add_tail(&child->mnt_hash, tree_list); } else { /* -- cgit v1.2.3 From d10e8def07fc87488c396d2eff2c26c43bb541dd Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 25 Nov 2011 00:07:16 -0500 Subject: vfs: take mnt_master to struct mount make IS_MNT_SLAVE take struct mount * at the same time Signed-off-by: Al Viro --- fs/pnode.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 0e1de28b1b2e..3ac44d15fe58 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -55,7 +55,7 @@ int get_dominating_id(struct mount *mnt, const struct path *root) { struct mount *m; - for (m = real_mount(mnt->mnt.mnt_master); m != NULL; m = real_mount(m->mnt.mnt_master)) { + for (m = real_mount(mnt->mnt_master); m != NULL; m = real_mount(m->mnt_master)) { struct mount *d = get_peer_under_root(m, mnt->mnt.mnt_ns, root); if (d) return d->mnt.mnt_group_id; @@ -66,8 +66,8 @@ int get_dominating_id(struct mount *mnt, const struct path *root) static int do_make_slave(struct mount *mnt) { - struct mount *peer_mnt = mnt, *master = real_mount(mnt->mnt.mnt_master); - struct vfsmount *slave_mnt; + struct mount *peer_mnt = mnt, *master = real_mount(mnt->mnt_master); + struct mount *slave_mnt; /* * slave 'mnt' to a peer mount that has the @@ -92,7 +92,7 @@ static int do_make_slave(struct mount *mnt) master = peer_mnt; if (master) { - list_for_each_entry(slave_mnt, &mnt->mnt.mnt_slave_list, mnt_slave) + list_for_each_entry(slave_mnt, &mnt->mnt.mnt_slave_list, mnt.mnt_slave) slave_mnt->mnt_master = &master->mnt; list_move(&mnt->mnt.mnt_slave, &master->mnt.mnt_slave_list); list_splice(&mnt->mnt.mnt_slave_list, master->mnt.mnt_slave_list.prev); @@ -101,12 +101,12 @@ static int do_make_slave(struct mount *mnt) struct list_head *p = &mnt->mnt.mnt_slave_list; while (!list_empty(p)) { slave_mnt = list_first_entry(p, - struct vfsmount, mnt_slave); - list_del_init(&slave_mnt->mnt_slave); + struct mount, mnt.mnt_slave); + list_del_init(&slave_mnt->mnt.mnt_slave); slave_mnt->mnt_master = NULL; } } - mnt->mnt.mnt_master = &master->mnt; + mnt->mnt_master = &master->mnt; CLEAR_MNT_SHARED(&mnt->mnt); return 0; } @@ -123,7 +123,7 @@ void change_mnt_propagation(struct mount *mnt, int type) do_make_slave(mnt); if (type != MS_SLAVE) { list_del_init(&mnt->mnt.mnt_slave); - mnt->mnt.mnt_master = NULL; + mnt->mnt_master = NULL; if (type == MS_UNBINDABLE) mnt->mnt.mnt_flags |= MNT_UNBINDABLE; else @@ -149,9 +149,9 @@ static struct mount *propagation_next(struct mount *m, return first_slave(m); while (1) { - struct mount *master = real_mount(m->mnt.mnt_master); + struct mount *master = real_mount(m->mnt_master); - if (&master->mnt == origin->mnt.mnt_master) { + if (&master->mnt == origin->mnt_master) { struct mount *next = next_peer(m); return (next == origin) ? NULL : next; } else if (m->mnt.mnt_slave.next != &master->mnt.mnt_slave_list) @@ -179,11 +179,11 @@ static struct mount *get_source(struct mount *dest, struct mount *p_last_src = NULL; struct mount *p_last_dest = NULL; - while (&last_dest->mnt != dest->mnt.mnt_master) { + while (&last_dest->mnt != dest->mnt_master) { p_last_dest = last_dest; p_last_src = last_src; - last_dest = real_mount(last_dest->mnt.mnt_master); - last_src = real_mount(last_src->mnt.mnt_master); + last_dest = real_mount(last_dest->mnt_master); + last_src = real_mount(last_src->mnt_master); } if (p_last_dest) { -- cgit v1.2.3 From 32301920f44a9334f57dd94bebfc6e593b99ad47 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 25 Nov 2011 00:10:28 -0500 Subject: vfs: and now we can make ->mnt_master point to struct mount Signed-off-by: Al Viro --- fs/pnode.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 3ac44d15fe58..9bf22b61f8fb 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -55,7 +55,7 @@ int get_dominating_id(struct mount *mnt, const struct path *root) { struct mount *m; - for (m = real_mount(mnt->mnt_master); m != NULL; m = real_mount(m->mnt_master)) { + for (m = mnt->mnt_master; m != NULL; m = m->mnt_master) { struct mount *d = get_peer_under_root(m, mnt->mnt.mnt_ns, root); if (d) return d->mnt.mnt_group_id; @@ -66,7 +66,7 @@ int get_dominating_id(struct mount *mnt, const struct path *root) static int do_make_slave(struct mount *mnt) { - struct mount *peer_mnt = mnt, *master = real_mount(mnt->mnt_master); + struct mount *peer_mnt = mnt, *master = mnt->mnt_master; struct mount *slave_mnt; /* @@ -93,7 +93,7 @@ static int do_make_slave(struct mount *mnt) if (master) { list_for_each_entry(slave_mnt, &mnt->mnt.mnt_slave_list, mnt.mnt_slave) - slave_mnt->mnt_master = &master->mnt; + slave_mnt->mnt_master = master; list_move(&mnt->mnt.mnt_slave, &master->mnt.mnt_slave_list); list_splice(&mnt->mnt.mnt_slave_list, master->mnt.mnt_slave_list.prev); INIT_LIST_HEAD(&mnt->mnt.mnt_slave_list); @@ -106,7 +106,7 @@ static int do_make_slave(struct mount *mnt) slave_mnt->mnt_master = NULL; } } - mnt->mnt_master = &master->mnt; + mnt->mnt_master = master; CLEAR_MNT_SHARED(&mnt->mnt); return 0; } @@ -149,9 +149,9 @@ static struct mount *propagation_next(struct mount *m, return first_slave(m); while (1) { - struct mount *master = real_mount(m->mnt_master); + struct mount *master = m->mnt_master; - if (&master->mnt == origin->mnt_master) { + if (master == origin->mnt_master) { struct mount *next = next_peer(m); return (next == origin) ? NULL : next; } else if (m->mnt.mnt_slave.next != &master->mnt.mnt_slave_list) @@ -179,11 +179,11 @@ static struct mount *get_source(struct mount *dest, struct mount *p_last_src = NULL; struct mount *p_last_dest = NULL; - while (&last_dest->mnt != dest->mnt_master) { + while (last_dest != dest->mnt_master) { p_last_dest = last_dest; p_last_src = last_src; - last_dest = real_mount(last_dest->mnt_master); - last_src = real_mount(last_src->mnt_master); + last_dest = last_dest->mnt_master; + last_src = last_src->mnt_master; } if (p_last_dest) { -- cgit v1.2.3 From 6776db3d32b2a59198ec7ac6d32be0b9fdbd8a68 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 25 Nov 2011 00:22:05 -0500 Subject: vfs: take mnt_share/mnt_slave/mnt_slave_list and mnt_expire to struct mount Signed-off-by: Al Viro --- fs/pnode.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 9bf22b61f8fb..12cc1518e0cd 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -15,17 +15,17 @@ /* return the next shared peer mount of @p */ static inline struct mount *next_peer(struct mount *p) { - return list_entry(p->mnt.mnt_share.next, struct mount, mnt.mnt_share); + return list_entry(p->mnt_share.next, struct mount, mnt_share); } static inline struct mount *first_slave(struct mount *p) { - return list_entry(p->mnt.mnt_slave_list.next, struct mount, mnt.mnt_slave); + return list_entry(p->mnt_slave_list.next, struct mount, mnt_slave); } static inline struct mount *next_slave(struct mount *p) { - return list_entry(p->mnt.mnt_slave.next, struct mount, mnt.mnt_slave); + return list_entry(p->mnt_slave.next, struct mount, mnt_slave); } static struct mount *get_peer_under_root(struct mount *mnt, @@ -82,27 +82,27 @@ static int do_make_slave(struct mount *mnt) if (peer_mnt == mnt) peer_mnt = NULL; } - if (IS_MNT_SHARED(&mnt->mnt) && list_empty(&mnt->mnt.mnt_share)) + if (IS_MNT_SHARED(&mnt->mnt) && list_empty(&mnt->mnt_share)) mnt_release_group_id(mnt); - list_del_init(&mnt->mnt.mnt_share); + list_del_init(&mnt->mnt_share); mnt->mnt.mnt_group_id = 0; if (peer_mnt) master = peer_mnt; if (master) { - list_for_each_entry(slave_mnt, &mnt->mnt.mnt_slave_list, mnt.mnt_slave) + list_for_each_entry(slave_mnt, &mnt->mnt_slave_list, mnt_slave) slave_mnt->mnt_master = master; - list_move(&mnt->mnt.mnt_slave, &master->mnt.mnt_slave_list); - list_splice(&mnt->mnt.mnt_slave_list, master->mnt.mnt_slave_list.prev); - INIT_LIST_HEAD(&mnt->mnt.mnt_slave_list); + list_move(&mnt->mnt_slave, &master->mnt_slave_list); + list_splice(&mnt->mnt_slave_list, master->mnt_slave_list.prev); + INIT_LIST_HEAD(&mnt->mnt_slave_list); } else { - struct list_head *p = &mnt->mnt.mnt_slave_list; + struct list_head *p = &mnt->mnt_slave_list; while (!list_empty(p)) { slave_mnt = list_first_entry(p, - struct mount, mnt.mnt_slave); - list_del_init(&slave_mnt->mnt.mnt_slave); + struct mount, mnt_slave); + list_del_init(&slave_mnt->mnt_slave); slave_mnt->mnt_master = NULL; } } @@ -122,7 +122,7 @@ void change_mnt_propagation(struct mount *mnt, int type) } do_make_slave(mnt); if (type != MS_SLAVE) { - list_del_init(&mnt->mnt.mnt_slave); + list_del_init(&mnt->mnt_slave); mnt->mnt_master = NULL; if (type == MS_UNBINDABLE) mnt->mnt.mnt_flags |= MNT_UNBINDABLE; @@ -145,7 +145,7 @@ static struct mount *propagation_next(struct mount *m, struct mount *origin) { /* are there any slaves of this mount? */ - if (!IS_MNT_NEW(&m->mnt) && !list_empty(&m->mnt.mnt_slave_list)) + if (!IS_MNT_NEW(&m->mnt) && !list_empty(&m->mnt_slave_list)) return first_slave(m); while (1) { @@ -154,7 +154,7 @@ static struct mount *propagation_next(struct mount *m, if (master == origin->mnt_master) { struct mount *next = next_peer(m); return (next == origin) ? NULL : next; - } else if (m->mnt.mnt_slave.next != &master->mnt.mnt_slave_list) + } else if (m->mnt_slave.next != &master->mnt_slave_list) return next_slave(m); /* back at master */ -- cgit v1.2.3 From 143c8c91cee7efdd732ec5f61b3471fc46192f20 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 25 Nov 2011 00:46:35 -0500 Subject: vfs: mnt_ns moved to struct mount Signed-off-by: Al Viro --- fs/pnode.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 12cc1518e0cd..cec329822a16 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -36,7 +36,7 @@ static struct mount *get_peer_under_root(struct mount *mnt, do { /* Check the namespace first for optimization */ - if (m->mnt.mnt_ns == ns && is_path_reachable(m, m->mnt.mnt_root, root)) + if (m->mnt_ns == ns && is_path_reachable(m, m->mnt.mnt_root, root)) return m; m = next_peer(m); @@ -56,7 +56,7 @@ int get_dominating_id(struct mount *mnt, const struct path *root) struct mount *m; for (m = mnt->mnt_master; m != NULL; m = m->mnt_master) { - struct mount *d = get_peer_under_root(m, mnt->mnt.mnt_ns, root); + struct mount *d = get_peer_under_root(m, mnt->mnt_ns, root); if (d) return d->mnt.mnt_group_id; } @@ -145,7 +145,7 @@ static struct mount *propagation_next(struct mount *m, struct mount *origin) { /* are there any slaves of this mount? */ - if (!IS_MNT_NEW(&m->mnt) && !list_empty(&m->mnt_slave_list)) + if (!IS_MNT_NEW(m) && !list_empty(&m->mnt_slave_list)) return first_slave(m); while (1) { @@ -189,7 +189,7 @@ static struct mount *get_source(struct mount *dest, if (p_last_dest) { do { p_last_dest = next_peer(p_last_dest); - } while (IS_MNT_NEW(&p_last_dest->mnt)); + } while (IS_MNT_NEW(p_last_dest)); /* is that a peer of the earlier? */ if (dest == p_last_dest) { *type = CL_MAKE_SHARED; @@ -232,7 +232,7 @@ int propagate_mnt(struct mount *dest_mnt, struct dentry *dest_dentry, int type; struct mount *source; - if (IS_MNT_NEW(&m->mnt)) + if (IS_MNT_NEW(m)) continue; source = get_source(m, prev_dest_mnt, prev_src_mnt, &type); -- cgit v1.2.3 From 15169fe784a9846b24cdb0840329d41aebc23249 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 25 Nov 2011 00:50:41 -0500 Subject: vfs: mnt_id/mnt_group_id moved Signed-off-by: Al Viro --- fs/pnode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index cec329822a16..001c8b0df379 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -58,7 +58,7 @@ int get_dominating_id(struct mount *mnt, const struct path *root) for (m = mnt->mnt_master; m != NULL; m = m->mnt_master) { struct mount *d = get_peer_under_root(m, mnt->mnt_ns, root); if (d) - return d->mnt.mnt_group_id; + return d->mnt_group_id; } return 0; @@ -86,7 +86,7 @@ static int do_make_slave(struct mount *mnt) mnt_release_group_id(mnt); list_del_init(&mnt->mnt_share); - mnt->mnt.mnt_group_id = 0; + mnt->mnt_group_id = 0; if (peer_mnt) master = peer_mnt; -- cgit v1.2.3 From 863d684f946eb240c7dd57d265d88315950ca5cc Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 25 Nov 2011 00:57:42 -0500 Subject: vfs: move the rest of int fields to struct mount Signed-off-by: Al Viro --- fs/pnode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index 001c8b0df379..a40abf20f35e 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -272,7 +272,7 @@ out: */ static inline int do_refcount_check(struct mount *mnt, int count) { - int mycount = mnt_get_count(mnt) - mnt->mnt.mnt_ghosts; + int mycount = mnt_get_count(mnt) - mnt->mnt_ghosts; return (mycount > count); } -- cgit v1.2.3 From fc7be130c7e91cf693d4bc2d9b11f08a5a4893d0 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Fri, 25 Nov 2011 01:05:37 -0500 Subject: vfs: switch pnode.h macros to struct mount * Signed-off-by: Al Viro --- fs/pnode.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'fs/pnode.c') diff --git a/fs/pnode.c b/fs/pnode.c index a40abf20f35e..ab5fa9e1a79a 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -82,7 +82,7 @@ static int do_make_slave(struct mount *mnt) if (peer_mnt == mnt) peer_mnt = NULL; } - if (IS_MNT_SHARED(&mnt->mnt) && list_empty(&mnt->mnt_share)) + if (IS_MNT_SHARED(mnt) && list_empty(&mnt->mnt_share)) mnt_release_group_id(mnt); list_del_init(&mnt->mnt_share); @@ -107,7 +107,7 @@ static int do_make_slave(struct mount *mnt) } } mnt->mnt_master = master; - CLEAR_MNT_SHARED(&mnt->mnt); + CLEAR_MNT_SHARED(mnt); return 0; } @@ -199,7 +199,7 @@ static struct mount *get_source(struct mount *dest, /* slave of the earlier, then */ *type = CL_SLAVE; /* beginning of peer group among the slaves? */ - if (IS_MNT_SHARED(&dest->mnt)) + if (IS_MNT_SHARED(dest)) *type |= CL_MAKE_SHARED; return last_src; } -- cgit v1.2.3