Lines Matching +full:parent +full:- +full:child
1 // SPDX-License-Identifier: GPL-2.0-only
19 return list_entry(p->mnt_share.next, struct mount, mnt_share); in next_peer()
24 return list_entry(p->mnt_slave_list.next, struct mount, mnt_slave); in first_slave()
29 return list_entry(p->mnt_slave_list.prev, struct mount, mnt_slave); in last_slave()
34 return list_entry(p->mnt_slave.next, struct mount, mnt_slave); in next_slave()
45 if (m->mnt_ns == ns && is_path_reachable(m, m->mnt.mnt_root, root)) in get_peer_under_root()
64 for (m = mnt->mnt_master; m != NULL; m = m->mnt_master) { in get_dominating_id()
65 struct mount *d = get_peer_under_root(m, mnt->mnt_ns, root); in get_dominating_id()
67 return d->mnt_group_id; in get_dominating_id()
77 if (list_empty(&mnt->mnt_share)) { in do_make_slave()
82 master = mnt->mnt_master; in do_make_slave()
84 struct list_head *p = &mnt->mnt_slave_list; in do_make_slave()
88 list_del_init(&slave_mnt->mnt_slave); in do_make_slave()
89 slave_mnt->mnt_master = NULL; in do_make_slave()
101 if (m->mnt.mnt_root == mnt->mnt.mnt_root) { in do_make_slave()
106 list_del_init(&mnt->mnt_share); in do_make_slave()
107 mnt->mnt_group_id = 0; in do_make_slave()
110 list_for_each_entry(slave_mnt, &mnt->mnt_slave_list, mnt_slave) in do_make_slave()
111 slave_mnt->mnt_master = master; in do_make_slave()
112 list_move(&mnt->mnt_slave, &master->mnt_slave_list); in do_make_slave()
113 list_splice(&mnt->mnt_slave_list, master->mnt_slave_list.prev); in do_make_slave()
114 INIT_LIST_HEAD(&mnt->mnt_slave_list); in do_make_slave()
115 mnt->mnt_master = master; in do_make_slave()
130 list_del_init(&mnt->mnt_slave); in change_mnt_propagation()
131 mnt->mnt_master = NULL; in change_mnt_propagation()
133 mnt->mnt.mnt_flags |= MNT_UNBINDABLE; in change_mnt_propagation()
135 mnt->mnt.mnt_flags &= ~MNT_UNBINDABLE; in change_mnt_propagation()
153 if (!IS_MNT_NEW(m) && !list_empty(&m->mnt_slave_list)) in propagation_next()
157 struct mount *master = m->mnt_master; in propagation_next()
159 if (master == origin->mnt_master) { in propagation_next()
162 } else if (m->mnt_slave.next != &master->mnt_slave_list) in propagation_next()
177 if (!IS_MNT_NEW(m) && !list_empty(&m->mnt_slave_list)) in skip_propagation_subtree()
188 if (!IS_MNT_NEW(m) && !list_empty(&m->mnt_slave_list)) in next_group()
191 if (m->mnt_group_id == origin->mnt_group_id) { in next_group()
194 } else if (m->mnt_slave.next != &next->mnt_slave) in next_group()
200 struct mount *master = m->mnt_master; in next_group()
201 if (m->mnt_slave.next != &master->mnt_slave_list) in next_group()
204 if (master->mnt_group_id == origin->mnt_group_id) in next_group()
206 if (master->mnt_slave.next == &m->mnt_slave) in next_group()
221 return m1->mnt_group_id == m2->mnt_group_id && m1->mnt_group_id; in peers()
226 struct mount *child; in propagate_one() local
232 if (!is_subdir(dest_mp->m_dentry, m->mnt.mnt_root)) in propagate_one()
240 p = n->mnt_master; in propagate_one()
245 struct mount *parent = last_source->mnt_parent; in propagate_one() local
248 done = parent->mnt_master == p; in propagate_one()
249 if (done && peers(n, parent)) in propagate_one()
251 last_source = last_source->mnt_master; in propagate_one()
260 child = copy_tree(last_source, last_source->mnt.mnt_root, type); in propagate_one()
261 if (IS_ERR(child)) in propagate_one()
262 return PTR_ERR(child); in propagate_one()
264 mnt_set_mountpoint(m, dest_mp, child); in propagate_one()
265 if (m->mnt_master != dest_master) in propagate_one()
266 SET_MNT_MARK(m->mnt_master); in propagate_one()
269 last_source = child; in propagate_one()
270 hlist_add_head(&child->mnt_hash, list); in propagate_one()
271 return count_mounts(m->mnt_ns, child); in propagate_one()
279 * source_mnt. Also link all the new mounts using ->mnt_list
280 * headed at source_mnt's ->mnt_list
302 dest_master = dest_mnt->mnt_master; in propagate_mnt()
326 m = n->mnt_parent; in propagate_mnt()
327 if (m->mnt_master != dest_mnt->mnt_master) in propagate_mnt()
328 CLEAR_MNT_MARK(m->mnt_master); in propagate_mnt()
337 struct mount *child; in find_topper() local
339 if (!list_is_singular(&mnt->mnt_mounts)) in find_topper()
342 child = list_first_entry(&mnt->mnt_mounts, struct mount, mnt_child); in find_topper()
343 if (child->mnt_mountpoint != mnt->mnt.mnt_root) in find_topper()
346 return child; in find_topper()
358 * propagation_would_overmount - check whether propagation from @from
386 if (to->mnt.mnt_root != mp->m_dentry) in propagation_would_overmount()
389 for (const struct mount *m = to; m; m = m->mnt_master) { in propagation_would_overmount()
401 * other mounts its parent propagates to.
409 struct mount *m, *child, *topper; in propagate_mount_busy() local
410 struct mount *parent = mnt->mnt_parent; in propagate_mount_busy() local
412 if (mnt == parent) in propagate_mount_busy()
420 if (!list_empty(&mnt->mnt_mounts) || do_refcount_check(mnt, refcnt)) in propagate_mount_busy()
423 for (m = propagation_next(parent, parent); m; in propagate_mount_busy()
424 m = propagation_next(m, parent)) { in propagate_mount_busy()
426 child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_busy()
427 if (!child) in propagate_mount_busy()
430 /* Is there exactly one mount on the child that covers in propagate_mount_busy()
433 topper = find_topper(child); in propagate_mount_busy()
436 else if (!list_empty(&child->mnt_mounts)) in propagate_mount_busy()
439 if (do_refcount_check(child, count)) in propagate_mount_busy()
452 struct mount *parent = mnt->mnt_parent; in propagate_mount_unlock() local
453 struct mount *m, *child; in propagate_mount_unlock() local
455 BUG_ON(parent == mnt); in propagate_mount_unlock()
457 for (m = propagation_next(parent, parent); m; in propagate_mount_unlock()
458 m = propagation_next(m, parent)) { in propagate_mount_unlock()
459 child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_unlock()
460 if (child) in propagate_mount_unlock()
461 child->mnt.mnt_flags &= ~MNT_LOCKED; in propagate_mount_unlock()
468 mnt->mnt.mnt_flags |= MNT_UMOUNT; in umount_one()
469 list_del_init(&mnt->mnt_child); in umount_one()
470 list_del_init(&mnt->mnt_umounting); in umount_one()
471 list_move_tail(&mnt->mnt_list, to_umount); in umount_one()
476 * parent propagates to.
483 struct mount *child; in __propagate_umount() local
486 * The state of the parent won't change if this mount is in __propagate_umount()
489 if (mnt->mnt.mnt_flags & (MNT_UMOUNT | MNT_MARKED)) in __propagate_umount()
495 list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) { in __propagate_umount()
496 if (child->mnt_mountpoint == mnt->mnt.mnt_root) in __propagate_umount()
498 if (!list_empty(&child->mnt_umounting) && IS_MNT_MARKED(child)) in __propagate_umount()
500 /* Found a mounted child */ in __propagate_umount()
513 list_move_tail(&mnt->mnt_umounting, to_restore); in __propagate_umount()
522 struct mount *mnt, *child, *tmp; in umount_list() local
524 list_for_each_entry_safe(child, tmp, &mnt->mnt_mounts, mnt_child) { in umount_list()
526 if (child->mnt_mountpoint == mnt->mnt.mnt_root) in umount_list()
527 list_move_tail(&child->mnt_umounting, to_restore); in umount_list()
529 umount_one(child, to_umount); in umount_list()
538 struct mount *mnt, *parent; in restore_mounts() local
543 list_del_init(&mnt->mnt_umounting); in restore_mounts()
546 mp = mnt->mnt_mp; in restore_mounts()
547 parent = mnt->mnt_parent; in restore_mounts()
548 while (parent->mnt.mnt_flags & MNT_UMOUNT) { in restore_mounts()
549 mp = parent->mnt_mp; in restore_mounts()
550 parent = parent->mnt_parent; in restore_mounts()
552 if (parent != mnt->mnt_parent) in restore_mounts()
553 mnt_change_mountpoint(parent, mp, mnt); in restore_mounts()
562 list_del_init(&mnt->mnt_umounting); in cleanup_umount_visitations()
582 struct mount *parent = mnt->mnt_parent; in propagate_umount() local
591 if (!list_empty(&mnt->mnt_umounting)) in propagate_umount()
594 list_add_tail(&mnt->mnt_umounting, &visited); in propagate_umount()
595 for (m = propagation_next(parent, parent); m; in propagate_umount()
596 m = propagation_next(m, parent)) { in propagate_umount()
597 struct mount *child = __lookup_mnt(&m->mnt, in propagate_umount() local
598 mnt->mnt_mountpoint); in propagate_umount()
599 if (!child) in propagate_umount()
602 if (!list_empty(&child->mnt_umounting)) { in propagate_umount()
604 * If the child has already been visited it is in propagate_umount()
610 m = skip_propagation_subtree(m, parent); in propagate_umount()
612 } else if (child->mnt.mnt_flags & MNT_UMOUNT) { in propagate_umount()
619 list_add_tail(&child->mnt_umounting, &visited); in propagate_umount()
623 /* Check the child and parents while progress is made */ in propagate_umount()
624 while (__propagate_umount(child, in propagate_umount()
626 /* Is the parent a umount candidate? */ in propagate_umount()
627 child = child->mnt_parent; in propagate_umount()
628 if (list_empty(&child->mnt_umounting)) in propagate_umount()