Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
7143 serge 1
/*
2
 * kernfs.h - pseudo filesystem decoupled from vfs locking
3
 *
4
 * This file is released under the GPLv2.
5
 */
6
 
7
#ifndef __LINUX_KERNFS_H
8
#define __LINUX_KERNFS_H
9
 
10
#include 
11
#include 
12
#include 
13
#include 
14
#include 
15
#include 
16
#include 
17
#include 
18
#include 
19
 
20
struct file;
21
struct dentry;
22
struct iattr;
23
struct seq_file;
24
struct vm_area_struct;
25
struct super_block;
26
struct file_system_type;
27
 
28
struct kernfs_open_node;
29
struct kernfs_iattrs;
30
 
31
enum kernfs_node_type {
32
	KERNFS_DIR		= 0x0001,
33
	KERNFS_FILE		= 0x0002,
34
	KERNFS_LINK		= 0x0004,
35
};
36
 
37
#define KERNFS_TYPE_MASK	0x000f
38
#define KERNFS_FLAG_MASK	~KERNFS_TYPE_MASK
39
 
40
enum kernfs_node_flag {
41
	KERNFS_ACTIVATED	= 0x0010,
42
	KERNFS_NS		= 0x0020,
43
	KERNFS_HAS_SEQ_SHOW	= 0x0040,
44
	KERNFS_HAS_MMAP		= 0x0080,
45
	KERNFS_LOCKDEP		= 0x0100,
46
	KERNFS_SUICIDAL		= 0x0400,
47
	KERNFS_SUICIDED		= 0x0800,
48
	KERNFS_EMPTY_DIR	= 0x1000,
49
};
50
 
51
/* @flags for kernfs_create_root() */
52
enum kernfs_root_flag {
53
	/*
54
	 * kernfs_nodes are created in the deactivated state and invisible.
55
	 * They require explicit kernfs_activate() to become visible.  This
56
	 * can be used to make related nodes become visible atomically
57
	 * after all nodes are created successfully.
58
	 */
59
	KERNFS_ROOT_CREATE_DEACTIVATED		= 0x0001,
60
 
61
	/*
62
	 * For regular flies, if the opener has CAP_DAC_OVERRIDE, open(2)
63
	 * succeeds regardless of the RW permissions.  sysfs had an extra
64
	 * layer of enforcement where open(2) fails with -EACCES regardless
65
	 * of CAP_DAC_OVERRIDE if the permission doesn't have the
66
	 * respective read or write access at all (none of S_IRUGO or
67
	 * S_IWUGO) or the respective operation isn't implemented.  The
68
	 * following flag enables that behavior.
69
	 */
70
	KERNFS_ROOT_EXTRA_OPEN_PERM_CHECK	= 0x0002,
71
};
72
 
73
/* type-specific structures for kernfs_node union members */
74
struct kernfs_elem_dir {
75
	unsigned long		subdirs;
76
	/* children rbtree starts here and goes through kn->rb */
77
	struct rb_root		children;
78
 
79
	/*
80
	 * The kernfs hierarchy this directory belongs to.  This fits
81
	 * better directly in kernfs_node but is here to save space.
82
	 */
83
	struct kernfs_root	*root;
84
};
85
 
86
struct kernfs_elem_symlink {
87
	struct kernfs_node	*target_kn;
88
};
89
 
90
struct kernfs_elem_attr {
91
	const struct kernfs_ops	*ops;
92
	struct kernfs_open_node	*open;
93
	loff_t			size;
94
	struct kernfs_node	*notify_next;	/* for kernfs_notify() */
95
};
96
 
97
/*
98
 * kernfs_node - the building block of kernfs hierarchy.  Each and every
99
 * kernfs node is represented by single kernfs_node.  Most fields are
100
 * private to kernfs and shouldn't be accessed directly by kernfs users.
101
 *
102
 * As long as s_count reference is held, the kernfs_node itself is
103
 * accessible.  Dereferencing elem or any other outer entity requires
104
 * active reference.
105
 */
106
struct kernfs_node {
107
	atomic_t		count;
108
	atomic_t		active;
109
#ifdef CONFIG_DEBUG_LOCK_ALLOC
110
	struct lockdep_map	dep_map;
111
#endif
112
	/*
113
	 * Use kernfs_get_parent() and kernfs_name/path() instead of
114
	 * accessing the following two fields directly.  If the node is
115
	 * never moved to a different parent, it is safe to access the
116
	 * parent directly.
117
	 */
118
	struct kernfs_node	*parent;
119
	const char		*name;
120
 
121
	struct rb_node		rb;
122
 
123
	const void		*ns;	/* namespace tag */
124
	unsigned int		hash;	/* ns + name hash */
125
	union {
126
		struct kernfs_elem_dir		dir;
127
		struct kernfs_elem_symlink	symlink;
128
		struct kernfs_elem_attr		attr;
129
	};
130
 
131
	void			*priv;
132
 
133
	unsigned short		flags;
134
	umode_t			mode;
135
	unsigned int		ino;
136
	struct kernfs_iattrs	*iattr;
137
};
138
 
139
 
140
#endif	/* __LINUX_KERNFS_H */