2016-12-16 13:02:56 +03:00
/*
*
* Copyright ( C ) 2011 Novell Inc .
* Copyright ( C ) 2016 Red Hat , Inc .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation .
*/
struct ovl_config {
char * lowerdir ;
char * upperdir ;
char * workdir ;
bool default_permissions ;
2016-12-16 13:02:56 +03:00
bool redirect_dir ;
2016-12-16 13:02:56 +03:00
} ;
/* private information held for overlayfs's superblock */
struct ovl_fs {
struct vfsmount * upper_mnt ;
unsigned numlower ;
struct vfsmount * * lower_mnt ;
struct dentry * workdir ;
2016-12-16 13:02:56 +03:00
long namelen ;
2016-12-16 13:02:56 +03:00
/* pathnames of lower and upper dirs, for show_options */
struct ovl_config config ;
/* creds of process who forced instantiation of super block */
const struct cred * creator_cred ;
2017-01-17 07:34:53 +03:00
bool tmpfile ;
2017-05-17 00:12:40 +03:00
bool noxattr ;
2017-01-17 07:34:56 +03:00
wait_queue_head_t copyup_wq ;
2017-03-22 15:42:21 +03:00
/* sb common to all layers */
struct super_block * same_sb ;
2016-12-16 13:02:56 +03:00
} ;
/* private information held for every overlayfs dentry */
struct ovl_entry {
struct ovl_dir_cache * cache ;
union {
struct {
u64 version ;
2016-12-16 13:02:56 +03:00
const char * redirect ;
2016-12-16 13:02:56 +03:00
bool opaque ;
2017-05-11 16:42:26 +03:00
bool impure ;
2017-01-17 07:34:56 +03:00
bool copying ;
2016-12-16 13:02:56 +03:00
} ;
struct rcu_head rcu ;
} ;
unsigned numlower ;
struct path lowerstack [ ] ;
} ;
struct ovl_entry * ovl_alloc_entry ( unsigned int numlower ) ;
2017-06-12 09:54:40 +03:00
struct ovl_inode {
struct inode vfs_inode ;
2017-07-04 23:03:16 +03:00
struct dentry * __upperdentry ;
2017-07-04 23:03:16 +03:00
struct inode * lower ;
2017-06-12 09:54:40 +03:00
} ;
static inline struct ovl_inode * OVL_I ( struct inode * inode )
{
return container_of ( inode , struct ovl_inode , vfs_inode ) ;
}
2017-07-04 23:03:16 +03:00
static inline struct dentry * ovl_upperdentry_dereference ( struct ovl_inode * oi )
{
return lockless_dereference ( oi - > __upperdentry ) ;
}