summaryrefslogtreecommitdiff
path: root/fs/pnode.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2025-06-24 23:36:43 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2025-06-29 19:03:30 -0400
commit94a8d0027606397ce58b00077bf6146f25923965 (patch)
treeeb4e1938f516493393199e444dd995da213b7572 /fs/pnode.c
parent955336e204ab59301ff8b1f75a98a226f5a98782 (diff)
downloadlinux-94a8d0027606397ce58b00077bf6146f25923965.tar.gz
linux-94a8d0027606397ce58b00077bf6146f25923965.tar.bz2
linux-94a8d0027606397ce58b00077bf6146f25923965.zip
turn do_make_slave() into transfer_propagation()
Lift calculation of replacement propagation source, removal from peer group and assignment of ->mnt_master from do_make_slave() into change_mnt_propagation() itself. What remains is switching of what used to get propagation *through* mnt to alternative source. Rename to transfer_propagation(), passing it the replacement source as the second argument. Have it return void, while we are at it. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/pnode.c')
-rw-r--r--fs/pnode.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/fs/pnode.c b/fs/pnode.c
index 91d10af867bd..0a54848cbbd1 100644
--- a/fs/pnode.c
+++ b/fs/pnode.c
@@ -83,19 +83,10 @@ static struct mount *propagation_source(struct mount *mnt)
return mnt;
}
-static int do_make_slave(struct mount *mnt)
+static void transfer_propagation(struct mount *mnt, struct mount *to)
{
- struct mount *master = propagation_source(mnt);
struct mount *slave_mnt;
-
- if (list_empty(&mnt->mnt_share)) {
- mnt_release_group_id(mnt);
- } else {
- list_del_init(&mnt->mnt_share);
- mnt->mnt_group_id = 0;
- }
- CLEAR_MNT_SHARED(mnt);
- if (!master) {
+ if (!to) {
struct list_head *p = &mnt->mnt_slave_list;
while (!list_empty(p)) {
slave_mnt = list_first_entry(p,
@@ -103,14 +94,12 @@ static int do_make_slave(struct mount *mnt)
list_del_init(&slave_mnt->mnt_slave);
slave_mnt->mnt_master = NULL;
}
- return 0;
+ return;
}
list_for_each_entry(slave_mnt, &mnt->mnt_slave_list, mnt_slave)
- slave_mnt->mnt_master = master;
- list_splice(&mnt->mnt_slave_list, master->mnt_slave_list.prev);
+ slave_mnt->mnt_master = to;
+ list_splice(&mnt->mnt_slave_list, to->mnt_slave_list.prev);
INIT_LIST_HEAD(&mnt->mnt_slave_list);
- mnt->mnt_master = master;
- return 0;
}
/*
@@ -122,8 +111,19 @@ void change_mnt_propagation(struct mount *mnt, int type)
set_mnt_shared(mnt);
return;
}
- if (IS_MNT_SHARED(mnt))
- do_make_slave(mnt);
+ if (IS_MNT_SHARED(mnt)) {
+ struct mount *m = propagation_source(mnt);
+
+ if (list_empty(&mnt->mnt_share)) {
+ mnt_release_group_id(mnt);
+ } else {
+ list_del_init(&mnt->mnt_share);
+ mnt->mnt_group_id = 0;
+ }
+ CLEAR_MNT_SHARED(mnt);
+ transfer_propagation(mnt, m);
+ mnt->mnt_master = m;
+ }
list_del_init(&mnt->mnt_slave);
if (type == MS_SLAVE) {
if (mnt->mnt_master)