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