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 ;
2018-01-19 11:26:53 +02:00
bool nfs_export ;
2018-03-29 09:08:18 +03:00
int xino ;
2018-05-11 11:49:27 -04:00
bool metacopy ;
2016-12-16 11:02:56 +01:00
} ;
2018-03-28 20:22:41 +03:00
struct ovl_sb {
struct super_block * sb ;
dev_t pseudo_dev ;
} ;
2017-07-24 01:57:54 -05:00
struct ovl_layer {
struct vfsmount * mnt ;
2018-03-28 20:22:41 +03:00
struct ovl_sb * fs ;
/* Index of this layer in fs root (upper idx == 0) */
2017-11-08 19:23:36 +02:00
int idx ;
2018-03-28 20:22:41 +03:00
/* One fsid per unique underlying sb (upper fsid == 0) */
int fsid ;
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 ;
2018-03-28 20:22:41 +03:00
unsigned int numlower ;
/* Number of unique lower sb that differ from upper sb */
unsigned int numlowerfs ;
2017-07-24 01:57:54 -05:00
struct ovl_layer * lower_layers ;
2018-03-28 20:22:41 +03:00
struct ovl_sb * lower_fs ;
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-09-29 10:21:21 +03:00
/* Did we take the inuse lock? */
bool upperdir_locked ;
bool workdir_locked ;
2017-11-07 13:55:04 +02:00
/* Inode numbers in all layers do not use the high xino_bits */
unsigned int xino_bits ;
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 {
2018-01-14 19:25:31 +02:00
unsigned long flags ;
2017-07-04 22:03:18 +02:00
} ;
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 ) ;
2018-01-14 19:25:31 +02:00
static inline struct ovl_entry * OVL_E ( struct dentry * dentry )
{
return ( struct ovl_entry * ) dentry - > d_fsdata ;
}
2017-06-12 09:54:40 +03:00
struct ovl_inode {
2018-05-11 11:49:30 -04:00
union {
struct ovl_dir_cache * cache ; /* directory */
struct inode * lowerdata ; /* regular file */
} ;
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
}