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