Lines Matching refs:m

37 	struct mount *m = mnt;  in get_peer_under_root()  local
41 if (m->mnt_ns == ns && is_path_reachable(m, m->mnt.mnt_root, root)) in get_peer_under_root()
42 return m; in get_peer_under_root()
44 m = next_peer(m); in get_peer_under_root()
45 } while (m != mnt); in get_peer_under_root()
58 struct mount *m; in get_dominating_id() local
60 for (m = mnt->mnt_master; m != NULL; m = m->mnt_master) { in get_dominating_id()
61 struct mount *d = get_peer_under_root(m, mnt->mnt_ns, root); in get_dominating_id()
69 static inline bool will_be_unmounted(struct mount *m) in will_be_unmounted() argument
71 return m->mnt.mnt_flags & MNT_UMOUNT; in will_be_unmounted()
77 struct mount *m; in transfer_propagation() local
79 hlist_for_each_entry_safe(m, n, &mnt->mnt_slave_list, mnt_slave) { in transfer_propagation()
80 m->mnt_master = to; in transfer_propagation()
82 hlist_del_init(&m->mnt_slave); in transfer_propagation()
84 p = &m->mnt_slave; in transfer_propagation()
95 struct mount *m = mnt->mnt_master; in change_mnt_propagation() local
105 m = next_peer(mnt); in change_mnt_propagation()
110 transfer_propagation(mnt, m); in change_mnt_propagation()
114 mnt->mnt_master = m; in change_mnt_propagation()
115 if (m) in change_mnt_propagation()
116 hlist_add_head(&mnt->mnt_slave, &m->mnt_slave_list); in change_mnt_propagation()
126 static struct mount *trace_transfers(struct mount *m) in trace_transfers() argument
129 struct mount *next = next_peer(m); in trace_transfers()
131 if (next != m) { in trace_transfers()
132 list_del_init(&m->mnt_share); in trace_transfers()
133 m->mnt_group_id = 0; in trace_transfers()
134 m->mnt_master = next; in trace_transfers()
136 if (IS_MNT_SHARED(m)) in trace_transfers()
137 mnt_release_group_id(m); in trace_transfers()
138 next = m->mnt_master; in trace_transfers()
140 hlist_del_init(&m->mnt_slave); in trace_transfers()
141 CLEAR_MNT_SHARED(m); in trace_transfers()
142 SET_MNT_MARK(m); in trace_transfers()
148 m = next; in trace_transfers()
152 static void set_destinations(struct mount *m, struct mount *master) in set_destinations() argument
156 while ((next = m->mnt_master) != master) { in set_destinations()
157 m->mnt_master = master; in set_destinations()
158 m = next; in set_destinations()
164 struct mount *m; in bulk_make_private() local
166 list_for_each_entry(m, set, mnt_list) in bulk_make_private()
167 if (!IS_MNT_MARKED(m)) in bulk_make_private()
168 set_destinations(m, trace_transfers(m)); in bulk_make_private()
170 list_for_each_entry(m, set, mnt_list) { in bulk_make_private()
171 transfer_propagation(m, m->mnt_master); in bulk_make_private()
172 m->mnt_master = NULL; in bulk_make_private()
173 CLEAR_MNT_MARK(m); in bulk_make_private()
177 static struct mount *__propagation_next(struct mount *m, in __propagation_next() argument
181 struct mount *master = m->mnt_master; in __propagation_next()
184 struct mount *next = next_peer(m); in __propagation_next()
186 } else if (m->mnt_slave.next) in __propagation_next()
187 return next_slave(m); in __propagation_next()
190 m = master; in __propagation_next()
204 static struct mount *propagation_next(struct mount *m, in propagation_next() argument
208 if (!IS_MNT_NEW(m) && !hlist_empty(&m->mnt_slave_list)) in propagation_next()
209 return first_slave(m); in propagation_next()
211 return __propagation_next(m, origin); in propagation_next()
214 static struct mount *skip_propagation_subtree(struct mount *m, in skip_propagation_subtree() argument
220 struct mount *p = __propagation_next(m, origin); in skip_propagation_subtree()
222 while (p && peers(m, p)) in skip_propagation_subtree()
228 static struct mount *next_group(struct mount *m, struct mount *origin) in next_group() argument
233 if (!IS_MNT_NEW(m) && !hlist_empty(&m->mnt_slave_list)) in next_group()
234 return first_slave(m); in next_group()
235 next = next_peer(m); in next_group()
236 if (m->mnt_group_id == origin->mnt_group_id) { in next_group()
239 } else if (m->mnt_slave.next != &next->mnt_slave) in next_group()
241 m = next; in next_group()
245 struct mount *master = m->mnt_master; in next_group()
246 if (m->mnt_slave.next) in next_group()
247 return next_slave(m); in next_group()
248 m = next_peer(master); in next_group()
251 if (master->mnt_slave.next == &m->mnt_slave) in next_group()
253 m = master; in next_group()
255 if (m == origin) in next_group()
260 static bool need_secondary(struct mount *m, struct mountpoint *dest_mp) in need_secondary() argument
263 if (IS_MNT_NEW(m)) in need_secondary()
266 if (!is_subdir(dest_mp->m_dentry, m->mnt.mnt_root)) in need_secondary()
269 if (is_anon_ns(m->mnt_ns)) in need_secondary()
274 static struct mount *find_master(struct mount *m, in find_master() argument
282 p = m->mnt_master; in find_master()
285 m = p; in find_master()
290 if (!peers(parent, m)) in find_master()
314 struct mount *m, *n, *copy, *this; in propagate_mnt() local
321 for (m = dest_mnt; m && !err; m = next_group(m, dest_mnt)) { in propagate_mnt()
322 if (m == dest_mnt) { // have one for dest_mnt itself in propagate_mnt()
325 n = next_peer(m); in propagate_mnt()
326 if (n == m) in propagate_mnt()
331 if (IS_MNT_SHARED(m)) in propagate_mnt()
333 n = m; in propagate_mnt()
355 } while ((n = next_peer(n)) != m); in propagate_mnt()
359 m = n->mnt_parent; in propagate_mnt()
360 if (m->mnt_master) in propagate_mnt()
361 CLEAR_MNT_MARK(m->mnt_master); in propagate_mnt()
405 for (const struct mount *m = to; m; m = m->mnt_master) { in propagation_would_overmount() local
406 if (peers(from, m)) in propagation_would_overmount()
438 for (struct mount *m = propagation_next(parent, parent); m; in propagate_mount_busy() local
439 m = propagation_next(m, parent)) { in propagate_mount_busy()
441 struct mount *child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_busy()
469 struct mount *m, *child; in propagate_mount_unlock() local
473 for (m = propagation_next(parent, parent); m; in propagate_mount_unlock()
474 m = propagation_next(m, parent)) { in propagate_mount_unlock()
475 child = __lookup_mnt(&m->mnt, mnt->mnt_mountpoint); in propagate_mount_unlock()
481 static inline bool is_candidate(struct mount *m) in is_candidate() argument
483 return m->mnt_t_flags & T_UMOUNT_CANDIDATE; in is_candidate()
486 static void umount_one(struct mount *m, struct list_head *to_umount) in umount_one() argument
488 m->mnt.mnt_flags |= MNT_UMOUNT; in umount_one()
489 list_del_init(&m->mnt_child); in umount_one()
490 move_from_ns(m); in umount_one()
491 list_add_tail(&m->mnt_list, to_umount); in umount_one()
494 static void remove_from_candidate_list(struct mount *m) in remove_from_candidate_list() argument
496 m->mnt_t_flags &= ~(T_MARKED | T_UMOUNT_CANDIDATE); in remove_from_candidate_list()
497 list_del_init(&m->mnt_list); in remove_from_candidate_list()
503 struct mount *m, *p, *q; in gather_candidates() local
505 list_for_each_entry(m, set, mnt_list) { in gather_candidates()
506 if (is_candidate(m)) in gather_candidates()
508 m->mnt_t_flags |= T_UMOUNT_CANDIDATE; in gather_candidates()
509 p = m->mnt_parent; in gather_candidates()
513 m->mnt_mountpoint); in gather_candidates()
533 list_for_each_entry(m, set, mnt_list) in gather_candidates()
534 m->mnt_t_flags &= ~T_UMOUNT_CANDIDATE; in gather_candidates()
542 static void trim_ancestors(struct mount *m) in trim_ancestors() argument
546 for (p = m->mnt_parent; is_candidate(p); m = p, p = p->mnt_parent) { in trim_ancestors()
547 if (IS_MNT_MARKED(m)) // all candidates beneath are overmounts in trim_ancestors()
549 SET_MNT_MARK(m); in trim_ancestors()
550 if (m != p->overmount) in trim_ancestors()
565 static void trim_one(struct mount *m, struct list_head *to_umount) in trim_one() argument
570 if (!is_candidate(m)) { // trim_ancestors() left it on list in trim_one()
571 remove_from_candidate_list(m); in trim_one()
575 list_for_each_entry(n, &m->mnt_mounts, mnt_child) { in trim_one()
578 if (n != m->overmount) { in trim_one()
585 trim_ancestors(m); in trim_one()
586 } else if (!IS_MNT_LOCKED(m) && list_empty(&m->mnt_mounts)) { in trim_one()
591 remove_from_candidate_list(m); in trim_one()
593 umount_one(m, to_umount); in trim_one()
597 static void handle_locked(struct mount *m, struct list_head *to_umount) in handle_locked() argument
599 struct mount *cutoff = m, *p; in handle_locked()
601 if (!is_candidate(m)) { // trim_ancestors() left it on list in handle_locked()
602 remove_from_candidate_list(m); in handle_locked()
605 for (p = m; is_candidate(p); p = p->mnt_parent) { in handle_locked()
612 while (m != cutoff) { in handle_locked()
613 umount_one(m, to_umount); in handle_locked()
614 m = m->mnt_parent; in handle_locked()
631 static void reparent(struct mount *m) in reparent() argument
633 struct mount *p = m; in reparent()
641 mnt_change_mountpoint(p, mp, m); in reparent()
642 mnt_notify_add(m); in reparent()
660 struct mount *m, *p; in propagate_umount() local
668 list_for_each_entry_safe(m, p, &candidates, mnt_list) in propagate_umount()
669 trim_one(m, &to_umount); in propagate_umount()
673 m = list_first_entry(&candidates,struct mount, mnt_list); in propagate_umount()
674 handle_locked(m, &to_umount); in propagate_umount()
679 list_for_each_entry(m, &to_umount, mnt_list) { in propagate_umount()
680 struct mount *over = m->overmount; in propagate_umount()