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