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; 17bbb1e54dSMiklos Szeredi }; 18bbb1e54dSMiklos Szeredi 19bbb1e54dSMiklos Szeredi /* private information held for overlayfs's superblock */ 20bbb1e54dSMiklos Szeredi struct ovl_fs { 21bbb1e54dSMiklos Szeredi struct vfsmount *upper_mnt; 22bbb1e54dSMiklos Szeredi unsigned numlower; 23bbb1e54dSMiklos Szeredi struct vfsmount **lower_mnt; 24bbb1e54dSMiklos Szeredi struct dentry *workdir; 256b2d5fe4SMiklos Szeredi long namelen; 26bbb1e54dSMiklos Szeredi /* pathnames of lower and upper dirs, for show_options */ 27bbb1e54dSMiklos Szeredi struct ovl_config config; 28bbb1e54dSMiklos Szeredi /* creds of process who forced instantiation of super block */ 29bbb1e54dSMiklos Szeredi const struct cred *creator_cred; 30e7f52429SAmir Goldstein bool tmpfile; 3182b749b2SAmir Goldstein bool noxattr; 3239d3d60aSAmir Goldstein wait_queue_head_t copyup_wq; 337bcd74b9SAmir Goldstein /* sb common to all layers */ 347bcd74b9SAmir Goldstein struct super_block *same_sb; 35bbb1e54dSMiklos Szeredi }; 36bbb1e54dSMiklos Szeredi 37bbb1e54dSMiklos Szeredi /* private information held for every overlayfs dentry */ 38bbb1e54dSMiklos Szeredi struct ovl_entry { 39bbb1e54dSMiklos Szeredi struct ovl_dir_cache *cache; 40bbb1e54dSMiklos Szeredi union { 41bbb1e54dSMiklos Szeredi struct { 42bbb1e54dSMiklos Szeredi u64 version; 43bbb1e54dSMiklos Szeredi bool opaque; 44ee1d6d37SAmir Goldstein bool impure; 4539d3d60aSAmir Goldstein bool copying; 46bbb1e54dSMiklos Szeredi }; 47bbb1e54dSMiklos Szeredi struct rcu_head rcu; 48bbb1e54dSMiklos Szeredi }; 49bbb1e54dSMiklos Szeredi unsigned numlower; 50bbb1e54dSMiklos Szeredi struct path lowerstack[]; 51bbb1e54dSMiklos Szeredi }; 52bbb1e54dSMiklos Szeredi 53bbb1e54dSMiklos Szeredi struct ovl_entry *ovl_alloc_entry(unsigned int numlower); 54bbb1e54dSMiklos Szeredi 5513cf199dSAmir Goldstein struct ovl_inode { 56cf31c463SMiklos Szeredi const char *redirect; 5713cf199dSAmir Goldstein struct inode vfs_inode; 5809d8b586SMiklos Szeredi struct dentry *__upperdentry; 5925b7713aSMiklos Szeredi struct inode *lower; 6013cf199dSAmir Goldstein }; 6113cf199dSAmir Goldstein 6213cf199dSAmir Goldstein static inline struct ovl_inode *OVL_I(struct inode *inode) 6313cf199dSAmir Goldstein { 6413cf199dSAmir Goldstein return container_of(inode, struct ovl_inode, vfs_inode); 6513cf199dSAmir Goldstein } 6609d8b586SMiklos Szeredi 6709d8b586SMiklos Szeredi static inline struct dentry *ovl_upperdentry_dereference(struct ovl_inode *oi) 6809d8b586SMiklos Szeredi { 6909d8b586SMiklos Szeredi return lockless_dereference(oi->__upperdentry); 7009d8b586SMiklos Szeredi } 71