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 8 struct 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 nfs_export; 18 int xino; 19 bool metacopy; 20 }; 21 22 struct ovl_sb { 23 struct super_block *sb; 24 dev_t pseudo_dev; 25 }; 26 27 struct ovl_layer { 28 struct vfsmount *mnt; 29 /* Trap in ovl inode cache */ 30 struct inode *trap; 31 struct ovl_sb *fs; 32 /* Index of this layer in fs root (upper idx == 0) */ 33 int idx; 34 /* One fsid per unique underlying sb (upper fsid == 0) */ 35 int fsid; 36 }; 37 38 struct ovl_path { 39 struct ovl_layer *layer; 40 struct dentry *dentry; 41 }; 42 43 /* private information held for overlayfs's superblock */ 44 struct ovl_fs { 45 struct vfsmount *upper_mnt; 46 unsigned int numlower; 47 /* Number of unique lower sb that differ from upper sb */ 48 unsigned int numlowerfs; 49 struct ovl_layer *lower_layers; 50 struct ovl_sb *lower_fs; 51 /* workbasedir is the path at workdir= mount option */ 52 struct dentry *workbasedir; 53 /* workdir is the 'work' directory under workbasedir */ 54 struct dentry *workdir; 55 /* index directory listing overlay inodes by origin file handle */ 56 struct dentry *indexdir; 57 long namelen; 58 /* pathnames of lower and upper dirs, for show_options */ 59 struct ovl_config config; 60 /* creds of process who forced instantiation of super block */ 61 const struct cred *creator_cred; 62 bool tmpfile; 63 bool noxattr; 64 /* Did we take the inuse lock? */ 65 bool upperdir_locked; 66 bool workdir_locked; 67 /* Traps in ovl inode cache */ 68 struct inode *upperdir_trap; 69 struct inode *workbasedir_trap; 70 struct inode *workdir_trap; 71 struct inode *indexdir_trap; 72 /* Inode numbers in all layers do not use the high xino_bits */ 73 unsigned int xino_bits; 74 }; 75 76 /* private information held for every overlayfs dentry */ 77 struct ovl_entry { 78 union { 79 struct { 80 unsigned long flags; 81 }; 82 struct rcu_head rcu; 83 }; 84 unsigned numlower; 85 struct ovl_path lowerstack[]; 86 }; 87 88 struct ovl_entry *ovl_alloc_entry(unsigned int numlower); 89 90 static inline struct ovl_entry *OVL_E(struct dentry *dentry) 91 { 92 return (struct ovl_entry *) dentry->d_fsdata; 93 } 94 95 struct ovl_inode { 96 union { 97 struct ovl_dir_cache *cache; /* directory */ 98 struct inode *lowerdata; /* regular file */ 99 }; 100 const char *redirect; 101 u64 version; 102 unsigned long flags; 103 struct inode vfs_inode; 104 struct dentry *__upperdentry; 105 struct inode *lower; 106 107 /* synchronize copy up and more */ 108 struct mutex lock; 109 }; 110 111 static inline struct ovl_inode *OVL_I(struct inode *inode) 112 { 113 return container_of(inode, struct ovl_inode, vfs_inode); 114 } 115 116 static inline struct dentry *ovl_upperdentry_dereference(struct ovl_inode *oi) 117 { 118 return READ_ONCE(oi->__upperdentry); 119 } 120