Lines Matching refs:mnt

198 static inline struct hlist_head *m_hash(struct vfsmount *mnt, struct dentry *dentry)  in m_hash()  argument
200 unsigned long tmp = ((unsigned long)mnt / L1_CACHE_BYTES); in m_hash()
213 static int mnt_alloc_id(struct mount *mnt) in mnt_alloc_id() argument
218 res = __xa_alloc(&mnt_id_xa, &mnt->mnt_id, mnt, xa_limit_31b, GFP_KERNEL); in mnt_alloc_id()
220 mnt->mnt_id_unique = ++mnt_id_ctr; in mnt_alloc_id()
225 static void mnt_free_id(struct mount *mnt) in mnt_free_id() argument
227 xa_erase(&mnt_id_xa, mnt->mnt_id); in mnt_free_id()
233 static int mnt_alloc_group_id(struct mount *mnt) in mnt_alloc_group_id() argument
239 mnt->mnt_group_id = res; in mnt_alloc_group_id()
246 void mnt_release_group_id(struct mount *mnt) in mnt_release_group_id() argument
248 ida_free(&mnt_group_ida, mnt->mnt_group_id); in mnt_release_group_id()
249 mnt->mnt_group_id = 0; in mnt_release_group_id()
255 static inline void mnt_add_count(struct mount *mnt, int n) in mnt_add_count() argument
258 this_cpu_add(mnt->mnt_pcp->mnt_count, n); in mnt_add_count()
261 mnt->mnt_count += n; in mnt_add_count()
269 int mnt_get_count(struct mount *mnt) in mnt_get_count() argument
276 count += per_cpu_ptr(mnt->mnt_pcp, cpu)->mnt_count; in mnt_get_count()
281 return mnt->mnt_count; in mnt_get_count()
287 struct mount *mnt = kmem_cache_zalloc(mnt_cache, GFP_KERNEL); in alloc_vfsmnt() local
288 if (mnt) { in alloc_vfsmnt()
291 err = mnt_alloc_id(mnt); in alloc_vfsmnt()
296 mnt->mnt_devname = kstrdup_const(name, in alloc_vfsmnt()
299 mnt->mnt_devname = "none"; in alloc_vfsmnt()
300 if (!mnt->mnt_devname) in alloc_vfsmnt()
304 mnt->mnt_pcp = alloc_percpu(struct mnt_pcp); in alloc_vfsmnt()
305 if (!mnt->mnt_pcp) in alloc_vfsmnt()
308 this_cpu_add(mnt->mnt_pcp->mnt_count, 1); in alloc_vfsmnt()
310 mnt->mnt_count = 1; in alloc_vfsmnt()
311 mnt->mnt_writers = 0; in alloc_vfsmnt()
314 INIT_HLIST_NODE(&mnt->mnt_hash); in alloc_vfsmnt()
315 INIT_LIST_HEAD(&mnt->mnt_child); in alloc_vfsmnt()
316 INIT_LIST_HEAD(&mnt->mnt_mounts); in alloc_vfsmnt()
317 INIT_LIST_HEAD(&mnt->mnt_list); in alloc_vfsmnt()
318 INIT_LIST_HEAD(&mnt->mnt_expire); in alloc_vfsmnt()
319 INIT_LIST_HEAD(&mnt->mnt_share); in alloc_vfsmnt()
320 INIT_HLIST_HEAD(&mnt->mnt_slave_list); in alloc_vfsmnt()
321 INIT_HLIST_NODE(&mnt->mnt_slave); in alloc_vfsmnt()
322 INIT_HLIST_NODE(&mnt->mnt_mp_list); in alloc_vfsmnt()
323 INIT_HLIST_HEAD(&mnt->mnt_stuck_children); in alloc_vfsmnt()
324 RB_CLEAR_NODE(&mnt->mnt_node); in alloc_vfsmnt()
325 mnt->mnt.mnt_idmap = &nop_mnt_idmap; in alloc_vfsmnt()
327 return mnt; in alloc_vfsmnt()
331 kfree_const(mnt->mnt_devname); in alloc_vfsmnt()
334 mnt_free_id(mnt); in alloc_vfsmnt()
336 kmem_cache_free(mnt_cache, mnt); in alloc_vfsmnt()
359 bool __mnt_is_readonly(const struct vfsmount *mnt) in __mnt_is_readonly() argument
361 return (mnt->mnt_flags & MNT_READONLY) || sb_rdonly(mnt->mnt_sb); in __mnt_is_readonly()
365 static inline void mnt_inc_writers(struct mount *mnt) in mnt_inc_writers() argument
368 this_cpu_inc(mnt->mnt_pcp->mnt_writers); in mnt_inc_writers()
370 mnt->mnt_writers++; in mnt_inc_writers()
374 static inline void mnt_dec_writers(struct mount *mnt) in mnt_dec_writers() argument
377 this_cpu_dec(mnt->mnt_pcp->mnt_writers); in mnt_dec_writers()
379 mnt->mnt_writers--; in mnt_dec_writers()
383 static unsigned int mnt_get_writers(struct mount *mnt) in mnt_get_writers() argument
390 count += per_cpu_ptr(mnt->mnt_pcp, cpu)->mnt_writers; in mnt_get_writers()
395 return mnt->mnt_writers; in mnt_get_writers()
399 static int mnt_is_readonly(const struct vfsmount *mnt) in mnt_is_readonly() argument
401 if (READ_ONCE(mnt->mnt_sb->s_readonly_remount)) in mnt_is_readonly()
412 return __mnt_is_readonly(mnt); in mnt_is_readonly()
433 struct mount *mnt = real_mount(m); in mnt_get_write_access() local
437 mnt_inc_writers(mnt); in mnt_get_write_access()
445 while (__test_write_hold(READ_ONCE(mnt->mnt_pprev_for_sb))) { in mnt_get_write_access()
471 mnt_dec_writers(mnt); in mnt_get_write_access()
517 if (__mnt_is_readonly(file->f_path.mnt)) in mnt_get_write_access_file()
521 return mnt_get_write_access(file->f_path.mnt); in mnt_get_write_access_file()
553 void mnt_put_write_access(struct vfsmount *mnt) in mnt_put_write_access() argument
556 mnt_dec_writers(real_mount(mnt)); in mnt_put_write_access()
569 void mnt_drop_write(struct vfsmount *mnt) in mnt_drop_write() argument
571 mnt_put_write_access(mnt); in mnt_drop_write()
572 sb_end_write(mnt->mnt_sb); in mnt_drop_write()
579 mnt_put_write_access(file->f_path.mnt); in mnt_put_write_access_file()
607 static inline int mnt_hold_writers(struct mount *mnt) in mnt_hold_writers() argument
609 set_write_hold(mnt); in mnt_hold_writers()
632 if (mnt_get_writers(mnt) > 0) in mnt_hold_writers()
650 static inline void mnt_unhold_writers(struct mount *mnt) in mnt_unhold_writers() argument
652 if (!test_write_hold(mnt)) in mnt_unhold_writers()
659 clear_write_hold(mnt); in mnt_unhold_writers()
683 static int mnt_make_readonly(struct mount *mnt) in mnt_make_readonly() argument
687 ret = mnt_hold_writers(mnt); in mnt_make_readonly()
689 mnt->mnt.mnt_flags |= MNT_READONLY; in mnt_make_readonly()
690 mnt_unhold_writers(mnt); in mnt_make_readonly()
705 if (!(m->mnt.mnt_flags & MNT_READONLY)) { in sb_prepare_remount_readonly()
724 static void free_vfsmnt(struct mount *mnt) in free_vfsmnt() argument
726 mnt_idmap_put(mnt_idmap(&mnt->mnt)); in free_vfsmnt()
727 kfree_const(mnt->mnt_devname); in free_vfsmnt()
729 free_percpu(mnt->mnt_pcp); in free_vfsmnt()
731 kmem_cache_free(mnt_cache, mnt); in free_vfsmnt()
742 struct mount *mnt; in __legitimize_mnt() local
747 mnt = real_mount(bastard); in __legitimize_mnt()
748 mnt_add_count(mnt, 1); in __legitimize_mnt()
754 mnt_add_count(mnt, -1); in __legitimize_mnt()
789 struct mount *__lookup_mnt(struct vfsmount *mnt, struct dentry *dentry) in __lookup_mnt() argument
791 struct hlist_head *head = m_hash(mnt, dentry); in __lookup_mnt()
795 if (&p->mnt_parent->mnt == mnt && p->mnt_mountpoint == dentry) in __lookup_mnt()
816 child_mnt = __lookup_mnt(path->mnt, path->dentry); in lookup_mnt()
817 m = child_mnt ? &child_mnt->mnt : NULL; in lookup_mnt()
841 struct mount *mnt, *n; in __is_local_mountpoint() local
845 rbtree_postorder_for_each_entry_safe(mnt, n, &ns->mounts, mnt_node) in __is_local_mountpoint()
846 if (mnt->mnt_mountpoint == dentry) in __is_local_mountpoint()
946 static inline int check_mnt(const struct mount *mnt) in check_mnt() argument
948 return mnt->mnt_ns == current->nsproxy->mnt_ns; in check_mnt()
951 static inline bool check_anonymous_mnt(struct mount *mnt) in check_anonymous_mnt() argument
955 if (!is_anon_ns(mnt->mnt_ns)) in check_anonymous_mnt()
958 seq = mnt->mnt_ns->seq_origin; in check_anonymous_mnt()
987 static void __umount_mnt(struct mount *mnt, struct list_head *shrink_list) in __umount_mnt() argument
990 struct mount *parent = mnt->mnt_parent; in __umount_mnt()
991 if (unlikely(parent->overmount == mnt)) in __umount_mnt()
993 mnt->mnt_parent = mnt; in __umount_mnt()
994 mnt->mnt_mountpoint = mnt->mnt.mnt_root; in __umount_mnt()
995 list_del_init(&mnt->mnt_child); in __umount_mnt()
996 hlist_del_init_rcu(&mnt->mnt_hash); in __umount_mnt()
997 hlist_del_init(&mnt->mnt_mp_list); in __umount_mnt()
998 mp = mnt->mnt_mp; in __umount_mnt()
999 mnt->mnt_mp = NULL; in __umount_mnt()
1006 static void umount_mnt(struct mount *mnt) in umount_mnt() argument
1008 __umount_mnt(mnt, &ex_mountpoints); in umount_mnt()
1014 void mnt_set_mountpoint(struct mount *mnt, in mnt_set_mountpoint() argument
1019 child_mnt->mnt_parent = mnt; in mnt_set_mountpoint()
1024 static void make_visible(struct mount *mnt) in make_visible() argument
1026 struct mount *parent = mnt->mnt_parent; in make_visible()
1027 if (unlikely(mnt->mnt_mountpoint == parent->mnt.mnt_root)) in make_visible()
1028 parent->overmount = mnt; in make_visible()
1029 hlist_add_head_rcu(&mnt->mnt_hash, in make_visible()
1030 m_hash(&parent->mnt, mnt->mnt_mountpoint)); in make_visible()
1031 list_add_tail(&mnt->mnt_child, &parent->mnt_mounts); in make_visible()
1050 static void attach_mnt(struct mount *mnt, struct mount *parent, in attach_mnt() argument
1053 mnt_set_mountpoint(parent, mp, mnt); in attach_mnt()
1054 make_visible(mnt); in attach_mnt()
1057 void mnt_change_mountpoint(struct mount *parent, struct mountpoint *mp, struct mount *mnt) in mnt_change_mountpoint() argument
1059 struct mountpoint *old_mp = mnt->mnt_mp; in mnt_change_mountpoint()
1061 list_del_init(&mnt->mnt_child); in mnt_change_mountpoint()
1062 hlist_del_init(&mnt->mnt_mp_list); in mnt_change_mountpoint()
1063 hlist_del_init_rcu(&mnt->mnt_hash); in mnt_change_mountpoint()
1065 attach_mnt(mnt, parent, mp); in mnt_change_mountpoint()
1075 static void mnt_add_to_ns(struct mnt_namespace *ns, struct mount *mnt) in mnt_add_to_ns() argument
1081 WARN_ON(mnt_ns_attached(mnt)); in mnt_add_to_ns()
1082 mnt->mnt_ns = ns; in mnt_add_to_ns()
1085 if (mnt->mnt_id_unique < node_to_mount(parent)->mnt_id_unique) { in mnt_add_to_ns()
1095 ns->mnt_last_node = &mnt->mnt_node; in mnt_add_to_ns()
1097 ns->mnt_first_node = &mnt->mnt_node; in mnt_add_to_ns()
1098 rb_link_node(&mnt->mnt_node, parent, link); in mnt_add_to_ns()
1099 rb_insert_color(&mnt->mnt_node, &ns->mounts); in mnt_add_to_ns()
1101 mnt_notify_add(mnt); in mnt_add_to_ns()
1133 static void commit_tree(struct mount *mnt) in commit_tree() argument
1135 struct mnt_namespace *n = mnt->mnt_parent->mnt_ns; in commit_tree()
1137 if (!mnt_ns_attached(mnt)) { in commit_tree()
1138 for (struct mount *m = mnt; m; m = next_mnt(m, mnt)) in commit_tree()
1144 make_visible(mnt); in commit_tree()
1153 m->mnt.mnt_sb = s; in setup_mnt()
1154 m->mnt.mnt_root = dget(root); in setup_mnt()
1155 m->mnt_mountpoint = m->mnt.mnt_root; in setup_mnt()
1173 struct mount *mnt; in vfs_create_mount() local
1178 mnt = alloc_vfsmnt(fc->source); in vfs_create_mount()
1179 if (!mnt) in vfs_create_mount()
1183 mnt->mnt.mnt_flags = MNT_INTERNAL; in vfs_create_mount()
1185 setup_mnt(mnt, fc->root); in vfs_create_mount()
1187 return &mnt->mnt; in vfs_create_mount()
1204 struct vfsmount *mnt = fc_mount(fc); in fc_mount_longterm() local
1205 if (!IS_ERR(mnt)) in fc_mount_longterm()
1206 real_mount(mnt)->mnt_ns = MNT_NS_INTERNAL; in fc_mount_longterm()
1207 return mnt; in fc_mount_longterm()
1216 struct vfsmount *mnt; in vfs_kern_mount() local
1231 mnt = fc_mount(fc); in vfs_kern_mount()
1233 mnt = ERR_PTR(ret); in vfs_kern_mount()
1236 return mnt; in vfs_kern_mount()
1243 struct mount *mnt; in clone_mnt() local
1246 mnt = alloc_vfsmnt(old->mnt_devname); in clone_mnt()
1247 if (!mnt) in clone_mnt()
1250 mnt->mnt.mnt_flags = READ_ONCE(old->mnt.mnt_flags) & in clone_mnt()
1254 mnt->mnt_group_id = 0; /* not a peer of original */ in clone_mnt()
1256 mnt->mnt_group_id = old->mnt_group_id; in clone_mnt()
1258 if ((flag & CL_MAKE_SHARED) && !mnt->mnt_group_id) { in clone_mnt()
1259 err = mnt_alloc_group_id(mnt); in clone_mnt()
1264 if (mnt->mnt_group_id) in clone_mnt()
1265 set_mnt_shared(mnt); in clone_mnt()
1267 mnt->mnt.mnt_idmap = mnt_idmap_get(mnt_idmap(&old->mnt)); in clone_mnt()
1269 setup_mnt(mnt, root); in clone_mnt()
1272 return mnt; in clone_mnt()
1274 if (peers(mnt, old)) in clone_mnt()
1275 list_add(&mnt->mnt_share, &old->mnt_share); in clone_mnt()
1278 hlist_add_head(&mnt->mnt_slave, &old->mnt_slave_list); in clone_mnt()
1279 mnt->mnt_master = old; in clone_mnt()
1281 hlist_add_behind(&mnt->mnt_slave, &old->mnt_slave); in clone_mnt()
1282 mnt->mnt_master = old->mnt_master; in clone_mnt()
1284 return mnt; in clone_mnt()
1287 mnt_free_id(mnt); in clone_mnt()
1288 free_vfsmnt(mnt); in clone_mnt()
1292 static void cleanup_mnt(struct mount *mnt) in cleanup_mnt() argument
1303 WARN_ON(mnt_get_writers(mnt)); in cleanup_mnt()
1304 if (unlikely(mnt->mnt_pins.first)) in cleanup_mnt()
1305 mnt_pin_kill(mnt); in cleanup_mnt()
1306 hlist_for_each_entry_safe(m, p, &mnt->mnt_stuck_children, mnt_umount) { in cleanup_mnt()
1308 mntput(&m->mnt); in cleanup_mnt()
1310 fsnotify_vfsmount_delete(&mnt->mnt); in cleanup_mnt()
1311 dput(mnt->mnt.mnt_root); in cleanup_mnt()
1312 deactivate_super(mnt->mnt.mnt_sb); in cleanup_mnt()
1313 mnt_free_id(mnt); in cleanup_mnt()
1314 call_rcu(&mnt->mnt_rcu, delayed_free_vfsmnt); in cleanup_mnt()
1333 static void noinline mntput_no_expire_slowpath(struct mount *mnt) in mntput_no_expire_slowpath() argument
1338 VFS_BUG_ON(mnt->mnt_ns); in mntput_no_expire_slowpath()
1345 mnt_add_count(mnt, -1); in mntput_no_expire_slowpath()
1346 count = mnt_get_count(mnt); in mntput_no_expire_slowpath()
1353 if (unlikely(mnt->mnt.mnt_flags & MNT_DOOMED)) { in mntput_no_expire_slowpath()
1358 mnt->mnt.mnt_flags |= MNT_DOOMED; in mntput_no_expire_slowpath()
1361 mnt_del_instance(mnt); in mntput_no_expire_slowpath()
1362 if (unlikely(!list_empty(&mnt->mnt_expire))) in mntput_no_expire_slowpath()
1363 list_del(&mnt->mnt_expire); in mntput_no_expire_slowpath()
1365 if (unlikely(!list_empty(&mnt->mnt_mounts))) { in mntput_no_expire_slowpath()
1367 list_for_each_entry_safe(p, tmp, &mnt->mnt_mounts, mnt_child) { in mntput_no_expire_slowpath()
1369 hlist_add_head(&p->mnt_umount, &mnt->mnt_stuck_children); in mntput_no_expire_slowpath()
1375 if (likely(!(mnt->mnt.mnt_flags & MNT_INTERNAL))) { in mntput_no_expire_slowpath()
1378 init_task_work(&mnt->mnt_rcu, __cleanup_mnt); in mntput_no_expire_slowpath()
1379 if (!task_work_add(task, &mnt->mnt_rcu, TWA_RESUME)) in mntput_no_expire_slowpath()
1382 if (llist_add(&mnt->mnt_llist, &delayed_mntput_list)) in mntput_no_expire_slowpath()
1386 cleanup_mnt(mnt); in mntput_no_expire_slowpath()
1389 static void mntput_no_expire(struct mount *mnt) in mntput_no_expire() argument
1392 if (likely(READ_ONCE(mnt->mnt_ns))) { in mntput_no_expire()
1402 mnt_add_count(mnt, -1); in mntput_no_expire()
1406 mntput_no_expire_slowpath(mnt); in mntput_no_expire()
1409 void mntput(struct vfsmount *mnt) in mntput() argument
1411 if (mnt) { in mntput()
1412 struct mount *m = real_mount(mnt); in mntput()
1421 struct vfsmount *mntget(struct vfsmount *mnt) in mntget() argument
1423 if (mnt) in mntget()
1424 mnt_add_count(real_mount(mnt), 1); in mntget()
1425 return mnt; in mntget()
1434 void mnt_make_shortterm(struct vfsmount *mnt) in mnt_make_shortterm() argument
1436 if (mnt) in mnt_make_shortterm()
1437 real_mount(mnt)->mnt_ns = NULL; in mnt_make_shortterm()
1473 p = clone_mnt(real_mount(path->mnt), path->dentry, CL_PRIVATE); in mnt_clone_internal()
1476 p->mnt.mnt_flags |= MNT_INTERNAL; in mnt_clone_internal()
1477 return &p->mnt; in mnt_clone_internal()
1534 struct mount *mnt; in m_start() local
1538 mnt = mnt_find_id_at(p->ns, *pos); in m_start()
1539 if (mnt) in m_start()
1540 *pos = mnt->mnt_id_unique; in m_start()
1541 return mnt; in m_start()
1546 struct mount *mnt = v; in m_next() local
1547 struct rb_node *node = rb_next(&mnt->mnt_node); in m_next()
1559 *pos = mnt->mnt_id_unique + 1; in m_next()
1572 return p->show(m, &r->mnt); in m_show()
1594 struct mount *mnt = real_mount(m); in may_umount_tree() local
1599 for (struct mount *p = mnt; p; p = next_mnt(p, mnt)) { in may_umount_tree()
1600 if (mnt_get_count(p) > (p == mnt ? 2 : 1)) { in may_umount_tree()
1625 int may_umount(struct vfsmount *mnt) in may_umount() argument
1630 if (propagate_mount_busy(real_mount(mnt), 2)) in may_umount()
1643 fsnotify_mnt_attach(p->mnt_ns, &p->mnt); in mnt_notify()
1645 fsnotify_mnt_detach(p->prev_ns, &p->mnt); in mnt_notify()
1647 fsnotify_mnt_move(p->mnt_ns, &p->mnt); in mnt_notify()
1649 fsnotify_mnt_detach(p->prev_ns, &p->mnt); in mnt_notify()
1650 fsnotify_mnt_attach(p->mnt_ns, &p->mnt); in mnt_notify()
1723 mntput(&m->mnt); in namespace_unlock()
1738 static bool disconnect_mount(struct mount *mnt, enum umount_tree_flags how) in disconnect_mount() argument
1745 if (!mnt_has_parent(mnt)) in disconnect_mount()
1752 if (!(mnt->mnt_parent->mnt.mnt_flags & MNT_UMOUNT)) in disconnect_mount()
1760 if (IS_MNT_LOCKED(mnt)) in disconnect_mount()
1771 static void umount_tree(struct mount *mnt, enum umount_tree_flags how) in umount_tree() argument
1777 propagate_mount_unlock(mnt); in umount_tree()
1780 for (p = mnt; p; p = next_mnt(p, mnt)) { in umount_tree()
1781 p->mnt.mnt_flags |= MNT_UMOUNT; in umount_tree()
1811 p->mnt.mnt_flags |= MNT_SYNC_UMOUNT; in umount_tree()
1840 static void shrink_submounts(struct mount *mnt);
1865 static int do_umount(struct mount *mnt, int flags) in do_umount() argument
1867 struct super_block *sb = mnt->mnt.mnt_sb; in do_umount()
1870 retval = security_sb_umount(&mnt->mnt, flags); in do_umount()
1881 if (&mnt->mnt == current->fs->root.mnt || in do_umount()
1890 if (!list_empty(&mnt->mnt_mounts) || mnt_get_count(mnt) != 2) { in do_umount()
1896 if (!xchg(&mnt->mnt_expiry_mark, 1)) in do_umount()
1923 if (&mnt->mnt == current->fs->root.mnt && !(flags & MNT_DETACH)) { in do_umount()
1938 if (!check_mnt(mnt)) in do_umount()
1941 if (mnt->mnt.mnt_flags & MNT_LOCKED) in do_umount()
1944 if (!mnt_has_parent(mnt)) /* not the absolute root */ in do_umount()
1949 umount_tree(mnt, UMOUNT_PROPAGATE); in do_umount()
1953 shrink_submounts(mnt); in do_umount()
1955 if (!propagate_mount_busy(mnt, 2)) { in do_umount()
1956 umount_tree(mnt, UMOUNT_PROPAGATE|UMOUNT_SYNC); in do_umount()
1979 struct mount *mnt; in __detach_mounts() local
1989 mnt = hlist_entry(mp.node.next, struct mount, mnt_mp_list); in __detach_mounts()
1990 if (mnt->mnt.mnt_flags & MNT_UMOUNT) { in __detach_mounts()
1991 umount_mnt(mnt); in __detach_mounts()
1992 hlist_add_head(&mnt->mnt_umount, &unmounted); in __detach_mounts()
1994 else umount_tree(mnt, UMOUNT_CONNECTED); in __detach_mounts()
2018 struct mount *mnt = real_mount(path->mnt); in can_umount() local
2025 if (!check_mnt(mnt)) in can_umount()
2027 if (mnt->mnt.mnt_flags & MNT_LOCKED) /* Check optimistically */ in can_umount()
2037 struct mount *mnt = real_mount(path->mnt); in path_umount() local
2042 ret = do_umount(mnt, flags); in path_umount()
2046 mntput_no_expire(mnt); in path_umount()
2098 struct ns_common *from_mnt_ns(struct mnt_namespace *mnt) in from_mnt_ns() argument
2100 return &mnt->ns; in from_mnt_ns()
2183 if (src_mnt->mnt.mnt_flags & MNT_LOCKED) { in copy_tree()
2193 is_mnt_ns_file(src_mnt->mnt.mnt_root)) { in copy_tree()
2204 dst_mnt = clone_mnt(src_mnt, src_mnt->mnt.mnt_root, flag); in copy_tree()
2208 if (src_mnt->mnt.mnt_flags & MNT_LOCKED) in copy_tree()
2209 dst_mnt->mnt.mnt_flags |= MNT_LOCKED; in copy_tree()
2251 struct mount *root = real_mount(path->mnt); in collect_paths()
2269 res[n].mnt = &m->mnt; in collect_paths()
2270 res[n].dentry = m->mnt.mnt_root; in collect_paths()
2277 for (struct path *p = res; p->mnt; p++) in collect_paths()
2284 for (const struct path *p = paths; p->mnt; p++) in drop_collected_paths()
2292 void dissolve_on_fput(struct vfsmount *mnt) in dissolve_on_fput() argument
2294 struct mount *m = real_mount(mnt); in dissolve_on_fput()
2323 static bool __has_locked_children(struct mount *mnt, struct dentry *dentry) in __has_locked_children() argument
2327 list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) { in __has_locked_children()
2331 if (child->mnt.mnt_flags & MNT_LOCKED) in __has_locked_children()
2337 bool has_locked_children(struct mount *mnt, struct dentry *dentry) in has_locked_children() argument
2340 return __has_locked_children(mnt, dentry); in has_locked_children()
2354 if (mnt_ns_loop(p->mnt.mnt_root)) in check_for_nsfs_mounts()
2373 struct mount *old_mnt = real_mount(path->mnt); in clone_private_mount()
2408 return &new_mnt->mnt; in clone_private_mount()
2412 static void lock_mnt_tree(struct mount *mnt) in lock_mnt_tree() argument
2416 for (p = mnt; p; p = next_mnt(p, mnt)) { in lock_mnt_tree()
2417 int flags = p->mnt.mnt_flags; in lock_mnt_tree()
2433 if (list_empty(&p->mnt_expire) && p != mnt) in lock_mnt_tree()
2435 p->mnt.mnt_flags = flags; in lock_mnt_tree()
2439 static void cleanup_group_ids(struct mount *mnt, struct mount *end) in cleanup_group_ids() argument
2443 for (p = mnt; p != end; p = next_mnt(p, mnt)) { in cleanup_group_ids()
2449 static int invent_group_ids(struct mount *mnt, bool recurse) in invent_group_ids() argument
2453 for (p = mnt; p; p = recurse ? next_mnt(p, mnt) : NULL) { in invent_group_ids()
2457 cleanup_group_ids(mnt, p); in invent_group_ids()
2466 int count_mounts(struct mnt_namespace *ns, struct mount *mnt) in count_mounts() argument
2479 for (p = mnt; p; p = next_mnt(p, mnt)) in count_mounts()
2580 if (!shorter && is_mnt_ns_file(top->mnt.mnt_root)) in attach_recursive_mnt()
2583 err = get_mountpoint(top->mnt.mnt_root, &root); in attach_recursive_mnt()
2640 q = __lookup_mnt(&child->mnt_parent->mnt, in attach_recursive_mnt()
2682 m = topmost_overmount(real_mount(path->mnt)); in where_to_mount()
2686 m = __lookup_mnt(path->mnt, path->dentry); in where_to_mount()
2689 *dentry = m->mnt.mnt_root; in where_to_mount()
2693 return real_mount(path->mnt); in where_to_mount()
2744 if (&m->mnt != path->mnt) { in do_lock_mount()
2745 mntget(&m->mnt); in do_lock_mount()
2759 else if (unlikely(cant_mount(dentry) || !is_mounted(path->mnt))) in do_lock_mount()
2761 else if (beneath && &m->mnt == path->mnt && !m->overmount) in do_lock_mount()
2781 if (&m->mnt != path->mnt) { in do_lock_mount()
2783 mntput(&m->mnt); in do_lock_mount()
2818 static int graft_tree(struct mount *mnt, const struct pinned_mountpoint *mp) in graft_tree() argument
2820 if (mnt->mnt.mnt_sb->s_flags & SB_NOUSER) in graft_tree()
2824 d_is_dir(mnt->mnt.mnt_root)) in graft_tree()
2827 return attach_recursive_mnt(mnt, mp); in graft_tree()
2866 struct mount *mnt = real_mount(path->mnt); in do_change_type() local
2880 err = may_change_propagation(mnt); in do_change_type()
2885 err = invent_group_ids(mnt, recurse); in do_change_type()
2890 for (m = mnt; m; m = (recurse ? next_mnt(m, mnt) : NULL)) in do_change_type()
2941 struct mount *mnt = real_mount(path->mnt); in may_copy_tree() local
2944 if (check_mnt(mnt)) in may_copy_tree()
2954 if (!is_mounted(path->mnt)) in may_copy_tree()
2957 return check_anonymous_mnt(mnt); in may_copy_tree()
2963 struct mount *old = real_mount(old_path->mnt); in __do_loopback()
3000 struct mount *mnt = NULL; in do_loopback() local
3020 mnt = __do_loopback(&old_path, flags, 0); in do_loopback()
3021 if (IS_ERR(mnt)) in do_loopback()
3022 return PTR_ERR(mnt); in do_loopback()
3024 err = graft_tree(mnt, &mp); in do_loopback()
3027 umount_tree(mnt, UMOUNT_SYNC); in do_loopback()
3037 struct mount *mnt, *p; in get_detached_copy() local
3050 if (is_mounted(path->mnt)) { in get_detached_copy()
3051 src_mnt_ns = real_mount(path->mnt)->mnt_ns; in get_detached_copy()
3058 mnt = __do_loopback(path, flags, 0); in get_detached_copy()
3059 if (IS_ERR(mnt)) { in get_detached_copy()
3061 return ERR_CAST(mnt); in get_detached_copy()
3064 for (p = mnt; p; p = next_mnt(p, mnt)) { in get_detached_copy()
3068 ns->root = mnt; in get_detached_copy()
3080 mntput(path->mnt); in open_detached_copy()
3081 path->mnt = mntget(&ns->root->mnt); in open_detached_copy()
3084 dissolve_on_fput(path->mnt); in open_detached_copy()
3097 struct mount *mnt; in create_new_namespace() local
3109 to_path.mnt = &old_ns_root->mnt; in create_new_namespace()
3110 to_path.dentry = old_ns_root->mnt.mnt_root; in create_new_namespace()
3112 VFS_WARN_ON_ONCE(old_ns_root->mnt.mnt_sb->s_type != &nullfs_fs_type); in create_new_namespace()
3126 mnt = old_ns_root; in create_new_namespace()
3127 while (mnt->overmount) { in create_new_namespace()
3128 mnt = mnt->overmount; in create_new_namespace()
3129 if (mnt->mnt.mnt_flags & MNT_LOCKED) in create_new_namespace()
3138 mnt = __do_loopback(path, flags, copy_flags); in create_new_namespace()
3140 if (IS_ERR(mnt)) { in create_new_namespace()
3143 return ERR_CAST(mnt); in create_new_namespace()
3147 mnt->mnt.mnt_flags |= MNT_LOCKED; in create_new_namespace()
3152 attach_mnt(mnt, new_ns_root, mp.mp); in create_new_namespace()
3157 for (mnt = new_ns_root; mnt; mnt = next_mnt(mnt, new_ns_root)) { in create_new_namespace()
3158 mnt_add_to_ns(new_ns, mnt); in create_new_namespace()
3239 static bool can_change_locked_flags(struct mount *mnt, unsigned int mnt_flags) in can_change_locked_flags() argument
3241 unsigned int fl = mnt->mnt.mnt_flags; in can_change_locked_flags()
3266 static int change_mount_ro_state(struct mount *mnt, unsigned int mnt_flags) in change_mount_ro_state() argument
3270 if (readonly_request == __mnt_is_readonly(&mnt->mnt)) in change_mount_ro_state()
3274 return mnt_make_readonly(mnt); in change_mount_ro_state()
3276 mnt->mnt.mnt_flags &= ~MNT_READONLY; in change_mount_ro_state()
3280 static void set_mount_attributes(struct mount *mnt, unsigned int mnt_flags) in set_mount_attributes() argument
3282 mnt_flags |= mnt->mnt.mnt_flags & ~MNT_USER_SETTABLE_MASK; in set_mount_attributes()
3283 mnt->mnt.mnt_flags = mnt_flags; in set_mount_attributes()
3284 touch_mnt_namespace(mnt->mnt_ns); in set_mount_attributes()
3288 struct vfsmount *mnt) in mnt_warn_timestamp_expiry() argument
3290 struct super_block *sb = mnt->mnt_sb; in mnt_warn_timestamp_expiry()
3292 if (!__mnt_is_readonly(mnt) && in mnt_warn_timestamp_expiry()
3307 is_mounted(mnt) ? "remounted" : "mounted", in mnt_warn_timestamp_expiry()
3324 struct super_block *sb = path->mnt->mnt_sb; in do_reconfigure_mnt()
3325 struct mount *mnt = real_mount(path->mnt); in do_reconfigure_mnt() local
3328 if (!check_mnt(mnt)) in do_reconfigure_mnt()
3334 if (!can_change_locked_flags(mnt, mnt_flags)) in do_reconfigure_mnt()
3343 ret = change_mount_ro_state(mnt, mnt_flags); in do_reconfigure_mnt()
3345 set_mount_attributes(mnt, mnt_flags); in do_reconfigure_mnt()
3349 mnt_warn_timestamp_expiry(path, &mnt->mnt); in do_reconfigure_mnt()
3363 struct super_block *sb = path->mnt->mnt_sb; in do_remount()
3364 struct mount *mnt = real_mount(path->mnt); in do_remount() local
3367 if (!check_mnt(mnt)) in do_remount()
3373 if (!can_change_locked_flags(mnt, mnt_flags)) in do_remount()
3394 set_mount_attributes(mnt, mnt_flags); in do_remount()
3401 mnt_warn_timestamp_expiry(path, &mnt->mnt); in do_remount()
3407 static inline int tree_contains_unbindable(struct mount *mnt) in tree_contains_unbindable() argument
3410 for (p = mnt; p; p = next_mnt(p, mnt)) { in tree_contains_unbindable()
3419 struct mount *from = real_mount(from_path->mnt); in do_set_group()
3420 struct mount *to = real_mount(to_path->mnt); in do_set_group()
3439 if (from->mnt.mnt_sb != to->mnt.mnt_sb) in do_set_group()
3443 if (!is_subdir(to->mnt.mnt_root, from->mnt.mnt_root)) in do_set_group()
3447 if (__has_locked_children(from, to->mnt.mnt_root)) in do_set_group()
3489 no_child = !__lookup_mnt(path->mnt, path->dentry); in path_overmounted()
3493 no_child = !__lookup_mnt(path->mnt, path->dentry); in path_overmounted()
3546 if (&mnt_to->mnt == current->fs->root.mnt) in can_move_mount_beneath()
3614 static inline bool may_use_mount(struct mount *mnt) in may_use_mount() argument
3616 if (check_mnt(mnt)) in may_use_mount()
3624 if (!is_mounted(&mnt->mnt)) in may_use_mount()
3627 return check_anonymous_mnt(mnt); in may_use_mount()
3634 struct mount *old = real_mount(old_path->mnt); in do_move_mount()
3681 struct mount *over = real_mount(new_path->mnt); in do_move_mount()
3742 if (parent->mnt.mnt_sb == newmnt->mnt.mnt_sb && in do_add_mount()
3743 parent->mnt.mnt_root == mp->mp->m_dentry) in do_add_mount()
3746 if (d_is_symlink(newmnt->mnt.mnt_root)) in do_add_mount()
3749 newmnt->mnt.mnt_flags = mnt_flags; in do_add_mount()
3763 struct vfsmount *mnt __free(mntput) = fc_mount(fc); in do_new_mount_fc()
3766 if (IS_ERR(mnt)) in do_new_mount_fc()
3767 return PTR_ERR(mnt); in do_new_mount_fc()
3779 mnt_warn_timestamp_expiry(mountpoint, mnt); in do_new_mount_fc()
3782 error = do_add_mount(real_mount(mnt), &mp, mnt_flags); in do_new_mount_fc()
3784 retain_and_null_ptr(mnt); // consumed on success in do_new_mount_fc()
3871 mp->parent = clone_mnt(real_mount(path->mnt), dentry, copy_flags); in lock_mount_exact()
3873 mp->parent = real_mount(path->mnt); in lock_mount_exact()
3881 struct mount *mnt; in finish_automount() local
3889 mnt = real_mount(m); in finish_automount()
3903 err = do_add_mount(mnt, &mp, path->mnt->mnt_flags | MNT_SHRINKABLE); in finish_automount()
3914 void mnt_set_expiry(struct vfsmount *mnt, struct list_head *expiry_list) in mnt_set_expiry() argument
3917 list_add_tail(&real_mount(mnt)->mnt_expire, expiry_list); in mnt_set_expiry()
3928 struct mount *mnt, *next; in mark_mounts_for_expiry() local
3944 list_for_each_entry_safe(mnt, next, mounts, mnt_expire) { in mark_mounts_for_expiry()
3945 if (!is_mounted(&mnt->mnt)) in mark_mounts_for_expiry()
3947 if (!xchg(&mnt->mnt_expiry_mark, 1) || in mark_mounts_for_expiry()
3948 propagate_mount_busy(mnt, 1)) in mark_mounts_for_expiry()
3950 list_move(&mnt->mnt_expire, &graveyard); in mark_mounts_for_expiry()
3953 mnt = list_first_entry(&graveyard, struct mount, mnt_expire); in mark_mounts_for_expiry()
3954 touch_mnt_namespace(mnt->mnt_ns); in mark_mounts_for_expiry()
3955 umount_tree(mnt, UMOUNT_PROPAGATE|UMOUNT_SYNC); in mark_mounts_for_expiry()
3978 struct mount *mnt = list_entry(tmp, struct mount, mnt_child); in select_submounts() local
3981 if (!(mnt->mnt.mnt_flags & MNT_SHRINKABLE)) in select_submounts()
3986 if (!list_empty(&mnt->mnt_mounts)) { in select_submounts()
3987 this_parent = mnt; in select_submounts()
3991 if (!propagate_mount_busy(mnt, 1)) { in select_submounts()
3992 list_move_tail(&mnt->mnt_expire, graveyard); in select_submounts()
4013 static void shrink_submounts(struct mount *mnt) in shrink_submounts() argument
4019 while (select_submounts(mnt, &graveyard)) { in shrink_submounts()
4136 mnt_flags |= path->mnt->mnt_flags & MNT_ATIME_MASK; in path_mount()
4259 new = copy_tree(old, old->mnt.mnt_root, copy_flags); in copy_mnt_ns()
4281 if (&p->mnt == new_fs->root.mnt) { in copy_mnt_ns()
4282 new_fs->root.mnt = mntget(&q->mnt); in copy_mnt_ns()
4283 rootmnt = &p->mnt; in copy_mnt_ns()
4285 if (&p->mnt == new_fs->pwd.mnt) { in copy_mnt_ns()
4286 new_fs->pwd.mnt = mntget(&q->mnt); in copy_mnt_ns()
4287 pwdmnt = &p->mnt; in copy_mnt_ns()
4295 while (p->mnt.mnt_root != q->mnt.mnt_root) in copy_mnt_ns()
4304 struct mount *mnt = real_mount(m); in mount_subtree() local
4315 ns->root = mnt; in mount_subtree()
4317 mnt_add_to_ns(ns, mnt); in mount_subtree()
4328 s = path.mnt->mnt_sb; in mount_subtree()
4330 mntput(path.mnt); in mount_subtree()
4413 struct mount *mnt; in SYSCALL_DEFINE3() local
4479 new_path.mnt = new_mnt; in SYSCALL_DEFINE3()
4491 mnt = real_mount(new_path.mnt); in SYSCALL_DEFINE3()
4492 ns->root = mnt; in SYSCALL_DEFINE3()
4494 mnt_add_to_ns(ns, mnt); in SYSCALL_DEFINE3()
4495 mntget(new_path.mnt); in SYSCALL_DEFINE3()
4500 dissolve_on_fput(new_path.mnt); in SYSCALL_DEFINE3()
4613 bool is_path_reachable(struct mount *mnt, struct dentry *dentry, in is_path_reachable() argument
4616 while (&mnt->mnt != root->mnt && mnt_has_parent(mnt)) { in is_path_reachable()
4617 dentry = mnt->mnt_mountpoint; in is_path_reachable()
4618 mnt = mnt->mnt_parent; in is_path_reachable()
4620 return &mnt->mnt == root->mnt && is_subdir(dentry, root->dentry); in is_path_reachable()
4626 return is_path_reachable(real_mount(path1->mnt), path1->dentry, path2); in path_is_under()
4650 new_mnt = real_mount(new->mnt); in path_pivot_root()
4651 root_mnt = real_mount(root.mnt); in path_pivot_root()
4660 if (new_mnt->mnt.mnt_flags & MNT_LOCKED) in path_pivot_root()
4682 if (root_mnt->mnt.mnt_flags & MNT_LOCKED) { in path_pivot_root()
4683 new_mnt->mnt.mnt_flags |= MNT_LOCKED; in path_pivot_root()
4684 root_mnt->mnt.mnt_flags &= ~MNT_LOCKED; in path_pivot_root()
4746 static unsigned int recalc_flags(struct mount_kattr *kattr, struct mount *mnt) in recalc_flags() argument
4748 unsigned int flags = mnt->mnt.mnt_flags; in recalc_flags()
4758 static int can_idmap_mount(const struct mount_kattr *kattr, struct mount *mnt) in can_idmap_mount() argument
4760 struct vfsmount *m = &mnt->mnt; in can_idmap_mount()
4793 if (!is_anon_ns(mnt->mnt_ns)) in can_idmap_mount()
4809 const struct mount *mnt) in mnt_allow_writers() argument
4812 (mnt->mnt.mnt_flags & MNT_READONLY)) && in mnt_allow_writers()
4816 static int mount_setattr_prepare(struct mount_kattr *kattr, struct mount *mnt) in mount_setattr_prepare() argument
4821 for (m = mnt; m; m = next_mnt(m, mnt)) { in mount_setattr_prepare()
4834 m = next_mnt(m, mnt); in mount_setattr_prepare()
4845 for (struct mount *p = mnt; p != m; p = next_mnt(p, mnt)) in mount_setattr_prepare()
4851 static void do_idmap_mount(const struct mount_kattr *kattr, struct mount *mnt) in do_idmap_mount() argument
4858 old_idmap = mnt_idmap(&mnt->mnt); in do_idmap_mount()
4861 smp_store_release(&mnt->mnt.mnt_idmap, mnt_idmap_get(kattr->mnt_idmap)); in do_idmap_mount()
4865 static void mount_setattr_commit(struct mount_kattr *kattr, struct mount *mnt) in mount_setattr_commit() argument
4869 for (m = mnt; m; m = next_mnt(m, mnt)) { in mount_setattr_commit()
4874 WRITE_ONCE(m->mnt.mnt_flags, flags); in mount_setattr_commit()
4884 touch_mnt_namespace(mnt->mnt_ns); in mount_setattr_commit()
4889 struct mount *mnt = real_mount(path->mnt); in do_mount_setattr() local
4911 err = invent_group_ids(mnt, kattr->kflags & MOUNT_KATTR_RECURSE); in do_mount_setattr()
4922 if (!anon_ns_root(mnt) && !check_mnt(mnt)) in do_mount_setattr()
4930 err = mount_setattr_prepare(kattr, mnt); in do_mount_setattr()
4932 mount_setattr_commit(kattr, mnt); in do_mount_setattr()
4939 cleanup_group_ids(mnt, NULL); in do_mount_setattr()
5189 struct mount *mnt = mnt_find_id_at(ns, id); in lookup_mnt_in_ns() local
5191 if (!mnt || mnt->mnt_id_unique != id) in lookup_mnt_in_ns()
5194 return &mnt->mnt; in lookup_mnt_in_ns()
5200 struct vfsmount *mnt; member
5210 static u64 mnt_to_attr_flags(struct vfsmount *mnt) in mnt_to_attr_flags() argument
5212 unsigned int mnt_flags = READ_ONCE(mnt->mnt_flags); in mnt_to_attr_flags()
5235 if (is_idmapped_mnt(mnt)) in mnt_to_attr_flags()
5257 u64 vfsmount_to_propagation_flags(struct vfsmount *mnt) in vfsmount_to_propagation_flags() argument
5259 return mnt_to_propagation_flags(real_mount(mnt)); in vfsmount_to_propagation_flags()
5265 struct super_block *sb = s->mnt->mnt_sb; in statmount_sb_basic()
5276 struct mount *m = real_mount(s->mnt); in statmount_mnt_basic()
5283 s->sm.mnt_attr = mnt_to_attr_flags(&m->mnt); in statmount_mnt_basic()
5291 struct mount *m = real_mount(s->mnt); in statmount_propagate_from()
5303 ret = show_path(seq, s->mnt->mnt_root); in statmount_mnt_root()
5322 struct vfsmount *mnt = s->mnt; in statmount_mnt_point() local
5323 struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; in statmount_mnt_point()
5332 struct super_block *sb = s->mnt->mnt_sb; in statmount_fs_type()
5340 struct super_block *sb = s->mnt->mnt_sb; in statmount_fs_subtype()
5348 struct super_block *sb = s->mnt->mnt_sb; in statmount_sb_source()
5349 struct mount *r = real_mount(s->mnt); in statmount_sb_source()
5355 ret = sb->s_op->show_devname(seq, s->mnt->mnt_root); in statmount_sb_source()
5380 struct vfsmount *mnt = s->mnt; in statmount_mnt_opts() local
5381 struct super_block *sb = mnt->mnt_sb; in statmount_mnt_opts()
5390 err = sb->s_op->show_options(seq, mnt->mnt_root); in statmount_mnt_opts()
5440 struct vfsmount *mnt = s->mnt; in statmount_opt_array() local
5441 struct super_block *sb = mnt->mnt_sb; in statmount_opt_array()
5448 err = sb->s_op->show_options(seq, mnt->mnt_root); in statmount_opt_array()
5462 struct vfsmount *mnt = s->mnt; in statmount_opt_sec_array() local
5463 struct super_block *sb = mnt->mnt_sb; in statmount_opt_sec_array()
5661 root->mnt = mntget(&child->mnt); in grab_requested_root()
5662 root->dentry = dget(root->mnt->mnt_root); in grab_requested_root()
5692 s->mnt = mnt_file->f_path.mnt; in do_statmount()
5693 ns = real_mount(s->mnt)->mnt_ns; in do_statmount()
5708 s->mnt = lookup_mnt_in_ns(mnt_id, ns); in do_statmount()
5709 if (!s->mnt) in do_statmount()
5724 m = real_mount(s->mnt); in do_statmount()
5725 if (!is_path_reachable(m, m->mnt.mnt_root, &s->root) && in do_statmount()
5731 err = security_sb_statfs(s->mnt->mnt_root); in do_statmount()
5750 s->idmap = mnt_idmap(s->mnt); in do_statmount()
6005 orig.mnt = lookup_mnt_in_ns(mnt_parent_id, ns); in do_listmount()
6006 if (!orig.mnt) in do_listmount()
6008 orig.dentry = orig.mnt->mnt_root; in do_listmount()
6015 if (!is_path_reachable(real_mount(orig.mnt), orig.dentry, &kls->root) && in do_listmount()
6038 if (!is_path_reachable(r, r->mnt.mnt_root, &orig)) in do_listmount()
6141 struct vfsmount *mnt, *nullfs_mnt; in init_mount_tree() local
6157 mnt = vfs_kern_mount(&rootfs_fs_type, 0, "rootfs", initramfs_options); in init_mount_tree()
6158 if (IS_ERR(mnt)) in init_mount_tree()
6162 VFS_WARN_ON_ONCE(real_mount(mnt)->mnt_id != 2); in init_mount_tree()
6169 root.mnt = nullfs_mnt; in init_mount_tree()
6176 attach_mnt(real_mount(mnt), mp.parent, mp.mp); in init_mount_tree()
6195 root.mnt = mnt; in init_mount_tree()
6196 root.dentry = mnt->mnt_root; in init_mount_tree()
6250 struct vfsmount *mnt; in kern_mount() local
6251 mnt = vfs_kern_mount(type, SB_KERNMOUNT, type->name, NULL); in kern_mount()
6252 if (!IS_ERR(mnt)) { in kern_mount()
6257 real_mount(mnt)->mnt_ns = MNT_NS_INTERNAL; in kern_mount()
6259 return mnt; in kern_mount()
6263 void kern_unmount(struct vfsmount *mnt) in kern_unmount() argument
6266 if (!IS_ERR(mnt)) { in kern_unmount()
6267 mnt_make_shortterm(mnt); in kern_unmount()
6269 mntput(mnt); in kern_unmount()
6274 void kern_unmount_array(struct vfsmount *mnt[], unsigned int num) in kern_unmount_array() argument
6279 mnt_make_shortterm(mnt[i]); in kern_unmount_array()
6282 mntput(mnt[i]); in kern_unmount_array()
6286 bool our_mnt(struct vfsmount *mnt) in our_mnt() argument
6288 return check_mnt(real_mount(mnt)); in our_mnt()
6305 return fs_root.mnt != &root->mnt || !path_mounted(&fs_root); in current_chrooted()
6313 struct mount *mnt, *n; in mnt_already_visible() local
6316 rbtree_postorder_for_each_entry_safe(mnt, n, &ns->mounts, mnt_node) { in mnt_already_visible()
6320 if (mnt->mnt.mnt_sb->s_type != sb->s_type) in mnt_already_visible()
6326 if (mnt->mnt.mnt_root != mnt->mnt.mnt_sb->s_root) in mnt_already_visible()
6330 mnt_flags = mnt->mnt.mnt_flags; in mnt_already_visible()
6333 if (sb_rdonly(mnt->mnt.mnt_sb)) in mnt_already_visible()
6350 list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) { in mnt_already_visible()
6353 if (!(child->mnt.mnt_flags & MNT_LOCKED)) in mnt_already_visible()
6391 bool mnt_may_suid(struct vfsmount *mnt) in mnt_may_suid() argument
6400 return !(mnt->mnt_flags & MNT_NOSUID) && check_mnt(real_mount(mnt)) && in mnt_may_suid()
6401 current_in_userns(mnt->mnt_sb->s_user_ns); in mnt_may_suid()
6450 err = vfs_path_lookup(mnt_ns->root->mnt.mnt_root, &mnt_ns->root->mnt, in mntns_install()