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()
337 static struct mount *find_topper(struct mount *mnt) in find_topper() argument
342 if (!list_is_singular(&mnt->mnt_mounts)) in find_topper()
345 child = list_first_entry(&mnt->mnt_mounts, struct mount, mnt_child); in find_topper()
346 if (child->mnt_mountpoint != mnt->mnt.mnt_root) in find_topper()
355 static inline int do_refcount_check(struct mount *mnt, int count) in do_refcount_check() argument
357 return mnt_get_count(mnt) > count; in do_refcount_check()
370 int propagate_mount_busy(struct mount *mnt, int refcnt) in propagate_mount_busy() argument
373 struct mount *parent = mnt->mnt_parent; in propagate_mount_busy()
375 if (mnt == parent) in propagate_mount_busy()
376 return do_refcount_check(mnt, refcnt); in propagate_mount_busy()
383 if (!list_empty(&mnt->mnt_mounts) || do_refcount_check(mnt, refcnt)) in propagate_mount_busy()
389 child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_busy()
413 void propagate_mount_unlock(struct mount *mnt) in propagate_mount_unlock() argument
415 struct mount *parent = mnt->mnt_parent; in propagate_mount_unlock()
418 BUG_ON(parent == mnt); in propagate_mount_unlock()
422 child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_unlock()
424 child->mnt.mnt_flags &= ~MNT_LOCKED; in propagate_mount_unlock()
428 static void umount_one(struct mount *mnt, struct list_head *to_umount) in umount_one() argument
430 CLEAR_MNT_MARK(mnt); in umount_one()
431 mnt->mnt.mnt_flags |= MNT_UMOUNT; in umount_one()
432 list_del_init(&mnt->mnt_child); in umount_one()
433 list_del_init(&mnt->mnt_umounting); in umount_one()
434 list_move_tail(&mnt->mnt_list, to_umount); in umount_one()
441 static bool __propagate_umount(struct mount *mnt, in __propagate_umount() argument
452 if (mnt->mnt.mnt_flags & (MNT_UMOUNT | MNT_MARKED)) in __propagate_umount()
458 list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) { in __propagate_umount()
459 if (child->mnt_mountpoint == mnt->mnt.mnt_root) in __propagate_umount()
468 SET_MNT_MARK(mnt); in __propagate_umount()
472 if (!IS_MNT_LOCKED(mnt)) { in __propagate_umount()
473 umount_one(mnt, to_umount); in __propagate_umount()
476 list_move_tail(&mnt->mnt_umounting, to_restore); in __propagate_umount()
485 struct mount *mnt, *child, *tmp; in umount_list() local
486 list_for_each_entry(mnt, to_umount, mnt_list) { in umount_list()
487 list_for_each_entry_safe(child, tmp, &mnt->mnt_mounts, mnt_child) { in umount_list()
489 if (child->mnt_mountpoint == mnt->mnt.mnt_root) in umount_list()
501 struct mount *mnt, *parent; in restore_mounts() local
504 mnt = list_first_entry(to_restore, struct mount, mnt_umounting); in restore_mounts()
505 CLEAR_MNT_MARK(mnt); in restore_mounts()
506 list_del_init(&mnt->mnt_umounting); in restore_mounts()
509 mp = mnt->mnt_mp; in restore_mounts()
510 parent = mnt->mnt_parent; in restore_mounts()
511 while (parent->mnt.mnt_flags & MNT_UMOUNT) { in restore_mounts()
515 if (parent != mnt->mnt_parent) in restore_mounts()
516 mnt_change_mountpoint(parent, mp, mnt); in restore_mounts()
523 struct mount *mnt = in cleanup_umount_visitations() local
525 list_del_init(&mnt->mnt_umounting); in cleanup_umount_visitations()
538 struct mount *mnt; in propagate_umount() local
544 list_for_each_entry_reverse(mnt, list, mnt_list) { in propagate_umount()
545 struct mount *parent = mnt->mnt_parent; in propagate_umount()
554 if (!list_empty(&mnt->mnt_umounting)) in propagate_umount()
557 list_add_tail(&mnt->mnt_umounting, &visited); in propagate_umount()
560 struct mount *child = __lookup_mnt(&m->mnt, in propagate_umount()
561 mnt->mnt_mountpoint); in propagate_umount()
575 } else if (child->mnt.mnt_flags & MNT_UMOUNT) { in propagate_umount()