xref: /linux-6.15/include/linux/sysfs.h (revision 4f6db5ef)
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 <[email protected]>
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 	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 	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 	return sysfs_get_dirent_ns(parent_sd, name, NULL);
468 }
469 
470 #endif /* _SYSFS_H_ */
471