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

ovl_entry.h (3547B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 *
      4 * Copyright (C) 2011 Novell Inc.
      5 * Copyright (C) 2016 Red Hat, Inc.
      6 */
      7
      8struct ovl_config {
      9	char *lowerdir;
     10	char *upperdir;
     11	char *workdir;
     12	bool default_permissions;
     13	bool redirect_dir;
     14	bool redirect_follow;
     15	const char *redirect_mode;
     16	bool index;
     17	bool uuid;
     18	bool nfs_export;
     19	int xino;
     20	bool metacopy;
     21	bool userxattr;
     22	bool ovl_volatile;
     23};
     24
     25struct ovl_sb {
     26	struct super_block *sb;
     27	dev_t pseudo_dev;
     28	/* Unusable (conflicting) uuid */
     29	bool bad_uuid;
     30	/* Used as a lower layer (but maybe also as upper) */
     31	bool is_lower;
     32};
     33
     34struct ovl_layer {
     35	struct vfsmount *mnt;
     36	/* Trap in ovl inode cache */
     37	struct inode *trap;
     38	struct ovl_sb *fs;
     39	/* Index of this layer in fs root (upper idx == 0) */
     40	int idx;
     41	/* One fsid per unique underlying sb (upper fsid == 0) */
     42	int fsid;
     43};
     44
     45struct ovl_path {
     46	const struct ovl_layer *layer;
     47	struct dentry *dentry;
     48};
     49
     50/* private information held for overlayfs's superblock */
     51struct ovl_fs {
     52	unsigned int numlayer;
     53	/* Number of unique fs among layers including upper fs */
     54	unsigned int numfs;
     55	const struct ovl_layer *layers;
     56	struct ovl_sb *fs;
     57	/* workbasedir is the path at workdir= mount option */
     58	struct dentry *workbasedir;
     59	/* workdir is the 'work' directory under workbasedir */
     60	struct dentry *workdir;
     61	/* index directory listing overlay inodes by origin file handle */
     62	struct dentry *indexdir;
     63	long namelen;
     64	/* pathnames of lower and upper dirs, for show_options */
     65	struct ovl_config config;
     66	/* creds of process who forced instantiation of super block */
     67	const struct cred *creator_cred;
     68	bool tmpfile;
     69	bool noxattr;
     70	/* Did we take the inuse lock? */
     71	bool upperdir_locked;
     72	bool workdir_locked;
     73	bool share_whiteout;
     74	/* Traps in ovl inode cache */
     75	struct inode *workbasedir_trap;
     76	struct inode *workdir_trap;
     77	struct inode *indexdir_trap;
     78	/* -1: disabled, 0: same fs, 1..32: number of unused ino bits */
     79	int xino_mode;
     80	/* For allocation of non-persistent inode numbers */
     81	atomic_long_t last_ino;
     82	/* Whiteout dentry cache */
     83	struct dentry *whiteout;
     84	/* r/o snapshot of upperdir sb's only taken on volatile mounts */
     85	errseq_t errseq;
     86};
     87
     88static inline struct vfsmount *ovl_upper_mnt(struct ovl_fs *ofs)
     89{
     90	return ofs->layers[0].mnt;
     91}
     92
     93static inline struct user_namespace *ovl_upper_mnt_userns(struct ovl_fs *ofs)
     94{
     95	return mnt_user_ns(ovl_upper_mnt(ofs));
     96}
     97
     98static inline struct ovl_fs *OVL_FS(struct super_block *sb)
     99{
    100	return (struct ovl_fs *)sb->s_fs_info;
    101}
    102
    103static inline bool ovl_should_sync(struct ovl_fs *ofs)
    104{
    105	return !ofs->config.ovl_volatile;
    106}
    107
    108/* private information held for every overlayfs dentry */
    109struct ovl_entry {
    110	union {
    111		struct {
    112			unsigned long flags;
    113		};
    114		struct rcu_head rcu;
    115	};
    116	unsigned numlower;
    117	struct ovl_path lowerstack[];
    118};
    119
    120struct ovl_entry *ovl_alloc_entry(unsigned int numlower);
    121
    122static inline struct ovl_entry *OVL_E(struct dentry *dentry)
    123{
    124	return (struct ovl_entry *) dentry->d_fsdata;
    125}
    126
    127struct ovl_inode {
    128	union {
    129		struct ovl_dir_cache *cache;	/* directory */
    130		struct inode *lowerdata;	/* regular file */
    131	};
    132	const char *redirect;
    133	u64 version;
    134	unsigned long flags;
    135	struct inode vfs_inode;
    136	struct dentry *__upperdentry;
    137	struct ovl_path lowerpath;
    138
    139	/* synchronize copy up and more */
    140	struct mutex lock;
    141};
    142
    143static inline struct ovl_inode *OVL_I(struct inode *inode)
    144{
    145	return container_of(inode, struct ovl_inode, vfs_inode);
    146}
    147
    148static inline struct dentry *ovl_upperdentry_dereference(struct ovl_inode *oi)
    149{
    150	return READ_ONCE(oi->__upperdentry);
    151}