xref: /openbmc/linux/fs/overlayfs/ovl_entry.h (revision 82b749b2)
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;
4639d3d60aSAmir Goldstein 			bool copying;
47bbb1e54dSMiklos Szeredi 		};
48bbb1e54dSMiklos Szeredi 		struct rcu_head rcu;
49bbb1e54dSMiklos Szeredi 	};
50bbb1e54dSMiklos Szeredi 	unsigned numlower;
51bbb1e54dSMiklos Szeredi 	struct path lowerstack[];
52bbb1e54dSMiklos Szeredi };
53bbb1e54dSMiklos Szeredi 
54bbb1e54dSMiklos Szeredi struct ovl_entry *ovl_alloc_entry(unsigned int numlower);
55bbb1e54dSMiklos Szeredi 
56bbb1e54dSMiklos Szeredi static inline struct dentry *ovl_upperdentry_dereference(struct ovl_entry *oe)
57bbb1e54dSMiklos Szeredi {
58bbb1e54dSMiklos Szeredi 	return lockless_dereference(oe->__upperdentry);
59bbb1e54dSMiklos Szeredi }
60