• Home
  • Raw
  • Download

Lines Matching +full:parent +full:- +full:child

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()
223 return m1->mnt_group_id == m2->mnt_group_id && m1->mnt_group_id; in peers()
228 struct mount *child; in propagate_one() local
234 if (!is_subdir(mp->m_dentry, m->mnt.mnt_root)) in propagate_one()
242 p = n->mnt_master; in propagate_one()
247 struct mount *parent = last_source->mnt_parent; in propagate_one() local
250 done = parent->mnt_master == p; in propagate_one()
251 if (done && peers(n, parent)) in propagate_one()
253 last_source = last_source->mnt_master; in propagate_one()
263 if (m->mnt_ns->user_ns != user_ns) in propagate_one()
265 child = copy_tree(last_source, last_source->mnt.mnt_root, type); in propagate_one()
266 if (IS_ERR(child)) in propagate_one()
267 return PTR_ERR(child); in propagate_one()
268 child->mnt.mnt_flags &= ~MNT_LOCKED; in propagate_one()
270 mnt_set_mountpoint(m, mp, child); in propagate_one()
271 if (m->mnt_master != dest_master) in propagate_one()
272 SET_MNT_MARK(m->mnt_master); in propagate_one()
275 last_source = child; in propagate_one()
276 hlist_add_head(&child->mnt_hash, list); in propagate_one()
277 return count_mounts(m->mnt_ns, child); in propagate_one()
285 * source_mnt. Also link all the new mounts using ->mnt_list
286 * headed at source_mnt's ->mnt_list
304 user_ns = current->nsproxy->mnt_ns->user_ns; in propagate_mnt()
310 dest_master = dest_mnt->mnt_master; in propagate_mnt()
334 m = n->mnt_parent; in propagate_mnt()
335 if (m->mnt_master != dest_mnt->mnt_master) in propagate_mnt()
336 CLEAR_MNT_MARK(m->mnt_master); in propagate_mnt()
345 struct mount *child; in find_topper() local
347 if (!list_is_singular(&mnt->mnt_mounts)) in find_topper()
350 child = list_first_entry(&mnt->mnt_mounts, struct mount, mnt_child); in find_topper()
351 if (child->mnt_mountpoint != mnt->mnt.mnt_root) in find_topper()
354 return child; in find_topper()
369 * other mounts its parent propagates to.
377 struct mount *m, *child, *topper; in propagate_mount_busy() local
378 struct mount *parent = mnt->mnt_parent; in propagate_mount_busy() local
380 if (mnt == parent) in propagate_mount_busy()
388 if (!list_empty(&mnt->mnt_mounts) || do_refcount_check(mnt, refcnt)) in propagate_mount_busy()
391 for (m = propagation_next(parent, parent); m; in propagate_mount_busy()
392 m = propagation_next(m, parent)) { in propagate_mount_busy()
394 child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_busy()
395 if (!child) in propagate_mount_busy()
398 /* Is there exactly one mount on the child that covers in propagate_mount_busy()
401 topper = find_topper(child); in propagate_mount_busy()
404 else if (!list_empty(&child->mnt_mounts)) in propagate_mount_busy()
407 if (do_refcount_check(child, count)) in propagate_mount_busy()
420 struct mount *parent = mnt->mnt_parent; in propagate_mount_unlock() local
421 struct mount *m, *child; in propagate_mount_unlock() local
423 BUG_ON(parent == mnt); in propagate_mount_unlock()
425 for (m = propagation_next(parent, parent); m; in propagate_mount_unlock()
426 m = propagation_next(m, parent)) { in propagate_mount_unlock()
427 child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_unlock()
428 if (child) in propagate_mount_unlock()
429 child->mnt.mnt_flags &= ~MNT_LOCKED; in propagate_mount_unlock()
436 mnt->mnt.mnt_flags |= MNT_UMOUNT; in umount_one()
437 list_del_init(&mnt->mnt_child); in umount_one()
438 list_del_init(&mnt->mnt_umounting); in umount_one()
439 list_move_tail(&mnt->mnt_list, to_umount); in umount_one()
444 * parent propagates to.
451 struct mount *child; in __propagate_umount() local
454 * The state of the parent won't change if this mount is in __propagate_umount()
457 if (mnt->mnt.mnt_flags & (MNT_UMOUNT | MNT_MARKED)) in __propagate_umount()
463 list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) { in __propagate_umount()
464 if (child->mnt_mountpoint == mnt->mnt.mnt_root) in __propagate_umount()
466 if (!list_empty(&child->mnt_umounting) && IS_MNT_MARKED(child)) in __propagate_umount()
468 /* Found a mounted child */ in __propagate_umount()
481 list_move_tail(&mnt->mnt_umounting, to_restore); in __propagate_umount()
490 struct mount *mnt, *child, *tmp; in umount_list() local
492 list_for_each_entry_safe(child, tmp, &mnt->mnt_mounts, mnt_child) { in umount_list()
494 if (child->mnt_mountpoint == mnt->mnt.mnt_root) in umount_list()
495 list_move_tail(&child->mnt_umounting, to_restore); in umount_list()
497 umount_one(child, to_umount); in umount_list()
506 struct mount *mnt, *parent; in restore_mounts() local
511 list_del_init(&mnt->mnt_umounting); in restore_mounts()
514 mp = mnt->mnt_mp; in restore_mounts()
515 parent = mnt->mnt_parent; in restore_mounts()
516 while (parent->mnt.mnt_flags & MNT_UMOUNT) { in restore_mounts()
517 mp = parent->mnt_mp; in restore_mounts()
518 parent = parent->mnt_parent; in restore_mounts()
520 if (parent != mnt->mnt_parent) in restore_mounts()
521 mnt_change_mountpoint(parent, mp, mnt); in restore_mounts()
530 list_del_init(&mnt->mnt_umounting); in cleanup_umount_visitations()
550 struct mount *parent = mnt->mnt_parent; in propagate_umount() local
559 if (!list_empty(&mnt->mnt_umounting)) in propagate_umount()
562 list_add_tail(&mnt->mnt_umounting, &visited); in propagate_umount()
563 for (m = propagation_next(parent, parent); m; in propagate_umount()
564 m = propagation_next(m, parent)) { in propagate_umount()
565 struct mount *child = __lookup_mnt(&m->mnt, in propagate_umount() local
566 mnt->mnt_mountpoint); in propagate_umount()
567 if (!child) in propagate_umount()
570 if (!list_empty(&child->mnt_umounting)) { in propagate_umount()
572 * If the child has already been visited it is in propagate_umount()
578 m = skip_propagation_subtree(m, parent); in propagate_umount()
580 } else if (child->mnt.mnt_flags & MNT_UMOUNT) { in propagate_umount()
587 list_add_tail(&child->mnt_umounting, &visited); in propagate_umount()
591 /* Check the child and parents while progress is made */ in propagate_umount()
592 while (__propagate_umount(child, in propagate_umount()
594 /* Is the parent a umount candidate? */ in propagate_umount()
595 child = child->mnt_parent; in propagate_umount()
596 if (list_empty(&child->mnt_umounting)) in propagate_umount()