1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef _KOBJECT_H_
16#define _KOBJECT_H_
17
18#include <linux/types.h>
19#include <linux/list.h>
20#include <linux/sysfs.h>
21#include <linux/compiler.h>
22#include <linux/spinlock.h>
23#include <linux/kref.h>
24#include <linux/kobject_ns.h>
25#include <linux/kernel.h>
26#include <linux/wait.h>
27#include <linux/atomic.h>
28#include <linux/workqueue.h>
29#include <linux/rh_kabi.h>
30
31#define UEVENT_HELPER_PATH_LEN 256
32#define UEVENT_NUM_ENVP 32
33#define UEVENT_BUFFER_SIZE 2048
34
35#ifdef CONFIG_UEVENT_HELPER
36
37extern char uevent_helper[];
38#endif
39
40
41extern u64 uevent_seqnum;
42
43
44
45
46
47
48
49
50
51
52
53enum kobject_action {
54 KOBJ_ADD,
55 KOBJ_REMOVE,
56 KOBJ_CHANGE,
57 KOBJ_MOVE,
58 KOBJ_ONLINE,
59 KOBJ_OFFLINE,
60 KOBJ_BIND,
61 KOBJ_UNBIND,
62 KOBJ_MAX
63};
64
65struct kobject {
66 const char *name;
67 struct list_head entry;
68 struct kobject *parent;
69 struct kset *kset;
70 struct kobj_type *ktype;
71 struct kernfs_node *sd;
72 struct kref kref;
73#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
74 struct delayed_work release;
75#endif
76 unsigned int state_initialized:1;
77 unsigned int state_in_sysfs:1;
78 unsigned int state_add_uevent_sent:1;
79 unsigned int state_remove_uevent_sent:1;
80 unsigned int uevent_suppress:1;
81 RH_KABI_RESERVE(1)
82 RH_KABI_RESERVE(2)
83 RH_KABI_RESERVE(3)
84 RH_KABI_RESERVE(4)
85};
86
87extern __printf(2, 3)
88int kobject_set_name(struct kobject *kobj, const char *name, ...);
89extern __printf(2, 0)
90int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
91 va_list vargs);
92
93static inline const char *kobject_name(const struct kobject *kobj)
94{
95 return kobj->name;
96}
97
98extern void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
99extern __printf(3, 4) __must_check
100int kobject_add(struct kobject *kobj, struct kobject *parent,
101 const char *fmt, ...);
102extern __printf(4, 5) __must_check
103int kobject_init_and_add(struct kobject *kobj,
104 struct kobj_type *ktype, struct kobject *parent,
105 const char *fmt, ...);
106
107extern void kobject_del(struct kobject *kobj);
108
109extern struct kobject * __must_check kobject_create(void);
110extern struct kobject * __must_check kobject_create_and_add(const char *name,
111 struct kobject *parent);
112
113extern int __must_check kobject_rename(struct kobject *, const char *new_name);
114extern int __must_check kobject_move(struct kobject *, struct kobject *);
115
116extern struct kobject *kobject_get(struct kobject *kobj);
117extern struct kobject * __must_check kobject_get_unless_zero(
118 struct kobject *kobj);
119extern void kobject_put(struct kobject *kobj);
120
121extern const void *kobject_namespace(struct kobject *kobj);
122extern char *kobject_get_path(struct kobject *kobj, gfp_t flag);
123
124struct kobj_type {
125 void (*release)(struct kobject *kobj);
126 const struct sysfs_ops *sysfs_ops;
127 struct attribute **default_attrs;
128 const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
129 const void *(*namespace)(struct kobject *kobj);
130 RH_KABI_RESERVE(1)
131 RH_KABI_RESERVE(2)
132 RH_KABI_RESERVE(3)
133 RH_KABI_RESERVE(4)
134};
135
136struct kobj_uevent_env {
137 char *argv[3];
138 char *envp[UEVENT_NUM_ENVP];
139 int envp_idx;
140 char buf[UEVENT_BUFFER_SIZE];
141 int buflen;
142};
143
144struct kset_uevent_ops {
145 int (* const filter)(struct kset *kset, struct kobject *kobj);
146 const char *(* const name)(struct kset *kset, struct kobject *kobj);
147 int (* const uevent)(struct kset *kset, struct kobject *kobj,
148 struct kobj_uevent_env *env);
149};
150
151struct kobj_attribute {
152 struct attribute attr;
153 ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
154 char *buf);
155 ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
156 const char *buf, size_t count);
157};
158
159extern const struct sysfs_ops kobj_sysfs_ops;
160
161struct sock;
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180struct kset {
181 struct list_head list;
182 spinlock_t list_lock;
183 struct kobject kobj;
184 const struct kset_uevent_ops *uevent_ops;
185 RH_KABI_RESERVE(1)
186 RH_KABI_RESERVE(2)
187 RH_KABI_RESERVE(3)
188 RH_KABI_RESERVE(4)
189} __randomize_layout;
190
191extern void kset_init(struct kset *kset);
192extern int __must_check kset_register(struct kset *kset);
193extern void kset_unregister(struct kset *kset);
194extern struct kset * __must_check kset_create_and_add(const char *name,
195 const struct kset_uevent_ops *u,
196 struct kobject *parent_kobj);
197
198static inline struct kset *to_kset(struct kobject *kobj)
199{
200 return kobj ? container_of(kobj, struct kset, kobj) : NULL;
201}
202
203static inline struct kset *kset_get(struct kset *k)
204{
205 return k ? to_kset(kobject_get(&k->kobj)) : NULL;
206}
207
208static inline void kset_put(struct kset *k)
209{
210 kobject_put(&k->kobj);
211}
212
213static inline struct kobj_type *get_ktype(struct kobject *kobj)
214{
215 return kobj->ktype;
216}
217
218extern struct kobject *kset_find_obj(struct kset *, const char *);
219
220
221extern struct kobject *kernel_kobj;
222
223extern struct kobject *mm_kobj;
224
225extern struct kobject *hypervisor_kobj;
226
227extern struct kobject *power_kobj;
228
229extern struct kobject *firmware_kobj;
230
231int kobject_uevent(struct kobject *kobj, enum kobject_action action);
232int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
233 char *envp[]);
234int kobject_synth_uevent(struct kobject *kobj, const char *buf, size_t count);
235
236__printf(2, 3)
237int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...);
238
239#endif
240