2016-12-16 11:02:56 +01: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 11:02:56 +01:00
bool redirect_dir ;
2017-12-11 11:28:10 +01:00
bool redirect_follow ;
const char * redirect_mode ;
2017-06-21 15:28:36 +03:00
bool index ;
2016-12-16 11:02:56 +01:00
} ;
2017-07-24 01:57:54 -05:00
struct ovl_layer {
struct vfsmount * mnt ;
2017-11-01 20:12:49 +02:00
dev_t pseudo_dev ;
2017-07-24 01:57:54 -05:00
} ;
struct ovl_path {
struct ovl_layer * layer ;
struct dentry * dentry ;
} ;
2016-12-16 11:02:56 +01:00
/* private information held for overlayfs's superblock */
struct ovl_fs {
struct vfsmount * upper_mnt ;
unsigned numlower ;
2017-07-24 01:57:54 -05:00
struct ovl_layer * lower_layers ;
2017-06-21 15:28:33 +03:00
/* workbasedir is the path at workdir= mount option */
struct dentry * workbasedir ;
/* workdir is the 'work' directory under workbasedir */
2016-12-16 11:02:56 +01:00
struct dentry * workdir ;
2017-06-21 15:28:36 +03:00
/* index directory listing overlay inodes by origin file handle */
struct dentry * indexdir ;
2016-12-16 11:02:56 +01:00
long namelen ;
2016-12-16 11:02:56 +01: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 06:34:53 +02:00
bool tmpfile ;
2017-05-17 00:12:40 +03:00
bool noxattr ;
2017-03-22 08:42:21 -04:00
/* sb common to all layers */
struct super_block * same_sb ;
2017-09-29 10:21:21 +03:00
/* Did we take the inuse lock? */
bool upperdir_locked ;
bool workdir_locked ;
2016-12-16 11:02:56 +01:00
} ;
/* private information held for every overlayfs dentry */
struct ovl_entry {
union {
2017-07-04 22:03:18 +02:00
struct {
unsigned long has_upper ;
bool opaque ;
} ;
2016-12-16 11:02:56 +01:00
struct rcu_head rcu ;
} ;
unsigned numlower ;
2017-07-24 01:57:54 -05:00
struct ovl_path lowerstack [ ] ;
2016-12-16 11:02:56 +01:00
} ;
struct ovl_entry * ovl_alloc_entry ( unsigned int numlower ) ;
2017-06-12 09:54:40 +03:00
struct ovl_inode {
2017-07-04 22:03:16 +02:00
struct ovl_dir_cache * cache ;
2017-07-04 22:03:16 +02:00
const char * redirect ;
2017-07-04 22:03:16 +02:00
u64 version ;
2017-07-04 22:03:16 +02:00
unsigned long flags ;
2017-06-12 09:54:40 +03:00
struct inode vfs_inode ;
2017-07-04 22:03:16 +02:00
struct dentry * __upperdentry ;
2017-07-04 22:03:16 +02:00
struct inode * lower ;
2017-06-21 15:28:51 +03:00
/* synchronize copy up and more */
struct mutex lock ;
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 22:03:16 +02:00
static inline struct dentry * ovl_upperdentry_dereference ( struct ovl_inode * oi )
{
2017-10-24 11:22:48 +01:00
return READ_ONCE ( oi - > __upperdentry ) ;
2017-07-04 22:03:16 +02:00
}