]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
propagate_one(): separate the "do we need secondary here?" logics
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 28 Jun 2025 03:04:23 +0000 (23:04 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 29 Jun 2025 23:03:29 +0000 (19:03 -0400)
take the checks into separate helper - need_secondary(mount, mountpoint).

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/pnode.c

index f55295e262170782e2273bd5558353046fdf129b..7c832f98595cf833cc84b149441f4ae797af86a8 100644 (file)
@@ -218,19 +218,24 @@ static struct mount *next_group(struct mount *m, struct mount *origin)
 static struct mount *last_dest, *first_source, *last_source;
 static struct hlist_head *list;
 
-static int propagate_one(struct mount *m, struct mountpoint *dest_mp)
+static bool need_secondary(struct mount *m, struct mountpoint *dest_mp)
 {
-       struct mount *child;
-       int type;
        /* skip ones added by this propagate_mnt() */
        if (IS_MNT_NEW(m))
-               return 0;
+               return false;
        /* skip if mountpoint isn't visible in m */
        if (!is_subdir(dest_mp->m_dentry, m->mnt.mnt_root))
-               return 0;
+               return false;
        /* skip if m is in the anon_ns */
        if (is_anon_ns(m->mnt_ns))
-               return 0;
+               return false;
+       return true;
+}
+
+static int propagate_one(struct mount *m, struct mountpoint *dest_mp)
+{
+       struct mount *child;
+       int type;
 
        if (peers(m, last_dest)) {
                type = CL_MAKE_SHARED;
@@ -313,11 +318,12 @@ int propagate_mnt(struct mount *dest_mnt, struct mountpoint *dest_mp,
                        n = m;
                }
                do {
+                       if (!need_secondary(n, dest_mp))
+                               continue;
                        err = propagate_one(n, dest_mp);
                        if (err)
                                break;
-                       n = next_peer(n);
-               } while (n != m);
+               } while ((n = next_peer(n)) != m);
        }
 
        hlist_for_each_entry(n, tree_list, mnt_hash) {