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