Branch data Line data Source code
1 : : /*
2 : : * sysfs.h - definitions for the device driver filesystem
3 : : *
4 : : * Copyright (c) 2001,2002 Patrick Mochel
5 : : * Copyright (c) 2004 Silicon Graphics, Inc.
6 : : * Copyright (c) 2007 SUSE Linux Products GmbH
7 : : * Copyright (c) 2007 Tejun Heo <teheo@suse.de>
8 : : *
9 : : * Please see Documentation/filesystems/sysfs.txt for more information.
10 : : */
11 : :
12 : : #ifndef _SYSFS_H_
13 : : #define _SYSFS_H_
14 : :
15 : : #include <linux/kernfs.h>
16 : : #include <linux/compiler.h>
17 : : #include <linux/errno.h>
18 : : #include <linux/list.h>
19 : : #include <linux/lockdep.h>
20 : : #include <linux/kobject_ns.h>
21 : : #include <linux/stat.h>
22 : : #include <linux/atomic.h>
23 : :
24 : : struct kobject;
25 : : struct module;
26 : : struct bin_attribute;
27 : : enum kobj_ns_type;
28 : :
29 : : struct attribute {
30 : : const char *name;
31 : : umode_t mode;
32 : : #ifdef CONFIG_DEBUG_LOCK_ALLOC
33 : : bool ignore_lockdep:1;
34 : : struct lock_class_key *key;
35 : : struct lock_class_key skey;
36 : : #endif
37 : : };
38 : :
39 : : /**
40 : : * sysfs_attr_init - initialize a dynamically allocated sysfs attribute
41 : : * @attr: struct attribute to initialize
42 : : *
43 : : * Initialize a dynamically allocated struct attribute so we can
44 : : * make lockdep happy. This is a new requirement for attributes
45 : : * and initially this is only needed when lockdep is enabled.
46 : : * Lockdep gives a nice error when your attribute is added to
47 : : * sysfs if you don't have this.
48 : : */
49 : : #ifdef CONFIG_DEBUG_LOCK_ALLOC
50 : : #define sysfs_attr_init(attr) \
51 : : do { \
52 : : static struct lock_class_key __key; \
53 : : \
54 : : (attr)->key = &__key; \
55 : : } while (0)
56 : : #else
57 : : #define sysfs_attr_init(attr) do {} while (0)
58 : : #endif
59 : :
60 : : struct attribute_group {
61 : : const char *name;
62 : : umode_t (*is_visible)(struct kobject *,
63 : : struct attribute *, int);
64 : : struct attribute **attrs;
65 : : struct bin_attribute **bin_attrs;
66 : : };
67 : :
68 : : /**
69 : : * Use these macros to make defining attributes easier. See include/linux/device.h
70 : : * for examples..
71 : : */
72 : :
73 : : #define __ATTR(_name, _mode, _show, _store) { \
74 : : .attr = {.name = __stringify(_name), .mode = _mode }, \
75 : : .show = _show, \
76 : : .store = _store, \
77 : : }
78 : :
79 : : #define __ATTR_RO(_name) { \
80 : : .attr = { .name = __stringify(_name), .mode = S_IRUGO }, \
81 : : .show = _name##_show, \
82 : : }
83 : :
84 : : #define __ATTR_WO(_name) { \
85 : : .attr = { .name = __stringify(_name), .mode = S_IWUSR }, \
86 : : .store = _name##_store, \
87 : : }
88 : :
89 : : #define __ATTR_RW(_name) __ATTR(_name, (S_IWUSR | S_IRUGO), \
90 : : _name##_show, _name##_store)
91 : :
92 : : #define __ATTR_NULL { .attr = { .name = NULL } }
93 : :
94 : : #ifdef CONFIG_DEBUG_LOCK_ALLOC
95 : : #define __ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) { \
96 : : .attr = {.name = __stringify(_name), .mode = _mode, \
97 : : .ignore_lockdep = true }, \
98 : : .show = _show, \
99 : : .store = _store, \
100 : : }
101 : : #else
102 : : #define __ATTR_IGNORE_LOCKDEP __ATTR
103 : : #endif
104 : :
105 : : #define __ATTRIBUTE_GROUPS(_name) \
106 : : static const struct attribute_group *_name##_groups[] = { \
107 : : &_name##_group, \
108 : : NULL, \
109 : : }
110 : :
111 : : #define ATTRIBUTE_GROUPS(_name) \
112 : : static const struct attribute_group _name##_group = { \
113 : : .attrs = _name##_attrs, \
114 : : }; \
115 : : __ATTRIBUTE_GROUPS(_name)
116 : :
117 : : struct file;
118 : : struct vm_area_struct;
119 : :
120 : : struct bin_attribute {
121 : : struct attribute attr;
122 : : size_t size;
123 : : void *private;
124 : : ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *,
125 : : char *, loff_t, size_t);
126 : : ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *,
127 : : char *, loff_t, size_t);
128 : : int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr,
129 : : struct vm_area_struct *vma);
130 : : };
131 : :
132 : : /**
133 : : * sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute
134 : : * @attr: struct bin_attribute to initialize
135 : : *
136 : : * Initialize a dynamically allocated struct bin_attribute so we
137 : : * can make lockdep happy. This is a new requirement for
138 : : * attributes and initially this is only needed when lockdep is
139 : : * enabled. Lockdep gives a nice error when your attribute is
140 : : * added to sysfs if you don't have this.
141 : : */
142 : : #define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr)
143 : :
144 : : /* macros to create static binary attributes easier */
145 : : #define __BIN_ATTR(_name, _mode, _read, _write, _size) { \
146 : : .attr = { .name = __stringify(_name), .mode = _mode }, \
147 : : .read = _read, \
148 : : .write = _write, \
149 : : .size = _size, \
150 : : }
151 : :
152 : : #define __BIN_ATTR_RO(_name, _size) { \
153 : : .attr = { .name = __stringify(_name), .mode = S_IRUGO }, \
154 : : .read = _name##_read, \
155 : : .size = _size, \
156 : : }
157 : :
158 : : #define __BIN_ATTR_RW(_name, _size) __BIN_ATTR(_name, \
159 : : (S_IWUSR | S_IRUGO), _name##_read, \
160 : : _name##_write, _size)
161 : :
162 : : #define __BIN_ATTR_NULL __ATTR_NULL
163 : :
164 : : #define BIN_ATTR(_name, _mode, _read, _write, _size) \
165 : : struct bin_attribute bin_attr_##_name = __BIN_ATTR(_name, _mode, _read, \
166 : : _write, _size)
167 : :
168 : : #define BIN_ATTR_RO(_name, _size) \
169 : : struct bin_attribute bin_attr_##_name = __BIN_ATTR_RO(_name, _size)
170 : :
171 : : #define BIN_ATTR_RW(_name, _size) \
172 : : struct bin_attribute bin_attr_##_name = __BIN_ATTR_RW(_name, _size)
173 : :
174 : : struct sysfs_ops {
175 : : ssize_t (*show)(struct kobject *, struct attribute *, char *);
176 : : ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t);
177 : : };
178 : :
179 : : #ifdef CONFIG_SYSFS
180 : :
181 : : int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *),
182 : : void *data, struct module *owner);
183 : :
184 : : int __must_check sysfs_create_dir_ns(struct kobject *kobj, const void *ns);
185 : : void sysfs_remove_dir(struct kobject *kobj);
186 : : int __must_check sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name,
187 : : const void *new_ns);
188 : : int __must_check sysfs_move_dir_ns(struct kobject *kobj,
189 : : struct kobject *new_parent_kobj,
190 : : const void *new_ns);
191 : :
192 : : int __must_check sysfs_create_file_ns(struct kobject *kobj,
193 : : const struct attribute *attr,
194 : : const void *ns);
195 : : int __must_check sysfs_create_files(struct kobject *kobj,
196 : : const struct attribute **attr);
197 : : int __must_check sysfs_chmod_file(struct kobject *kobj,
198 : : const struct attribute *attr, umode_t mode);
199 : : void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
200 : : const void *ns);
201 : : void sysfs_remove_files(struct kobject *kobj, const struct attribute **attr);
202 : :
203 : : int __must_check sysfs_create_bin_file(struct kobject *kobj,
204 : : const struct bin_attribute *attr);
205 : : void sysfs_remove_bin_file(struct kobject *kobj,
206 : : const struct bin_attribute *attr);
207 : :
208 : : int __must_check sysfs_create_link(struct kobject *kobj, struct kobject *target,
209 : : const char *name);
210 : : int __must_check sysfs_create_link_nowarn(struct kobject *kobj,
211 : : struct kobject *target,
212 : : const char *name);
213 : : void sysfs_remove_link(struct kobject *kobj, const char *name);
214 : :
215 : : int sysfs_rename_link_ns(struct kobject *kobj, struct kobject *target,
216 : : const char *old_name, const char *new_name,
217 : : const void *new_ns);
218 : :
219 : : void sysfs_delete_link(struct kobject *dir, struct kobject *targ,
220 : : const char *name);
221 : :
222 : : int __must_check sysfs_create_group(struct kobject *kobj,
223 : : const struct attribute_group *grp);
224 : : int __must_check sysfs_create_groups(struct kobject *kobj,
225 : : const struct attribute_group **groups);
226 : : int sysfs_update_group(struct kobject *kobj,
227 : : const struct attribute_group *grp);
228 : : void sysfs_remove_group(struct kobject *kobj,
229 : : const struct attribute_group *grp);
230 : : void sysfs_remove_groups(struct kobject *kobj,
231 : : const struct attribute_group **groups);
232 : : int sysfs_add_file_to_group(struct kobject *kobj,
233 : : const struct attribute *attr, const char *group);
234 : : void sysfs_remove_file_from_group(struct kobject *kobj,
235 : : const struct attribute *attr, const char *group);
236 : : int sysfs_merge_group(struct kobject *kobj,
237 : : const struct attribute_group *grp);
238 : : void sysfs_unmerge_group(struct kobject *kobj,
239 : : const struct attribute_group *grp);
240 : : int sysfs_add_link_to_group(struct kobject *kobj, const char *group_name,
241 : : struct kobject *target, const char *link_name);
242 : : void sysfs_remove_link_from_group(struct kobject *kobj, const char *group_name,
243 : : const char *link_name);
244 : :
245 : : void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);
246 : :
247 : : int __must_check sysfs_init(void);
248 : :
249 : : #else /* CONFIG_SYSFS */
250 : :
251 : : static inline int sysfs_schedule_callback(struct kobject *kobj,
252 : : void (*func)(void *), void *data, struct module *owner)
253 : : {
254 : : return -ENOSYS;
255 : : }
256 : :
257 : : static inline int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
258 : : {
259 : : return 0;
260 : : }
261 : :
262 : : static inline void sysfs_remove_dir(struct kobject *kobj)
263 : : {
264 : : }
265 : :
266 : : static inline int sysfs_rename_dir_ns(struct kobject *kobj,
267 : : const char *new_name, const void *new_ns)
268 : : {
269 : : return 0;
270 : : }
271 : :
272 : : static inline int sysfs_move_dir_ns(struct kobject *kobj,
273 : : struct kobject *new_parent_kobj,
274 : : const void *new_ns)
275 : : {
276 : : return 0;
277 : : }
278 : :
279 : : static inline int sysfs_create_file_ns(struct kobject *kobj,
280 : : const struct attribute *attr,
281 : : const void *ns)
282 : : {
283 : : return 0;
284 : : }
285 : :
286 : : static inline int sysfs_create_files(struct kobject *kobj,
287 : : const struct attribute **attr)
288 : : {
289 : : return 0;
290 : : }
291 : :
292 : : static inline int sysfs_chmod_file(struct kobject *kobj,
293 : : const struct attribute *attr, umode_t mode)
294 : : {
295 : : return 0;
296 : : }
297 : :
298 : : static inline void sysfs_remove_file_ns(struct kobject *kobj,
299 : : const struct attribute *attr,
300 : : const void *ns)
301 : : {
302 : : }
303 : :
304 : : static inline void sysfs_remove_files(struct kobject *kobj,
305 : : const struct attribute **attr)
306 : : {
307 : : }
308 : :
309 : : static inline int sysfs_create_bin_file(struct kobject *kobj,
310 : : const struct bin_attribute *attr)
311 : : {
312 : : return 0;
313 : : }
314 : :
315 : : static inline void sysfs_remove_bin_file(struct kobject *kobj,
316 : : const struct bin_attribute *attr)
317 : : {
318 : : }
319 : :
320 : : static inline int sysfs_create_link(struct kobject *kobj,
321 : : struct kobject *target, const char *name)
322 : : {
323 : : return 0;
324 : : }
325 : :
326 : : static inline int sysfs_create_link_nowarn(struct kobject *kobj,
327 : : struct kobject *target,
328 : : const char *name)
329 : : {
330 : : return 0;
331 : : }
332 : :
333 : : static inline void sysfs_remove_link(struct kobject *kobj, const char *name)
334 : : {
335 : : }
336 : :
337 : : static inline int sysfs_rename_link_ns(struct kobject *k, struct kobject *t,
338 : : const char *old_name,
339 : : const char *new_name, const void *ns)
340 : : {
341 : : return 0;
342 : : }
343 : :
344 : : static inline void sysfs_delete_link(struct kobject *k, struct kobject *t,
345 : : const char *name)
346 : : {
347 : : }
348 : :
349 : : static inline int sysfs_create_group(struct kobject *kobj,
350 : : const struct attribute_group *grp)
351 : : {
352 : : return 0;
353 : : }
354 : :
355 : : static inline int sysfs_create_groups(struct kobject *kobj,
356 : : const struct attribute_group **groups)
357 : : {
358 : : return 0;
359 : : }
360 : :
361 : : static inline int sysfs_update_group(struct kobject *kobj,
362 : : const struct attribute_group *grp)
363 : : {
364 : : return 0;
365 : : }
366 : :
367 : : static inline void sysfs_remove_group(struct kobject *kobj,
368 : : const struct attribute_group *grp)
369 : : {
370 : : }
371 : :
372 : : static inline void sysfs_remove_groups(struct kobject *kobj,
373 : : const struct attribute_group **groups)
374 : : {
375 : : }
376 : :
377 : : static inline int sysfs_add_file_to_group(struct kobject *kobj,
378 : : const struct attribute *attr, const char *group)
379 : : {
380 : : return 0;
381 : : }
382 : :
383 : : static inline void sysfs_remove_file_from_group(struct kobject *kobj,
384 : : const struct attribute *attr, const char *group)
385 : : {
386 : : }
387 : :
388 : : static inline int sysfs_merge_group(struct kobject *kobj,
389 : : const struct attribute_group *grp)
390 : : {
391 : : return 0;
392 : : }
393 : :
394 : : static inline void sysfs_unmerge_group(struct kobject *kobj,
395 : : const struct attribute_group *grp)
396 : : {
397 : : }
398 : :
399 : : static inline int sysfs_add_link_to_group(struct kobject *kobj,
400 : : const char *group_name, struct kobject *target,
401 : : const char *link_name)
402 : : {
403 : : return 0;
404 : : }
405 : :
406 : : static inline void sysfs_remove_link_from_group(struct kobject *kobj,
407 : : const char *group_name, const char *link_name)
408 : : {
409 : : }
410 : :
411 : : static inline void sysfs_notify(struct kobject *kobj, const char *dir,
412 : : const char *attr)
413 : : {
414 : : }
415 : :
416 : : static inline int __must_check sysfs_init(void)
417 : : {
418 : : return 0;
419 : : }
420 : :
421 : : #endif /* CONFIG_SYSFS */
422 : :
423 : : static inline int __must_check sysfs_create_file(struct kobject *kobj,
424 : : const struct attribute *attr)
425 : : {
426 : 288 : return sysfs_create_file_ns(kobj, attr, NULL);
427 : : }
428 : :
429 : : static inline void sysfs_remove_file(struct kobject *kobj,
430 : : const struct attribute *attr)
431 : : {
432 : 40 : return sysfs_remove_file_ns(kobj, attr, NULL);
433 : : }
434 : :
435 : : static inline int sysfs_rename_link(struct kobject *kobj, struct kobject *target,
436 : : const char *old_name, const char *new_name)
437 : : {
438 : : return sysfs_rename_link_ns(kobj, target, old_name, new_name, NULL);
439 : : }
440 : :
441 : : static inline void sysfs_notify_dirent(struct kernfs_node *kn)
442 : : {
443 : : kernfs_notify(kn);
444 : : }
445 : :
446 : : static inline struct kernfs_node *sysfs_get_dirent(struct kernfs_node *parent,
447 : : const unsigned char *name)
448 : : {
449 : : return kernfs_find_and_get(parent, name);
450 : : }
451 : :
452 : : static inline struct kernfs_node *sysfs_get(struct kernfs_node *kn)
453 : : {
454 : 133 : kernfs_get(kn);
455 : : return kn;
456 : : }
457 : :
458 : : static inline void sysfs_put(struct kernfs_node *kn)
459 : : {
460 : 21 : kernfs_put(kn);
461 : : }
462 : :
463 : : #endif /* _SYSFS_H_ */
|