Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0 */ 2 : #include <linux/mount.h> 3 : #include <linux/seq_file.h> 4 : #include <linux/poll.h> 5 : #include <linux/ns_common.h> 6 : #include <linux/fs_pin.h> 7 : 8 : struct mnt_namespace { 9 : struct ns_common ns; 10 : struct mount * root; 11 : /* 12 : * Traversal and modification of .list is protected by either 13 : * - taking namespace_sem for write, OR 14 : * - taking namespace_sem for read AND taking .ns_lock. 15 : */ 16 : struct list_head list; 17 : spinlock_t ns_lock; 18 : struct user_namespace *user_ns; 19 : struct ucounts *ucounts; 20 : u64 seq; /* Sequence number to prevent loops */ 21 : wait_queue_head_t poll; 22 : u64 event; 23 : unsigned int mounts; /* # of mounts in the namespace */ 24 : unsigned int pending_mounts; 25 : } __randomize_layout; 26 : 27 : struct mnt_pcp { 28 : int mnt_count; 29 : int mnt_writers; 30 : }; 31 : 32 : struct mountpoint { 33 : struct hlist_node m_hash; 34 : struct dentry *m_dentry; 35 : struct hlist_head m_list; 36 : int m_count; 37 : }; 38 : 39 : struct mount { 40 : struct hlist_node mnt_hash; 41 : struct mount *mnt_parent; 42 : struct dentry *mnt_mountpoint; 43 : struct vfsmount mnt; 44 : union { 45 : struct rcu_head mnt_rcu; 46 : struct llist_node mnt_llist; 47 : }; 48 : #ifdef CONFIG_SMP 49 : struct mnt_pcp __percpu *mnt_pcp; 50 : #else 51 : int mnt_count; 52 : int mnt_writers; 53 : #endif 54 : struct list_head mnt_mounts; /* list of children, anchored here */ 55 : struct list_head mnt_child; /* and going through their mnt_child */ 56 : struct list_head mnt_instance; /* mount instance on sb->s_mounts */ 57 : const char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ 58 : struct list_head mnt_list; 59 : struct list_head mnt_expire; /* link in fs-specific expiry list */ 60 : struct list_head mnt_share; /* circular list of shared mounts */ 61 : struct list_head mnt_slave_list;/* list of slave mounts */ 62 : struct list_head mnt_slave; /* slave list entry */ 63 : struct mount *mnt_master; /* slave is on master->mnt_slave_list */ 64 : struct mnt_namespace *mnt_ns; /* containing namespace */ 65 : struct mountpoint *mnt_mp; /* where is it mounted */ 66 : union { 67 : struct hlist_node mnt_mp_list; /* list mounts with the same mountpoint */ 68 : struct hlist_node mnt_umount; 69 : }; 70 : struct list_head mnt_umounting; /* list entry for umount propagation */ 71 : #ifdef CONFIG_FSNOTIFY 72 : struct fsnotify_mark_connector __rcu *mnt_fsnotify_marks; 73 : __u32 mnt_fsnotify_mask; 74 : #endif 75 : int mnt_id; /* mount identifier */ 76 : int mnt_group_id; /* peer group identifier */ 77 : int mnt_expiry_mark; /* true if marked for expiry */ 78 : struct hlist_head mnt_pins; 79 : struct hlist_head mnt_stuck_children; 80 : } __randomize_layout; 81 : 82 : #define MNT_NS_INTERNAL ERR_PTR(-EINVAL) /* distinct from any mnt_namespace */ 83 : 84 544868 : static inline struct mount *real_mount(struct vfsmount *mnt) 85 : { 86 544860 : return container_of(mnt, struct mount, mnt); 87 : } 88 : 89 1826 : static inline int mnt_has_parent(struct mount *mnt) 90 : { 91 1826 : return mnt != mnt->mnt_parent; 92 : } 93 : 94 8 : static inline int is_mounted(struct vfsmount *mnt) 95 : { 96 : /* neither detached nor internal? */ 97 16 : return !IS_ERR_OR_NULL(real_mount(mnt)->mnt_ns); 98 : } 99 : 100 : extern struct mount *__lookup_mnt(struct vfsmount *, struct dentry *); 101 : 102 : extern int __legitimize_mnt(struct vfsmount *, unsigned); 103 : extern bool legitimize_mnt(struct vfsmount *, unsigned); 104 : 105 0 : static inline bool __path_is_mountpoint(const struct path *path) 106 : { 107 0 : struct mount *m = __lookup_mnt(path->mnt, path->dentry); 108 0 : return m && likely(!(m->mnt.mnt_flags & MNT_SYNC_UMOUNT)); 109 : } 110 : 111 : extern void __detach_mounts(struct dentry *dentry); 112 : 113 1293 : static inline void detach_mounts(struct dentry *dentry) 114 : { 115 1293 : if (!d_mountpoint(dentry)) 116 : return; 117 0 : __detach_mounts(dentry); 118 : } 119 : 120 154 : static inline void get_mnt_ns(struct mnt_namespace *ns) 121 : { 122 154 : refcount_inc(&ns->ns.count); 123 3 : } 124 : 125 : extern seqlock_t mount_lock; 126 : 127 : struct proc_mounts { 128 : struct mnt_namespace *ns; 129 : struct path root; 130 : int (*show)(struct seq_file *, struct vfsmount *); 131 : struct mount cursor; 132 : }; 133 : 134 : extern const struct seq_operations mounts_op; 135 : 136 : extern bool __is_local_mountpoint(struct dentry *dentry); 137 2504 : static inline bool is_local_mountpoint(struct dentry *dentry) 138 : { 139 2504 : if (!d_mountpoint(dentry)) 140 : return false; 141 : 142 185 : return __is_local_mountpoint(dentry); 143 : } 144 : 145 2485 : static inline bool is_anon_ns(struct mnt_namespace *ns) 146 : { 147 2485 : return ns->seq == 0; 148 : } 149 : 150 : extern void mnt_cursor_del(struct mnt_namespace *ns, struct mount *cursor);