|  | /* | 
|  | * | 
|  | * 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; | 
|  | bool redirect_dir; | 
|  | }; | 
|  |  | 
|  | /* private information held for overlayfs's superblock */ | 
|  | struct ovl_fs { | 
|  | struct vfsmount *upper_mnt; | 
|  | unsigned numlower; | 
|  | struct vfsmount **lower_mnt; | 
|  | struct dentry *workdir; | 
|  | long namelen; | 
|  | /* 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; | 
|  | bool tmpfile; | 
|  | bool noxattr; | 
|  | wait_queue_head_t copyup_wq; | 
|  | /* sb common to all layers */ | 
|  | struct super_block *same_sb; | 
|  | }; | 
|  |  | 
|  | /* private information held for every overlayfs dentry */ | 
|  | struct ovl_entry { | 
|  | struct dentry *__upperdentry; | 
|  | struct ovl_dir_cache *cache; | 
|  | union { | 
|  | struct { | 
|  | u64 version; | 
|  | const char *redirect; | 
|  | bool opaque; | 
|  | bool impure; | 
|  | bool copying; | 
|  | }; | 
|  | struct rcu_head rcu; | 
|  | }; | 
|  | unsigned numlower; | 
|  | struct path lowerstack[]; | 
|  | }; | 
|  |  | 
|  | struct ovl_entry *ovl_alloc_entry(unsigned int numlower); | 
|  |  | 
|  | static inline struct dentry *ovl_upperdentry_dereference(struct ovl_entry *oe) | 
|  | { | 
|  | return lockless_dereference(oe->__upperdentry); | 
|  | } |