at v2.6.35 9.0 kB view raw
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 <asm/atomic.h> 20 21struct kobject; 22struct module; 23enum kobj_ns_type; 24 25/* FIXME 26 * The *owner field is no longer used. 27 * x86 tree has been cleaned up. The owner 28 * attribute is still left for other arches. 29 */ 30struct attribute { 31 const char *name; 32 struct module *owner; 33 mode_t mode; 34#ifdef CONFIG_DEBUG_LOCK_ALLOC 35 struct lock_class_key *key; 36 struct lock_class_key skey; 37#endif 38}; 39 40/** 41 * sysfs_attr_init - initialize a dynamically allocated sysfs attribute 42 * @attr: struct attribute to initialize 43 * 44 * Initialize a dynamically allocated struct attribute so we can 45 * make lockdep happy. This is a new requirement for attributes 46 * and initially this is only needed when lockdep is enabled. 47 * Lockdep gives a nice error when your attribute is added to 48 * sysfs if you don't have this. 49 */ 50#ifdef CONFIG_DEBUG_LOCK_ALLOC 51#define sysfs_attr_init(attr) \ 52do { \ 53 static struct lock_class_key __key; \ 54 \ 55 (attr)->key = &__key; \ 56} while(0) 57#else 58#define sysfs_attr_init(attr) do {} while(0) 59#endif 60 61struct attribute_group { 62 const char *name; 63 mode_t (*is_visible)(struct kobject *, 64 struct attribute *, int); 65 struct attribute **attrs; 66}; 67 68 69 70/** 71 * Use these macros to make defining attributes easier. See include/linux/device.h 72 * for examples.. 73 */ 74 75#define __ATTR(_name,_mode,_show,_store) { \ 76 .attr = {.name = __stringify(_name), .mode = _mode }, \ 77 .show = _show, \ 78 .store = _store, \ 79} 80 81#define __ATTR_RO(_name) { \ 82 .attr = { .name = __stringify(_name), .mode = 0444 }, \ 83 .show = _name##_show, \ 84} 85 86#define __ATTR_NULL { .attr = { .name = NULL } } 87 88#define attr_name(_attr) (_attr).attr.name 89 90struct file; 91struct vm_area_struct; 92 93struct bin_attribute { 94 struct attribute attr; 95 size_t size; 96 void *private; 97 ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *, 98 char *, loff_t, size_t); 99 ssize_t (*write)(struct file *,struct kobject *, struct bin_attribute *, 100 char *, loff_t, size_t); 101 int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr, 102 struct vm_area_struct *vma); 103}; 104 105/** 106 * sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute 107 * @attr: struct bin_attribute to initialize 108 * 109 * Initialize a dynamically allocated struct bin_attribute so we 110 * can make lockdep happy. This is a new requirement for 111 * attributes and initially this is only needed when lockdep is 112 * enabled. Lockdep gives a nice error when your attribute is 113 * added to sysfs if you don't have this. 114 */ 115#define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr) 116 117struct sysfs_ops { 118 ssize_t (*show)(struct kobject *, struct attribute *,char *); 119 ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t); 120}; 121 122struct sysfs_dirent; 123 124#ifdef CONFIG_SYSFS 125 126int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *), 127 void *data, struct module *owner); 128 129int __must_check sysfs_create_dir(struct kobject *kobj); 130void sysfs_remove_dir(struct kobject *kobj); 131int __must_check sysfs_rename_dir(struct kobject *kobj, const char *new_name); 132int __must_check sysfs_move_dir(struct kobject *kobj, 133 struct kobject *new_parent_kobj); 134 135int __must_check sysfs_create_file(struct kobject *kobj, 136 const struct attribute *attr); 137int __must_check sysfs_create_files(struct kobject *kobj, 138 const struct attribute **attr); 139int __must_check sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, 140 mode_t mode); 141void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr); 142void sysfs_remove_files(struct kobject *kobj, const struct attribute **attr); 143 144int __must_check sysfs_create_bin_file(struct kobject *kobj, 145 const struct bin_attribute *attr); 146void sysfs_remove_bin_file(struct kobject *kobj, 147 const struct bin_attribute *attr); 148 149int __must_check sysfs_create_link(struct kobject *kobj, struct kobject *target, 150 const char *name); 151int __must_check sysfs_create_link_nowarn(struct kobject *kobj, 152 struct kobject *target, 153 const char *name); 154void sysfs_remove_link(struct kobject *kobj, const char *name); 155 156int sysfs_rename_link(struct kobject *kobj, struct kobject *target, 157 const char *old_name, const char *new_name); 158 159void sysfs_delete_link(struct kobject *dir, struct kobject *targ, 160 const char *name); 161 162int __must_check sysfs_create_group(struct kobject *kobj, 163 const struct attribute_group *grp); 164int sysfs_update_group(struct kobject *kobj, 165 const struct attribute_group *grp); 166void sysfs_remove_group(struct kobject *kobj, 167 const struct attribute_group *grp); 168int sysfs_add_file_to_group(struct kobject *kobj, 169 const struct attribute *attr, const char *group); 170void sysfs_remove_file_from_group(struct kobject *kobj, 171 const struct attribute *attr, const char *group); 172 173void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr); 174void sysfs_notify_dirent(struct sysfs_dirent *sd); 175struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, 176 const void *ns, 177 const unsigned char *name); 178struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd); 179void sysfs_put(struct sysfs_dirent *sd); 180void sysfs_printk_last_file(void); 181 182/* Called to clear a ns tag when it is no longer valid */ 183void sysfs_exit_ns(enum kobj_ns_type type, const void *tag); 184 185int __must_check sysfs_init(void); 186 187#else /* CONFIG_SYSFS */ 188 189static inline int sysfs_schedule_callback(struct kobject *kobj, 190 void (*func)(void *), void *data, struct module *owner) 191{ 192 return -ENOSYS; 193} 194 195static inline int sysfs_create_dir(struct kobject *kobj) 196{ 197 return 0; 198} 199 200static inline void sysfs_remove_dir(struct kobject *kobj) 201{ 202} 203 204static inline int sysfs_rename_dir(struct kobject *kobj, const char *new_name) 205{ 206 return 0; 207} 208 209static inline int sysfs_move_dir(struct kobject *kobj, 210 struct kobject *new_parent_kobj) 211{ 212 return 0; 213} 214 215static inline int sysfs_create_file(struct kobject *kobj, 216 const struct attribute *attr) 217{ 218 return 0; 219} 220 221static inline int sysfs_create_files(struct kobject *kobj, 222 const struct attribute **attr) 223{ 224 return 0; 225} 226 227static inline int sysfs_chmod_file(struct kobject *kobj, 228 struct attribute *attr, mode_t mode) 229{ 230 return 0; 231} 232 233static inline void sysfs_remove_file(struct kobject *kobj, 234 const struct attribute *attr) 235{ 236} 237 238static inline void sysfs_remove_files(struct kobject *kobj, 239 const struct attribute **attr) 240{ 241} 242 243static inline int sysfs_create_bin_file(struct kobject *kobj, 244 const struct bin_attribute *attr) 245{ 246 return 0; 247} 248 249static inline void sysfs_remove_bin_file(struct kobject *kobj, 250 const struct bin_attribute *attr) 251{ 252} 253 254static inline int sysfs_create_link(struct kobject *kobj, 255 struct kobject *target, const char *name) 256{ 257 return 0; 258} 259 260static inline int sysfs_create_link_nowarn(struct kobject *kobj, 261 struct kobject *target, 262 const char *name) 263{ 264 return 0; 265} 266 267static inline void sysfs_remove_link(struct kobject *kobj, const char *name) 268{ 269} 270 271static inline int sysfs_rename_link(struct kobject *k, struct kobject *t, 272 const char *old_name, const char *new_name) 273{ 274 return 0; 275} 276 277static inline void sysfs_delete_link(struct kobject *k, struct kobject *t, 278 const char *name) 279{ 280} 281 282static inline int sysfs_create_group(struct kobject *kobj, 283 const struct attribute_group *grp) 284{ 285 return 0; 286} 287 288static inline int sysfs_update_group(struct kobject *kobj, 289 const struct attribute_group *grp) 290{ 291 return 0; 292} 293 294static inline void sysfs_remove_group(struct kobject *kobj, 295 const struct attribute_group *grp) 296{ 297} 298 299static inline int sysfs_add_file_to_group(struct kobject *kobj, 300 const struct attribute *attr, const char *group) 301{ 302 return 0; 303} 304 305static inline void sysfs_remove_file_from_group(struct kobject *kobj, 306 const struct attribute *attr, const char *group) 307{ 308} 309 310static inline void sysfs_notify(struct kobject *kobj, const char *dir, 311 const char *attr) 312{ 313} 314static inline void sysfs_notify_dirent(struct sysfs_dirent *sd) 315{ 316} 317static inline 318struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, 319 const void *ns, 320 const unsigned char *name) 321{ 322 return NULL; 323} 324static inline struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd) 325{ 326 return NULL; 327} 328static inline void sysfs_put(struct sysfs_dirent *sd) 329{ 330} 331 332static inline void sysfs_exit_ns(int type, const void *tag) 333{ 334} 335 336static inline int __must_check sysfs_init(void) 337{ 338 return 0; 339} 340 341static inline void sysfs_printk_last_file(void) 342{ 343} 344 345#endif /* CONFIG_SYSFS */ 346 347#endif /* _SYSFS_H_ */