1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _TRACEFS_INTERNAL_H |
3 | #define _TRACEFS_INTERNAL_H |
4 | |
5 | enum { |
6 | TRACEFS_EVENT_INODE = BIT(1), |
7 | TRACEFS_EVENT_TOP_INODE = BIT(2), |
8 | TRACEFS_GID_PERM_SET = BIT(3), |
9 | TRACEFS_UID_PERM_SET = BIT(4), |
10 | TRACEFS_INSTANCE_INODE = BIT(5), |
11 | }; |
12 | |
13 | struct tracefs_inode { |
14 | struct inode vfs_inode; |
15 | /* The below gets initialized with memset_after(ti, 0, vfs_inode) */ |
16 | unsigned long flags; |
17 | void *private; |
18 | }; |
19 | |
20 | /* |
21 | * struct eventfs_attr - cache the mode and ownership of a eventfs entry |
22 | * @mode: saved mode plus flags of what is saved |
23 | * @uid: saved uid if changed |
24 | * @gid: saved gid if changed |
25 | */ |
26 | struct eventfs_attr { |
27 | int mode; |
28 | kuid_t uid; |
29 | kgid_t gid; |
30 | }; |
31 | |
32 | /* |
33 | * struct eventfs_inode - hold the properties of the eventfs directories. |
34 | * @list: link list into the parent directory |
35 | * @rcu: Union with @list for freeing |
36 | * @children: link list into the child eventfs_inode |
37 | * @entries: the array of entries representing the files in the directory |
38 | * @name: the name of the directory to create |
39 | * @entry_attrs: Saved mode and ownership of the @d_children |
40 | * @data: The private data to pass to the callbacks |
41 | * @attr: Saved mode and ownership of eventfs_inode itself |
42 | * @is_freed: Flag set if the eventfs is on its way to be freed |
43 | * Note if is_freed is set, then dentry is corrupted. |
44 | * @is_events: Flag set for only the top level "events" directory |
45 | * @nr_entries: The number of items in @entries |
46 | * @ino: The saved inode number |
47 | */ |
48 | struct eventfs_inode { |
49 | union { |
50 | struct list_head list; |
51 | struct rcu_head rcu; |
52 | }; |
53 | struct list_head children; |
54 | const struct eventfs_entry *entries; |
55 | const char *name; |
56 | struct eventfs_attr *entry_attrs; |
57 | void *data; |
58 | struct eventfs_attr attr; |
59 | struct kref kref; |
60 | unsigned int is_freed:1; |
61 | unsigned int is_events:1; |
62 | unsigned int nr_entries:30; |
63 | unsigned int ino; |
64 | }; |
65 | |
66 | static inline struct tracefs_inode *get_tracefs(const struct inode *inode) |
67 | { |
68 | return container_of(inode, struct tracefs_inode, vfs_inode); |
69 | } |
70 | |
71 | struct dentry *tracefs_start_creating(const char *name, struct dentry *parent); |
72 | struct dentry *tracefs_end_creating(struct dentry *dentry); |
73 | struct dentry *tracefs_failed_creating(struct dentry *dentry); |
74 | struct inode *tracefs_get_inode(struct super_block *sb); |
75 | |
76 | void eventfs_d_release(struct dentry *dentry); |
77 | |
78 | #endif /* _TRACEFS_INTERNAL_H */ |
79 | |