linux/fs/overlayfs/ovl_entry.h
<<
>>
Prefs
   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}
 152