Lines Matching refs:mnt

37 static struct mount *get_peer_under_root(struct mount *mnt,  in get_peer_under_root()  argument
41 struct mount *m = mnt; in get_peer_under_root()
45 if (m->mnt_ns == ns && is_path_reachable(m, m->mnt.mnt_root, root)) in get_peer_under_root()
49 } while (m != mnt); in get_peer_under_root()
60 int get_dominating_id(struct mount *mnt, const struct path *root) in get_dominating_id() argument
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()
73 static int do_make_slave(struct mount *mnt) in do_make_slave() argument
77 if (list_empty(&mnt->mnt_share)) { in do_make_slave()
78 if (IS_MNT_SHARED(mnt)) { in do_make_slave()
79 mnt_release_group_id(mnt); in do_make_slave()
80 CLEAR_MNT_SHARED(mnt); 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()
100 for (m = master = next_peer(mnt); m != mnt; m = next_peer(m)) { 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()
108 CLEAR_MNT_SHARED(mnt); in do_make_slave()
110 list_for_each_entry(slave_mnt, &mnt->mnt_slave_list, mnt_slave) 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()
122 void change_mnt_propagation(struct mount *mnt, int type) in change_mnt_propagation() argument
125 set_mnt_shared(mnt); in change_mnt_propagation()
128 do_make_slave(mnt); in change_mnt_propagation()
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()
232 if (!is_subdir(dest_mp->m_dentry, m->mnt.mnt_root)) in propagate_one()
260 child = copy_tree(last_source, last_source->mnt.mnt_root, type); in propagate_one()
334 static struct mount *find_topper(struct mount *mnt) in find_topper() argument
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()
352 static inline int do_refcount_check(struct mount *mnt, int count) in do_refcount_check() argument
354 return mnt_get_count(mnt) > count; in do_refcount_check()
386 if (to->mnt.mnt_root != mp->m_dentry) in propagation_would_overmount()
407 int propagate_mount_busy(struct mount *mnt, int refcnt) in propagate_mount_busy() argument
410 struct mount *parent = mnt->mnt_parent; in propagate_mount_busy()
412 if (mnt == parent) in propagate_mount_busy()
413 return do_refcount_check(mnt, refcnt); in propagate_mount_busy()
420 if (!list_empty(&mnt->mnt_mounts) || do_refcount_check(mnt, refcnt)) in propagate_mount_busy()
426 child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_busy()
450 void propagate_mount_unlock(struct mount *mnt) in propagate_mount_unlock() argument
452 struct mount *parent = mnt->mnt_parent; in propagate_mount_unlock()
455 BUG_ON(parent == mnt); in propagate_mount_unlock()
459 child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_unlock()
461 child->mnt.mnt_flags &= ~MNT_LOCKED; in propagate_mount_unlock()
465 static void umount_one(struct mount *mnt, struct list_head *to_umount) in umount_one() argument
467 CLEAR_MNT_MARK(mnt); in umount_one()
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 move_from_ns(mnt, to_umount); in umount_one()
478 static bool __propagate_umount(struct mount *mnt, in __propagate_umount() argument
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()
505 SET_MNT_MARK(mnt); in __propagate_umount()
509 if (!IS_MNT_LOCKED(mnt)) { in __propagate_umount()
510 umount_one(mnt, to_umount); 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
523 list_for_each_entry(mnt, to_umount, mnt_list) { in umount_list()
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()
538 struct mount *mnt, *parent; in restore_mounts() local
541 mnt = list_first_entry(to_restore, struct mount, mnt_umounting); in restore_mounts()
542 CLEAR_MNT_MARK(mnt); in restore_mounts()
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()
552 if (parent != mnt->mnt_parent) in restore_mounts()
553 mnt_change_mountpoint(parent, mp, mnt); in restore_mounts()
560 struct mount *mnt = in cleanup_umount_visitations() local
562 list_del_init(&mnt->mnt_umounting); in cleanup_umount_visitations()
575 struct mount *mnt; in propagate_umount() local
581 list_for_each_entry_reverse(mnt, list, mnt_list) { in propagate_umount()
582 struct mount *parent = mnt->mnt_parent; in propagate_umount()
591 if (!list_empty(&mnt->mnt_umounting)) in propagate_umount()
594 list_add_tail(&mnt->mnt_umounting, &visited); in propagate_umount()
597 struct mount *child = __lookup_mnt(&m->mnt, in propagate_umount()
598 mnt->mnt_mountpoint); in propagate_umount()
612 } else if (child->mnt.mnt_flags & MNT_UMOUNT) { in propagate_umount()