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 nfs_export; 18 int xino; 19 bool metacopy; 20}; 21 22struct ovl_sb { 23 struct super_block *sb; 24 dev_t pseudo_dev; 25}; 26 27struct 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 38struct ovl_path { 39 struct ovl_layer *layer; 40 struct dentry *dentry; 41}; 42 43/* private information held for overlayfs's superblock */ 44struct 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 *workdir_trap; 70 struct inode *indexdir_trap; 71 /* Inode numbers in all layers do not use the high xino_bits */ 72 unsigned int xino_bits; 73}; 74 75/* private information held for every overlayfs dentry */ 76struct ovl_entry { 77 union { 78 struct { 79 unsigned long flags; 80 }; 81 struct rcu_head rcu; 82 }; 83 unsigned numlower; 84 struct ovl_path lowerstack[]; 85}; 86 87struct ovl_entry *ovl_alloc_entry(unsigned int numlower); 88 89static inline struct ovl_entry *OVL_E(struct dentry *dentry) 90{ 91 return (struct ovl_entry *) dentry->d_fsdata; 92} 93 94struct ovl_inode { 95 union { 96 struct ovl_dir_cache *cache; /* directory */ 97 struct inode *lowerdata; /* regular file */ 98 }; 99 const char *redirect; 100 u64 version; 101 unsigned long flags; 102 struct inode vfs_inode; 103 struct dentry *__upperdentry; 104 struct inode *lower; 105 106 /* synchronize copy up and more */ 107 struct mutex lock; 108}; 109 110static inline struct ovl_inode *OVL_I(struct inode *inode) 111{ 112 return container_of(inode, struct ovl_inode, vfs_inode); 113} 114 115static inline struct dentry *ovl_upperdentry_dereference(struct ovl_inode *oi) 116{ 117 return READ_ONCE(oi->__upperdentry); 118} 119