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;
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) {