cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mount.h (4111B)


      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
      8struct 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
     27struct mnt_pcp {
     28	int mnt_count;
     29	int mnt_writers;
     30};
     31
     32struct mountpoint {
     33	struct hlist_node m_hash;
     34	struct dentry *m_dentry;
     35	struct hlist_head m_list;
     36	int m_count;
     37};
     38
     39struct 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
     84static inline struct mount *real_mount(struct vfsmount *mnt)
     85{
     86	return container_of(mnt, struct mount, mnt);
     87}
     88
     89static inline int mnt_has_parent(struct mount *mnt)
     90{
     91	return mnt != mnt->mnt_parent;
     92}
     93
     94static inline int is_mounted(struct vfsmount *mnt)
     95{
     96	/* neither detached nor internal? */
     97	return !IS_ERR_OR_NULL(real_mount(mnt)->mnt_ns);
     98}
     99
    100extern struct mount *__lookup_mnt(struct vfsmount *, struct dentry *);
    101
    102extern int __legitimize_mnt(struct vfsmount *, unsigned);
    103extern bool legitimize_mnt(struct vfsmount *, unsigned);
    104
    105static inline bool __path_is_mountpoint(const struct path *path)
    106{
    107	struct mount *m = __lookup_mnt(path->mnt, path->dentry);
    108	return m && likely(!(m->mnt.mnt_flags & MNT_SYNC_UMOUNT));
    109}
    110
    111extern void __detach_mounts(struct dentry *dentry);
    112
    113static inline void detach_mounts(struct dentry *dentry)
    114{
    115	if (!d_mountpoint(dentry))
    116		return;
    117	__detach_mounts(dentry);
    118}
    119
    120static inline void get_mnt_ns(struct mnt_namespace *ns)
    121{
    122	refcount_inc(&ns->ns.count);
    123}
    124
    125extern seqlock_t mount_lock;
    126
    127struct 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
    134extern const struct seq_operations mounts_op;
    135
    136extern bool __is_local_mountpoint(struct dentry *dentry);
    137static inline bool is_local_mountpoint(struct dentry *dentry)
    138{
    139	if (!d_mountpoint(dentry))
    140		return false;
    141
    142	return __is_local_mountpoint(dentry);
    143}
    144
    145static inline bool is_anon_ns(struct mnt_namespace *ns)
    146{
    147	return ns->seq == 0;
    148}
    149
    150extern void mnt_cursor_del(struct mnt_namespace *ns, struct mount *cursor);