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
75 struct mount *peer_mnt = mnt, *master = mnt->mnt_master; in do_make_slave()
83 while ((peer_mnt = next_peer(peer_mnt)) != mnt && in do_make_slave()
84 peer_mnt->mnt.mnt_root != mnt->mnt.mnt_root) ; in do_make_slave()
86 if (peer_mnt == mnt) { in do_make_slave()
87 peer_mnt = next_peer(mnt); in do_make_slave()
88 if (peer_mnt == mnt) in do_make_slave()
91 if (mnt->mnt_group_id && IS_MNT_SHARED(mnt) && in do_make_slave()
92 list_empty(&mnt->mnt_share)) in do_make_slave()
93 mnt_release_group_id(mnt); in do_make_slave()
95 list_del_init(&mnt->mnt_share); in do_make_slave()
96 mnt->mnt_group_id = 0; in do_make_slave()
102 list_for_each_entry(slave_mnt, &mnt->mnt_slave_list, mnt_slave) in do_make_slave()
104 list_move(&mnt->mnt_slave, &master->mnt_slave_list); in do_make_slave()
105 list_splice(&mnt->mnt_slave_list, master->mnt_slave_list.prev); in do_make_slave()
106 INIT_LIST_HEAD(&mnt->mnt_slave_list); in do_make_slave()
108 struct list_head *p = &mnt->mnt_slave_list; in do_make_slave()
116 mnt->mnt_master = master; in do_make_slave()
117 CLEAR_MNT_SHARED(mnt); in do_make_slave()
124 void change_mnt_propagation(struct mount *mnt, int type) in change_mnt_propagation() argument
127 set_mnt_shared(mnt); in change_mnt_propagation()
130 do_make_slave(mnt); in change_mnt_propagation()
132 list_del_init(&mnt->mnt_slave); in change_mnt_propagation()
133 mnt->mnt_master = NULL; in change_mnt_propagation()
135 mnt->mnt.mnt_flags |= MNT_UNBINDABLE; in change_mnt_propagation()
137 mnt->mnt.mnt_flags &= ~MNT_UNBINDABLE; in change_mnt_propagation()
236 if (!is_subdir(mp->m_dentry, m->mnt.mnt_root)) in propagate_one()
267 child = copy_tree(last_source, last_source->mnt.mnt_root, type); in propagate_one()
270 child->mnt.mnt_flags &= ~MNT_LOCKED; in propagate_one()
344 static struct mount *find_topper(struct mount *mnt) in find_topper() argument
349 if (!list_is_singular(&mnt->mnt_mounts)) in find_topper()
352 child = list_first_entry(&mnt->mnt_mounts, struct mount, mnt_child); in find_topper()
353 if (child->mnt_mountpoint != mnt->mnt.mnt_root) in find_topper()
362 static inline int do_refcount_check(struct mount *mnt, int count) in do_refcount_check() argument
364 return mnt_get_count(mnt) > count; in do_refcount_check()
377 int propagate_mount_busy(struct mount *mnt, int refcnt) in propagate_mount_busy() argument
380 struct mount *parent = mnt->mnt_parent; in propagate_mount_busy()
382 if (mnt == parent) in propagate_mount_busy()
383 return do_refcount_check(mnt, refcnt); in propagate_mount_busy()
390 if (!list_empty(&mnt->mnt_mounts) || do_refcount_check(mnt, refcnt)) in propagate_mount_busy()
396 child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_busy()
420 void propagate_mount_unlock(struct mount *mnt) in propagate_mount_unlock() argument
422 struct mount *parent = mnt->mnt_parent; in propagate_mount_unlock()
425 BUG_ON(parent == mnt); in propagate_mount_unlock()
429 child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_unlock()
431 child->mnt.mnt_flags &= ~MNT_LOCKED; in propagate_mount_unlock()
435 static void umount_one(struct mount *mnt, struct list_head *to_umount) in umount_one() argument
437 CLEAR_MNT_MARK(mnt); in umount_one()
438 mnt->mnt.mnt_flags |= MNT_UMOUNT; in umount_one()
439 list_del_init(&mnt->mnt_child); in umount_one()
440 list_del_init(&mnt->mnt_umounting); in umount_one()
441 list_move_tail(&mnt->mnt_list, to_umount); in umount_one()
448 static bool __propagate_umount(struct mount *mnt, in __propagate_umount() argument
459 if (mnt->mnt.mnt_flags & (MNT_UMOUNT | MNT_MARKED)) in __propagate_umount()
465 list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) { in __propagate_umount()
466 if (child->mnt_mountpoint == mnt->mnt.mnt_root) in __propagate_umount()
475 SET_MNT_MARK(mnt); in __propagate_umount()
479 if (!IS_MNT_LOCKED(mnt)) { in __propagate_umount()
480 umount_one(mnt, to_umount); in __propagate_umount()
483 list_move_tail(&mnt->mnt_umounting, to_restore); in __propagate_umount()
492 struct mount *mnt, *child, *tmp; in umount_list() local
493 list_for_each_entry(mnt, to_umount, mnt_list) { in umount_list()
494 list_for_each_entry_safe(child, tmp, &mnt->mnt_mounts, mnt_child) { in umount_list()
496 if (child->mnt_mountpoint == mnt->mnt.mnt_root) in umount_list()
508 struct mount *mnt, *parent; in restore_mounts() local
511 mnt = list_first_entry(to_restore, struct mount, mnt_umounting); in restore_mounts()
512 CLEAR_MNT_MARK(mnt); in restore_mounts()
513 list_del_init(&mnt->mnt_umounting); in restore_mounts()
516 mp = mnt->mnt_mp; in restore_mounts()
517 parent = mnt->mnt_parent; in restore_mounts()
518 while (parent->mnt.mnt_flags & MNT_UMOUNT) { in restore_mounts()
522 if (parent != mnt->mnt_parent) in restore_mounts()
523 mnt_change_mountpoint(parent, mp, mnt); in restore_mounts()
530 struct mount *mnt = in cleanup_umount_visitations() local
532 list_del_init(&mnt->mnt_umounting); in cleanup_umount_visitations()
545 struct mount *mnt; in propagate_umount() local
551 list_for_each_entry_reverse(mnt, list, mnt_list) { in propagate_umount()
552 struct mount *parent = mnt->mnt_parent; in propagate_umount()
561 if (!list_empty(&mnt->mnt_umounting)) in propagate_umount()
564 list_add_tail(&mnt->mnt_umounting, &visited); in propagate_umount()
567 struct mount *child = __lookup_mnt(&m->mnt, in propagate_umount()
568 mnt->mnt_mountpoint); in propagate_umount()
582 } else if (child->mnt.mnt_flags & MNT_UMOUNT) { in propagate_umount()
612 void propagate_remount(struct mount *mnt) in propagate_remount() argument
614 struct mount *parent = mnt->mnt_parent; in propagate_remount()
615 struct mount *p = mnt, *m; in propagate_remount()
616 struct super_block *sb = mnt->mnt.mnt_sb; in propagate_remount()
622 m = __lookup_mnt(&p->mnt, mnt->mnt_mountpoint); in propagate_remount()
624 sb->s_op->copy_mnt_data(m->mnt.data, mnt->mnt.data); in propagate_remount()