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