| lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | #include <linux/mount.h> | 
 | 2 | #include <linux/seq_file.h> | 
 | 3 | #include <linux/poll.h> | 
 | 4 |  | 
 | 5 | struct mnt_namespace { | 
 | 6 | 	atomic_t		count; | 
 | 7 | 	struct mount *	root; | 
 | 8 | 	struct list_head	list; | 
 | 9 | 	wait_queue_head_t poll; | 
 | 10 | 	int event; | 
 | 11 | }; | 
 | 12 |  | 
 | 13 | struct mnt_pcp { | 
 | 14 | 	int mnt_count; | 
 | 15 | 	int mnt_writers; | 
 | 16 | }; | 
 | 17 |  | 
 | 18 | struct mount { | 
 | 19 | 	struct list_head mnt_hash; | 
 | 20 | 	struct mount *mnt_parent; | 
 | 21 | 	struct dentry *mnt_mountpoint; | 
 | 22 | 	struct vfsmount mnt; | 
 | 23 | #ifdef CONFIG_SMP | 
 | 24 | 	struct mnt_pcp __percpu *mnt_pcp; | 
 | 25 | 	atomic_t mnt_longterm;		/* how many of the refs are longterm */ | 
 | 26 | #else | 
 | 27 | 	int mnt_count; | 
 | 28 | 	int mnt_writers; | 
 | 29 | #endif | 
 | 30 | 	struct list_head mnt_mounts;	/* list of children, anchored here */ | 
 | 31 | 	struct list_head mnt_child;	/* and going through their mnt_child */ | 
 | 32 | 	struct list_head mnt_instance;	/* mount instance on sb->s_mounts */ | 
 | 33 | 	const char *mnt_devname;	/* Name of device e.g. /dev/dsk/hda1 */ | 
 | 34 | 	struct list_head mnt_list; | 
 | 35 | 	struct list_head mnt_expire;	/* link in fs-specific expiry list */ | 
 | 36 | 	struct list_head mnt_share;	/* circular list of shared mounts */ | 
 | 37 | 	struct list_head mnt_slave_list;/* list of slave mounts */ | 
 | 38 | 	struct list_head mnt_slave;	/* slave list entry */ | 
 | 39 | 	struct mount *mnt_master;	/* slave is on master->mnt_slave_list */ | 
 | 40 | 	struct mnt_namespace *mnt_ns;	/* containing namespace */ | 
 | 41 | #ifdef CONFIG_FSNOTIFY | 
 | 42 | 	struct hlist_head mnt_fsnotify_marks; | 
 | 43 | 	__u32 mnt_fsnotify_mask; | 
 | 44 | #endif | 
 | 45 | 	int mnt_id;			/* mount identifier */ | 
 | 46 | 	int mnt_group_id;		/* peer group identifier */ | 
 | 47 | 	int mnt_expiry_mark;		/* true if marked for expiry */ | 
 | 48 | 	int mnt_pinned; | 
 | 49 | 	int mnt_ghosts; | 
 | 50 | }; | 
 | 51 |  | 
 | 52 | static inline struct mount *real_mount(struct vfsmount *mnt) | 
 | 53 | { | 
 | 54 | 	return container_of(mnt, struct mount, mnt); | 
 | 55 | } | 
 | 56 |  | 
 | 57 | static inline int mnt_has_parent(struct mount *mnt) | 
 | 58 | { | 
 | 59 | 	return mnt != mnt->mnt_parent; | 
 | 60 | } | 
 | 61 |  | 
 | 62 | extern struct mount *__lookup_mnt(struct vfsmount *, struct dentry *, int); | 
 | 63 |  | 
 | 64 | static inline void get_mnt_ns(struct mnt_namespace *ns) | 
 | 65 | { | 
 | 66 | 	atomic_inc(&ns->count); | 
 | 67 | } | 
 | 68 |  | 
 | 69 | struct proc_mounts { | 
 | 70 | 	struct seq_file m; /* must be the first element */ | 
 | 71 | 	struct mnt_namespace *ns; | 
 | 72 | 	struct path root; | 
 | 73 | 	int (*show)(struct seq_file *, struct vfsmount *); | 
 | 74 | }; | 
 | 75 |  | 
 | 76 | extern const struct seq_operations mounts_op; |