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()
233 if (!is_subdir(mp->m_dentry, m->mnt.mnt_root)) in propagate_one()
261 child = copy_tree(last_source, last_source->mnt.mnt_root, type); in propagate_one()
336 static struct mount *find_topper(struct mount *mnt) in find_topper() argument
341 if (!list_is_singular(&mnt->mnt_mounts)) in find_topper()
344 child = list_first_entry(&mnt->mnt_mounts, struct mount, mnt_child); in find_topper()
345 if (child->mnt_mountpoint != mnt->mnt.mnt_root) in find_topper()
354 static inline int do_refcount_check(struct mount *mnt, int count) in do_refcount_check() argument
356 return mnt_get_count(mnt) > count; in do_refcount_check()
369 int propagate_mount_busy(struct mount *mnt, int refcnt) in propagate_mount_busy() argument
372 struct mount *parent = mnt->mnt_parent; in propagate_mount_busy()
374 if (mnt == parent) in propagate_mount_busy()
375 return do_refcount_check(mnt, refcnt); in propagate_mount_busy()
382 if (!list_empty(&mnt->mnt_mounts) || do_refcount_check(mnt, refcnt)) in propagate_mount_busy()
388 child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_busy()
412 void propagate_mount_unlock(struct mount *mnt) in propagate_mount_unlock() argument
414 struct mount *parent = mnt->mnt_parent; in propagate_mount_unlock()
417 BUG_ON(parent == mnt); in propagate_mount_unlock()
421 child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_unlock()
423 child->mnt.mnt_flags &= ~MNT_LOCKED; in propagate_mount_unlock()
427 static void umount_one(struct mount *mnt, struct list_head *to_umount) in umount_one() argument
429 CLEAR_MNT_MARK(mnt); in umount_one()
430 mnt->mnt.mnt_flags |= MNT_UMOUNT; in umount_one()
431 list_del_init(&mnt->mnt_child); in umount_one()
432 list_del_init(&mnt->mnt_umounting); in umount_one()
433 list_move_tail(&mnt->mnt_list, to_umount); in umount_one()
440 static bool __propagate_umount(struct mount *mnt, in __propagate_umount() argument
451 if (mnt->mnt.mnt_flags & (MNT_UMOUNT | MNT_MARKED)) in __propagate_umount()
457 list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) { in __propagate_umount()
458 if (child->mnt_mountpoint == mnt->mnt.mnt_root) in __propagate_umount()
467 SET_MNT_MARK(mnt); in __propagate_umount()
471 if (!IS_MNT_LOCKED(mnt)) { in __propagate_umount()
472 umount_one(mnt, to_umount); in __propagate_umount()
475 list_move_tail(&mnt->mnt_umounting, to_restore); in __propagate_umount()
484 struct mount *mnt, *child, *tmp; in umount_list() local
485 list_for_each_entry(mnt, to_umount, mnt_list) { in umount_list()
486 list_for_each_entry_safe(child, tmp, &mnt->mnt_mounts, mnt_child) { in umount_list()
488 if (child->mnt_mountpoint == mnt->mnt.mnt_root) in umount_list()
500 struct mount *mnt, *parent; in restore_mounts() local
503 mnt = list_first_entry(to_restore, struct mount, mnt_umounting); in restore_mounts()
504 CLEAR_MNT_MARK(mnt); in restore_mounts()
505 list_del_init(&mnt->mnt_umounting); in restore_mounts()
508 mp = mnt->mnt_mp; in restore_mounts()
509 parent = mnt->mnt_parent; in restore_mounts()
510 while (parent->mnt.mnt_flags & MNT_UMOUNT) { in restore_mounts()
514 if (parent != mnt->mnt_parent) in restore_mounts()
515 mnt_change_mountpoint(parent, mp, mnt); in restore_mounts()
522 struct mount *mnt = in cleanup_umount_visitations() local
524 list_del_init(&mnt->mnt_umounting); in cleanup_umount_visitations()
537 struct mount *mnt; in propagate_umount() local
543 list_for_each_entry_reverse(mnt, list, mnt_list) { in propagate_umount()
544 struct mount *parent = mnt->mnt_parent; in propagate_umount()
553 if (!list_empty(&mnt->mnt_umounting)) in propagate_umount()
556 list_add_tail(&mnt->mnt_umounting, &visited); in propagate_umount()
559 struct mount *child = __lookup_mnt(&m->mnt, in propagate_umount()
560 mnt->mnt_mountpoint); in propagate_umount()
574 } else if (child->mnt.mnt_flags & MNT_UMOUNT) { in propagate_umount()