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; 1702bcd157SAmir Goldstein bool index; 18bbb1e54dSMiklos Szeredi }; 19bbb1e54dSMiklos Szeredi 20bbb1e54dSMiklos Szeredi /* private information held for overlayfs's superblock */ 21bbb1e54dSMiklos Szeredi struct ovl_fs { 22bbb1e54dSMiklos Szeredi struct vfsmount *upper_mnt; 23bbb1e54dSMiklos Szeredi unsigned numlower; 24bbb1e54dSMiklos Szeredi struct vfsmount **lower_mnt; 252cac0c00SAmir Goldstein /* workbasedir is the path at workdir= mount option */ 262cac0c00SAmir Goldstein struct dentry *workbasedir; 272cac0c00SAmir Goldstein /* workdir is the 'work' directory under workbasedir */ 28bbb1e54dSMiklos Szeredi struct dentry *workdir; 2902bcd157SAmir Goldstein /* index directory listing overlay inodes by origin file handle */ 3002bcd157SAmir Goldstein struct dentry *indexdir; 316b2d5fe4SMiklos Szeredi long namelen; 32bbb1e54dSMiklos Szeredi /* pathnames of lower and upper dirs, for show_options */ 33bbb1e54dSMiklos Szeredi struct ovl_config config; 34bbb1e54dSMiklos Szeredi /* creds of process who forced instantiation of super block */ 35bbb1e54dSMiklos Szeredi const struct cred *creator_cred; 36e7f52429SAmir Goldstein bool tmpfile; 3782b749b2SAmir Goldstein bool noxattr; 387bcd74b9SAmir Goldstein /* sb common to all layers */ 397bcd74b9SAmir Goldstein struct super_block *same_sb; 4085fdee1eSAmir Goldstein /* Did we take the inuse lock? */ 4185fdee1eSAmir Goldstein bool upperdir_locked; 4285fdee1eSAmir Goldstein bool workdir_locked; 43bbb1e54dSMiklos Szeredi }; 44bbb1e54dSMiklos Szeredi 45bbb1e54dSMiklos Szeredi /* private information held for every overlayfs dentry */ 46bbb1e54dSMiklos Szeredi struct ovl_entry { 47bbb1e54dSMiklos Szeredi union { 4855acc661SMiklos Szeredi struct { 4955acc661SMiklos Szeredi unsigned long has_upper; 50bbb1e54dSMiklos Szeredi bool opaque; 5155acc661SMiklos Szeredi }; 52bbb1e54dSMiklos Szeredi struct rcu_head rcu; 53bbb1e54dSMiklos Szeredi }; 54bbb1e54dSMiklos Szeredi unsigned numlower; 55bbb1e54dSMiklos Szeredi struct path lowerstack[]; 56bbb1e54dSMiklos Szeredi }; 57bbb1e54dSMiklos Szeredi 58bbb1e54dSMiklos Szeredi struct ovl_entry *ovl_alloc_entry(unsigned int numlower); 59bbb1e54dSMiklos Szeredi 6013cf199dSAmir Goldstein struct ovl_inode { 6104a01ac7SMiklos Szeredi struct ovl_dir_cache *cache; 62cf31c463SMiklos Szeredi const char *redirect; 6304a01ac7SMiklos Szeredi u64 version; 6413c72075SMiklos Szeredi unsigned long flags; 6513cf199dSAmir Goldstein struct inode vfs_inode; 6609d8b586SMiklos Szeredi struct dentry *__upperdentry; 6725b7713aSMiklos Szeredi struct inode *lower; 68a015dafcSAmir Goldstein 69a015dafcSAmir Goldstein /* synchronize copy up and more */ 70a015dafcSAmir Goldstein struct mutex lock; 7113cf199dSAmir Goldstein }; 7213cf199dSAmir Goldstein 7313cf199dSAmir Goldstein static inline struct ovl_inode *OVL_I(struct inode *inode) 7413cf199dSAmir Goldstein { 7513cf199dSAmir Goldstein return container_of(inode, struct ovl_inode, vfs_inode); 7613cf199dSAmir Goldstein } 7709d8b586SMiklos Szeredi 7809d8b586SMiklos Szeredi static inline struct dentry *ovl_upperdentry_dereference(struct ovl_inode *oi) 7909d8b586SMiklos Szeredi { 80506458efSWill Deacon return READ_ONCE(oi->__upperdentry); 8109d8b586SMiklos Szeredi } 82