| Al Viro | b2dba1a | 2011-11-23 19:26:23 -0500 | [diff] [blame] | 1 | #include <linux/mount.h> | 
| Al Viro | 0226f49 | 2011-12-06 12:21:54 -0500 | [diff] [blame] | 2 | #include <linux/seq_file.h> | 
 | 3 | #include <linux/poll.h> | 
 | 4 |  | 
 | 5 | struct mnt_namespace { | 
 | 6 | 	atomic_t		count; | 
| Eric W. Biederman | 98f842e | 2011-06-15 10:21:48 -0700 | [diff] [blame] | 7 | 	unsigned int		proc_inum; | 
| Al Viro | be08d6d | 2011-12-06 13:32:36 -0500 | [diff] [blame] | 8 | 	struct mount *	root; | 
| Al Viro | 0226f49 | 2011-12-06 12:21:54 -0500 | [diff] [blame] | 9 | 	struct list_head	list; | 
| Eric W. Biederman | 771b137 | 2012-07-26 21:08:32 -0700 | [diff] [blame] | 10 | 	struct user_namespace	*user_ns; | 
| Eric W. Biederman | 8823c07 | 2010-03-07 18:49:36 -0800 | [diff] [blame] | 11 | 	u64			seq;	/* Sequence number to prevent loops */ | 
| Al Viro | 0226f49 | 2011-12-06 12:21:54 -0500 | [diff] [blame] | 12 | 	wait_queue_head_t poll; | 
 | 13 | 	int event; | 
 | 14 | }; | 
| Al Viro | b2dba1a | 2011-11-23 19:26:23 -0500 | [diff] [blame] | 15 |  | 
| Al Viro | 68e8a9f | 2011-11-24 22:53:09 -0500 | [diff] [blame] | 16 | struct mnt_pcp { | 
 | 17 | 	int mnt_count; | 
 | 18 | 	int mnt_writers; | 
 | 19 | }; | 
 | 20 |  | 
| Al Viro | 7d6fec4 | 2011-11-23 12:14:10 -0500 | [diff] [blame] | 21 | struct mount { | 
| Al Viro | 1b8e556 | 2011-11-24 21:01:32 -0500 | [diff] [blame] | 22 | 	struct list_head mnt_hash; | 
| Al Viro | 0714a53 | 2011-11-24 22:19:58 -0500 | [diff] [blame] | 23 | 	struct mount *mnt_parent; | 
| Al Viro | a73324d | 2011-11-24 22:25:07 -0500 | [diff] [blame] | 24 | 	struct dentry *mnt_mountpoint; | 
| Al Viro | 7d6fec4 | 2011-11-23 12:14:10 -0500 | [diff] [blame] | 25 | 	struct vfsmount mnt; | 
| Al Viro | 68e8a9f | 2011-11-24 22:53:09 -0500 | [diff] [blame] | 26 | #ifdef CONFIG_SMP | 
 | 27 | 	struct mnt_pcp __percpu *mnt_pcp; | 
| Al Viro | 68e8a9f | 2011-11-24 22:53:09 -0500 | [diff] [blame] | 28 | #else | 
 | 29 | 	int mnt_count; | 
 | 30 | 	int mnt_writers; | 
 | 31 | #endif | 
| Al Viro | 6b41d53 | 2011-11-24 23:24:33 -0500 | [diff] [blame] | 32 | 	struct list_head mnt_mounts;	/* list of children, anchored here */ | 
 | 33 | 	struct list_head mnt_child;	/* and going through their mnt_child */ | 
| Miklos Szeredi | 39f7c4d | 2011-11-21 12:11:30 +0100 | [diff] [blame] | 34 | 	struct list_head mnt_instance;	/* mount instance on sb->s_mounts */ | 
| Al Viro | 52ba162 | 2011-11-25 02:25:17 -0500 | [diff] [blame] | 35 | 	const char *mnt_devname;	/* Name of device e.g. /dev/dsk/hda1 */ | 
| Al Viro | 1a4eeaf | 2011-11-25 02:19:55 -0500 | [diff] [blame] | 36 | 	struct list_head mnt_list; | 
| Al Viro | 6776db3d | 2011-11-25 00:22:05 -0500 | [diff] [blame] | 37 | 	struct list_head mnt_expire;	/* link in fs-specific expiry list */ | 
 | 38 | 	struct list_head mnt_share;	/* circular list of shared mounts */ | 
 | 39 | 	struct list_head mnt_slave_list;/* list of slave mounts */ | 
 | 40 | 	struct list_head mnt_slave;	/* slave list entry */ | 
| Al Viro | 3230192 | 2011-11-25 00:10:28 -0500 | [diff] [blame] | 41 | 	struct mount *mnt_master;	/* slave is on master->mnt_slave_list */ | 
| Al Viro | 143c8c9 | 2011-11-25 00:46:35 -0500 | [diff] [blame] | 42 | 	struct mnt_namespace *mnt_ns;	/* containing namespace */ | 
| Al Viro | c63181e | 2011-11-25 02:35:16 -0500 | [diff] [blame] | 43 | #ifdef CONFIG_FSNOTIFY | 
 | 44 | 	struct hlist_head mnt_fsnotify_marks; | 
 | 45 | 	__u32 mnt_fsnotify_mask; | 
 | 46 | #endif | 
| Al Viro | 15169fe | 2011-11-25 00:50:41 -0500 | [diff] [blame] | 47 | 	int mnt_id;			/* mount identifier */ | 
 | 48 | 	int mnt_group_id;		/* peer group identifier */ | 
| Al Viro | 863d684 | 2011-11-25 00:57:42 -0500 | [diff] [blame] | 49 | 	int mnt_expiry_mark;		/* true if marked for expiry */ | 
 | 50 | 	int mnt_pinned; | 
 | 51 | 	int mnt_ghosts; | 
| Al Viro | 7d6fec4 | 2011-11-23 12:14:10 -0500 | [diff] [blame] | 52 | }; | 
 | 53 |  | 
| Al Viro | f7a99c5 | 2012-06-09 00:59:08 -0400 | [diff] [blame] | 54 | #define MNT_NS_INTERNAL ERR_PTR(-EINVAL) /* distinct from any mnt_namespace */ | 
 | 55 |  | 
| Al Viro | 7d6fec4 | 2011-11-23 12:14:10 -0500 | [diff] [blame] | 56 | static inline struct mount *real_mount(struct vfsmount *mnt) | 
 | 57 | { | 
 | 58 | 	return container_of(mnt, struct mount, mnt); | 
 | 59 | } | 
 | 60 |  | 
| Al Viro | 676da58 | 2011-11-24 21:47:05 -0500 | [diff] [blame] | 61 | static inline int mnt_has_parent(struct mount *mnt) | 
| Al Viro | b2dba1a | 2011-11-23 19:26:23 -0500 | [diff] [blame] | 62 | { | 
| Al Viro | 0714a53 | 2011-11-24 22:19:58 -0500 | [diff] [blame] | 63 | 	return mnt != mnt->mnt_parent; | 
| Al Viro | b2dba1a | 2011-11-23 19:26:23 -0500 | [diff] [blame] | 64 | } | 
| Al Viro | c710536 | 2011-11-24 18:22:03 -0500 | [diff] [blame] | 65 |  | 
| Al Viro | f7a99c5 | 2012-06-09 00:59:08 -0400 | [diff] [blame] | 66 | static inline int is_mounted(struct vfsmount *mnt) | 
 | 67 | { | 
 | 68 | 	/* neither detached nor internal? */ | 
 | 69 | 	return !IS_ERR_OR_NULL(real_mount(mnt)); | 
 | 70 | } | 
 | 71 |  | 
| Al Viro | c710536 | 2011-11-24 18:22:03 -0500 | [diff] [blame] | 72 | extern struct mount *__lookup_mnt(struct vfsmount *, struct dentry *, int); | 
| Al Viro | 0226f49 | 2011-12-06 12:21:54 -0500 | [diff] [blame] | 73 |  | 
 | 74 | static inline void get_mnt_ns(struct mnt_namespace *ns) | 
 | 75 | { | 
 | 76 | 	atomic_inc(&ns->count); | 
 | 77 | } | 
 | 78 |  | 
 | 79 | struct proc_mounts { | 
| Al Viro | 6ce6e24 | 2012-06-09 01:16:59 -0400 | [diff] [blame] | 80 | 	struct seq_file m; | 
| Al Viro | 0226f49 | 2011-12-06 12:21:54 -0500 | [diff] [blame] | 81 | 	struct mnt_namespace *ns; | 
 | 82 | 	struct path root; | 
 | 83 | 	int (*show)(struct seq_file *, struct vfsmount *); | 
 | 84 | }; | 
 | 85 |  | 
| Al Viro | 6ce6e24 | 2012-06-09 01:16:59 -0400 | [diff] [blame] | 86 | #define proc_mounts(p) (container_of((p), struct proc_mounts, m)) | 
 | 87 |  | 
| Al Viro | 0226f49 | 2011-12-06 12:21:54 -0500 | [diff] [blame] | 88 | extern const struct seq_operations mounts_op; |