aboutsummaryrefslogtreecommitdiffstats
path: root/fs/pnode.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2025-06-27 23:27:48 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2025-06-29 19:03:30 -0400
commit0a10217e5cf82835b63875752b57f01bba0bf5b6 (patch)
treebef71b817889405da4422506bf46aadc644b0b55 /fs/pnode.c
parentbc88530a20b1d5c78288ef5383d10b66d3242c48 (diff)
downloadtip-0a10217e5cf82835b63875752b57f01bba0bf5b6.tar.gz
propagate_mnt(): get rid of last_dest
Its only use is choosing the type of copy - CL_MAKE_SHARED if there already is a copy in that peer group, CL_SLAVE or CL_SLAVE | CL_MAKE_SHARED otherwise. But that's easy to keep track of - just set type in the beginning of group and reset to CL_MAKE_SHARED after the first created secondary in it... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/pnode.c')
-rw-r--r--fs/pnode.c21
1 files changed, 9 insertions, 12 deletions
diff --git a/fs/pnode.c b/fs/pnode.c
index e01f43820a930d..b3af55123a82c7 100644
--- a/fs/pnode.c
+++ b/fs/pnode.c
@@ -269,35 +269,32 @@ static struct mount *find_master(struct mount *m,
int propagate_mnt(struct mount *dest_mnt, struct mountpoint *dest_mp,
struct mount *source_mnt, struct hlist_head *tree_list)
{
- struct mount *m, *n, *copy, *this, *last_dest;
+ struct mount *m, *n, *copy, *this;
int err = 0, type;
- last_dest = dest_mnt;
- copy = source_mnt;
if (dest_mnt->mnt_master)
SET_MNT_MARK(dest_mnt->mnt_master);
/* iterate over peer groups, depth first */
for (m = dest_mnt; m && !err; m = next_group(m, dest_mnt)) {
if (m == dest_mnt) { // have one for dest_mnt itself
+ copy = source_mnt;
+ type = CL_MAKE_SHARED;
n = next_peer(m);
if (n == m)
continue;
} else {
+ type = CL_SLAVE;
+ /* beginning of peer group among the slaves? */
+ if (IS_MNT_SHARED(m))
+ type |= CL_MAKE_SHARED;
n = m;
}
do {
if (!need_secondary(n, dest_mp))
continue;
- if (peers(n, last_dest)) {
- type = CL_MAKE_SHARED;
- } else {
+ if (type & CL_SLAVE) // first in this peer group
copy = find_master(n, copy, source_mnt);
- type = CL_SLAVE;
- /* beginning of peer group among the slaves? */
- if (IS_MNT_SHARED(n))
- type |= CL_MAKE_SHARED;
- }
this = copy_tree(copy, copy->mnt.mnt_root, type);
if (IS_ERR(this)) {
err = PTR_ERR(this);
@@ -308,12 +305,12 @@ int propagate_mnt(struct mount *dest_mnt, struct mountpoint *dest_mp,
read_sequnlock_excl(&mount_lock);
if (n->mnt_master)
SET_MNT_MARK(n->mnt_master);
- last_dest = n;
copy = this;
hlist_add_head(&this->mnt_hash, tree_list);
err = count_mounts(n->mnt_ns, this);
if (err)
break;
+ type = CL_MAKE_SHARED;
} while ((n = next_peer(n)) != m);
}