xref: /openbmc/linux/fs/overlayfs/ovl_entry.h (revision 506458ef)
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;
1702bcd157SAmir Goldstein 	bool index;
18bbb1e54dSMiklos Szeredi };
19bbb1e54dSMiklos Szeredi 
20bbb1e54dSMiklos Szeredi /* private information held for overlayfs's superblock */
21bbb1e54dSMiklos Szeredi struct ovl_fs {
22bbb1e54dSMiklos Szeredi 	struct vfsmount *upper_mnt;
23bbb1e54dSMiklos Szeredi 	unsigned numlower;
24bbb1e54dSMiklos Szeredi 	struct vfsmount **lower_mnt;
252cac0c00SAmir Goldstein 	/* workbasedir is the path at workdir= mount option */
262cac0c00SAmir Goldstein 	struct dentry *workbasedir;
272cac0c00SAmir Goldstein 	/* workdir is the 'work' directory under workbasedir */
28bbb1e54dSMiklos Szeredi 	struct dentry *workdir;
2902bcd157SAmir Goldstein 	/* index directory listing overlay inodes by origin file handle */
3002bcd157SAmir Goldstein 	struct dentry *indexdir;
316b2d5fe4SMiklos Szeredi 	long namelen;
32bbb1e54dSMiklos Szeredi 	/* pathnames of lower and upper dirs, for show_options */
33bbb1e54dSMiklos Szeredi 	struct ovl_config config;
34bbb1e54dSMiklos Szeredi 	/* creds of process who forced instantiation of super block */
35bbb1e54dSMiklos Szeredi 	const struct cred *creator_cred;
36e7f52429SAmir Goldstein 	bool tmpfile;
3782b749b2SAmir Goldstein 	bool noxattr;
387bcd74b9SAmir Goldstein 	/* sb common to all layers */
397bcd74b9SAmir Goldstein 	struct super_block *same_sb;
4085fdee1eSAmir Goldstein 	/* Did we take the inuse lock? */
4185fdee1eSAmir Goldstein 	bool upperdir_locked;
4285fdee1eSAmir Goldstein 	bool workdir_locked;
43bbb1e54dSMiklos Szeredi };
44bbb1e54dSMiklos Szeredi 
45bbb1e54dSMiklos Szeredi /* private information held for every overlayfs dentry */
46bbb1e54dSMiklos Szeredi struct ovl_entry {
47bbb1e54dSMiklos Szeredi 	union {
4855acc661SMiklos Szeredi 		struct {
4955acc661SMiklos Szeredi 			unsigned long has_upper;
50bbb1e54dSMiklos Szeredi 			bool opaque;
5155acc661SMiklos Szeredi 		};
52bbb1e54dSMiklos Szeredi 		struct rcu_head rcu;
53bbb1e54dSMiklos Szeredi 	};
54bbb1e54dSMiklos Szeredi 	unsigned numlower;
55bbb1e54dSMiklos Szeredi 	struct path lowerstack[];
56bbb1e54dSMiklos Szeredi };
57bbb1e54dSMiklos Szeredi 
58bbb1e54dSMiklos Szeredi struct ovl_entry *ovl_alloc_entry(unsigned int numlower);
59bbb1e54dSMiklos Szeredi 
6013cf199dSAmir Goldstein struct ovl_inode {
6104a01ac7SMiklos Szeredi 	struct ovl_dir_cache *cache;
62cf31c463SMiklos Szeredi 	const char *redirect;
6304a01ac7SMiklos Szeredi 	u64 version;
6413c72075SMiklos Szeredi 	unsigned long flags;
6513cf199dSAmir Goldstein 	struct inode vfs_inode;
6609d8b586SMiklos Szeredi 	struct dentry *__upperdentry;
6725b7713aSMiklos Szeredi 	struct inode *lower;
68a015dafcSAmir Goldstein 
69a015dafcSAmir Goldstein 	/* synchronize copy up and more */
70a015dafcSAmir Goldstein 	struct mutex lock;
7113cf199dSAmir Goldstein };
7213cf199dSAmir Goldstein 
7313cf199dSAmir Goldstein static inline struct ovl_inode *OVL_I(struct inode *inode)
7413cf199dSAmir Goldstein {
7513cf199dSAmir Goldstein 	return container_of(inode, struct ovl_inode, vfs_inode);
7613cf199dSAmir Goldstein }
7709d8b586SMiklos Szeredi 
7809d8b586SMiklos Szeredi static inline struct dentry *ovl_upperdentry_dereference(struct ovl_inode *oi)
7909d8b586SMiklos Szeredi {
80506458efSWill Deacon 	return READ_ONCE(oi->__upperdentry);
8109d8b586SMiklos Szeredi }
82