1bbb1e54dSMiklos Szeredi /* 2bbb1e54dSMiklos Szeredi * 3bbb1e54dSMiklos Szeredi * Copyright (C) 2011 Novell Inc. 4bbb1e54dSMiklos Szeredi * Copyright (C) 2016 Red Hat, Inc. 5bbb1e54dSMiklos Szeredi * 6bbb1e54dSMiklos Szeredi * This program is free software; you can redistribute it and/or modify it 7bbb1e54dSMiklos Szeredi * under the terms of the GNU General Public License version 2 as published by 8bbb1e54dSMiklos Szeredi * the Free Software Foundation. 9bbb1e54dSMiklos Szeredi */ 10bbb1e54dSMiklos Szeredi 11bbb1e54dSMiklos Szeredi struct ovl_config { 12bbb1e54dSMiklos Szeredi char *lowerdir; 13bbb1e54dSMiklos Szeredi char *upperdir; 14bbb1e54dSMiklos Szeredi char *workdir; 15bbb1e54dSMiklos Szeredi bool default_permissions; 16a6c60655SMiklos Szeredi bool redirect_dir; 17438c84c2SMiklos Szeredi bool redirect_follow; 18438c84c2SMiklos Szeredi const char *redirect_mode; 1902bcd157SAmir Goldstein bool index; 20f168f109SAmir Goldstein bool nfs_export; 21bbb1e54dSMiklos Szeredi }; 22bbb1e54dSMiklos Szeredi 23b9343632SChandan Rajendra struct ovl_layer { 24b9343632SChandan Rajendra struct vfsmount *mnt; 252a9c6d06SChandan Rajendra dev_t pseudo_dev; 26d583ed7dSAmir Goldstein /* Index of this layer in fs root (upper == 0) */ 27d583ed7dSAmir Goldstein int idx; 28b9343632SChandan Rajendra }; 29b9343632SChandan Rajendra 30b9343632SChandan Rajendra struct ovl_path { 31b9343632SChandan Rajendra struct ovl_layer *layer; 32b9343632SChandan Rajendra struct dentry *dentry; 33b9343632SChandan Rajendra }; 34b9343632SChandan Rajendra 35bbb1e54dSMiklos Szeredi /* private information held for overlayfs's superblock */ 36bbb1e54dSMiklos Szeredi struct ovl_fs { 37bbb1e54dSMiklos Szeredi struct vfsmount *upper_mnt; 38bbb1e54dSMiklos Szeredi unsigned numlower; 39b9343632SChandan Rajendra struct ovl_layer *lower_layers; 402cac0c00SAmir Goldstein /* workbasedir is the path at workdir= mount option */ 412cac0c00SAmir Goldstein struct dentry *workbasedir; 422cac0c00SAmir Goldstein /* workdir is the 'work' directory under workbasedir */ 43bbb1e54dSMiklos Szeredi struct dentry *workdir; 4402bcd157SAmir Goldstein /* index directory listing overlay inodes by origin file handle */ 4502bcd157SAmir Goldstein struct dentry *indexdir; 466b2d5fe4SMiklos Szeredi long namelen; 47bbb1e54dSMiklos Szeredi /* pathnames of lower and upper dirs, for show_options */ 48bbb1e54dSMiklos Szeredi struct ovl_config config; 49bbb1e54dSMiklos Szeredi /* creds of process who forced instantiation of super block */ 50bbb1e54dSMiklos Szeredi const struct cred *creator_cred; 51e7f52429SAmir Goldstein bool tmpfile; 5282b749b2SAmir Goldstein bool noxattr; 537bcd74b9SAmir Goldstein /* sb common to all layers */ 547bcd74b9SAmir Goldstein struct super_block *same_sb; 5585fdee1eSAmir Goldstein /* Did we take the inuse lock? */ 5685fdee1eSAmir Goldstein bool upperdir_locked; 5785fdee1eSAmir Goldstein bool workdir_locked; 58bbb1e54dSMiklos Szeredi }; 59bbb1e54dSMiklos Szeredi 60bbb1e54dSMiklos Szeredi /* private information held for every overlayfs dentry */ 61bbb1e54dSMiklos Szeredi struct ovl_entry { 62bbb1e54dSMiklos Szeredi union { 6355acc661SMiklos Szeredi struct { 6455acc661SMiklos Szeredi unsigned long has_upper; 65bbb1e54dSMiklos Szeredi bool opaque; 6655acc661SMiklos Szeredi }; 67bbb1e54dSMiklos Szeredi struct rcu_head rcu; 68bbb1e54dSMiklos Szeredi }; 69bbb1e54dSMiklos Szeredi unsigned numlower; 70b9343632SChandan Rajendra struct ovl_path lowerstack[]; 71bbb1e54dSMiklos Szeredi }; 72bbb1e54dSMiklos Szeredi 73bbb1e54dSMiklos Szeredi struct ovl_entry *ovl_alloc_entry(unsigned int numlower); 74bbb1e54dSMiklos Szeredi 7513cf199dSAmir Goldstein struct ovl_inode { 7604a01ac7SMiklos Szeredi struct ovl_dir_cache *cache; 77cf31c463SMiklos Szeredi const char *redirect; 7804a01ac7SMiklos Szeredi u64 version; 7913c72075SMiklos Szeredi unsigned long flags; 8013cf199dSAmir Goldstein struct inode vfs_inode; 8109d8b586SMiklos Szeredi struct dentry *__upperdentry; 8225b7713aSMiklos Szeredi struct inode *lower; 83a015dafcSAmir Goldstein 84a015dafcSAmir Goldstein /* synchronize copy up and more */ 85a015dafcSAmir Goldstein struct mutex lock; 8613cf199dSAmir Goldstein }; 8713cf199dSAmir Goldstein 8813cf199dSAmir Goldstein static inline struct ovl_inode *OVL_I(struct inode *inode) 8913cf199dSAmir Goldstein { 9013cf199dSAmir Goldstein return container_of(inode, struct ovl_inode, vfs_inode); 9113cf199dSAmir Goldstein } 9209d8b586SMiklos Szeredi 9309d8b586SMiklos Szeredi static inline struct dentry *ovl_upperdentry_dereference(struct ovl_inode *oi) 9409d8b586SMiklos Szeredi { 95506458efSWill Deacon return READ_ONCE(oi->__upperdentry); 9609d8b586SMiklos Szeredi } 97