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 }; 23 24 struct ovl_sb { 25 struct super_block *sb; 26 dev_t pseudo_dev; 27 }; 28 29 struct ovl_layer { 30 struct vfsmount *mnt; 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 /* Inode numbers in all layers do not use the high xino_bits */ 68 unsigned int xino_bits; 69 }; 70 71 /* private information held for every overlayfs dentry */ 72 struct ovl_entry { 73 union { 74 struct { 75 unsigned long flags; 76 }; 77 struct rcu_head rcu; 78 }; 79 unsigned numlower; 80 struct ovl_path lowerstack[]; 81 }; 82 83 struct ovl_entry *ovl_alloc_entry(unsigned int numlower); 84 85 static inline struct ovl_entry *OVL_E(struct dentry *dentry) 86 { 87 return (struct ovl_entry *) dentry->d_fsdata; 88 } 89 90 struct ovl_inode { 91 struct ovl_dir_cache *cache; 92 const char *redirect; 93 u64 version; 94 unsigned long flags; 95 struct inode vfs_inode; 96 struct dentry *__upperdentry; 97 struct inode *lower; 98 99 /* synchronize copy up and more */ 100 struct mutex lock; 101 }; 102 103 static inline struct ovl_inode *OVL_I(struct inode *inode) 104 { 105 return container_of(inode, struct ovl_inode, vfs_inode); 106 } 107 108 static inline struct dentry *ovl_upperdentry_dereference(struct ovl_inode *oi) 109 { 110 return READ_ONCE(oi->__upperdentry); 111 } 112