xref: /openbmc/linux/fs/overlayfs/ovl_entry.h (revision 13cf199d)
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 dentry *__upperdentry;
40bbb1e54dSMiklos Szeredi 	struct ovl_dir_cache *cache;
41bbb1e54dSMiklos Szeredi 	union {
42bbb1e54dSMiklos Szeredi 		struct {
43bbb1e54dSMiklos Szeredi 			u64 version;
4402b69b28SMiklos Szeredi 			const char *redirect;
45bbb1e54dSMiklos Szeredi 			bool opaque;
46ee1d6d37SAmir Goldstein 			bool impure;
4739d3d60aSAmir Goldstein 			bool copying;
48bbb1e54dSMiklos Szeredi 		};
49bbb1e54dSMiklos Szeredi 		struct rcu_head rcu;
50bbb1e54dSMiklos Szeredi 	};
51bbb1e54dSMiklos Szeredi 	unsigned numlower;
52bbb1e54dSMiklos Szeredi 	struct path lowerstack[];
53bbb1e54dSMiklos Szeredi };
54bbb1e54dSMiklos Szeredi 
55bbb1e54dSMiklos Szeredi struct ovl_entry *ovl_alloc_entry(unsigned int numlower);
56bbb1e54dSMiklos Szeredi 
57bbb1e54dSMiklos Szeredi static inline struct dentry *ovl_upperdentry_dereference(struct ovl_entry *oe)
58bbb1e54dSMiklos Szeredi {
59bbb1e54dSMiklos Szeredi 	return lockless_dereference(oe->__upperdentry);
60bbb1e54dSMiklos Szeredi }
6113cf199dSAmir Goldstein 
6213cf199dSAmir Goldstein struct ovl_inode {
6313cf199dSAmir Goldstein 	struct inode vfs_inode;
6413cf199dSAmir Goldstein };
6513cf199dSAmir Goldstein 
6613cf199dSAmir Goldstein static inline struct ovl_inode *OVL_I(struct inode *inode)
6713cf199dSAmir Goldstein {
6813cf199dSAmir Goldstein 	return container_of(inode, struct ovl_inode, vfs_inode);
6913cf199dSAmir Goldstein }
70