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 <asm/atomic.h> 20 21 struct kobject; 22 struct module; 23 enum 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 */ 30 struct 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) \ 52 do { \ 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 61 struct 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 90 struct file; 91 struct vm_area_struct; 92 93 struct 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 117 struct 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 122 struct sysfs_dirent; 123 124 #ifdef CONFIG_SYSFS 125 126 int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *), 127 void *data, struct module *owner); 128 129 int __must_check sysfs_create_dir(struct kobject *kobj); 130 void sysfs_remove_dir(struct kobject *kobj); 131 int __must_check sysfs_rename_dir(struct kobject *kobj, const char *new_name); 132 int __must_check sysfs_move_dir(struct kobject *kobj, 133 struct kobject *new_parent_kobj); 134 135 int __must_check sysfs_create_file(struct kobject *kobj, 136 const struct attribute *attr); 137 int __must_check sysfs_create_files(struct kobject *kobj, 138 const struct attribute **attr); 139 int __must_check sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, 140 mode_t mode); 141 void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr); 142 void sysfs_remove_files(struct kobject *kobj, const struct attribute **attr); 143 144 int __must_check sysfs_create_bin_file(struct kobject *kobj, 145 const struct bin_attribute *attr); 146 void sysfs_remove_bin_file(struct kobject *kobj, 147 const struct bin_attribute *attr); 148 149 int __must_check sysfs_create_link(struct kobject *kobj, struct kobject *target, 150 const char *name); 151 int __must_check sysfs_create_link_nowarn(struct kobject *kobj, 152 struct kobject *target, 153 const char *name); 154 void sysfs_remove_link(struct kobject *kobj, const char *name); 155 156 int sysfs_rename_link(struct kobject *kobj, struct kobject *target, 157 const char *old_name, const char *new_name); 158 159 void sysfs_delete_link(struct kobject *dir, struct kobject *targ, 160 const char *name); 161 162 int __must_check sysfs_create_group(struct kobject *kobj, 163 const struct attribute_group *grp); 164 int sysfs_update_group(struct kobject *kobj, 165 const struct attribute_group *grp); 166 void sysfs_remove_group(struct kobject *kobj, 167 const struct attribute_group *grp); 168 int sysfs_add_file_to_group(struct kobject *kobj, 169 const struct attribute *attr, const char *group); 170 void sysfs_remove_file_from_group(struct kobject *kobj, 171 const struct attribute *attr, const char *group); 172 173 void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr); 174 void sysfs_notify_dirent(struct sysfs_dirent *sd); 175 struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, 176 const void *ns, 177 const unsigned char *name); 178 struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd); 179 void sysfs_put(struct sysfs_dirent *sd); 180 void sysfs_printk_last_file(void); 181 182 /* Called to clear a ns tag when it is no longer valid */ 183 void sysfs_exit_ns(enum kobj_ns_type type, const void *tag); 184 185 int __must_check sysfs_init(void); 186 187 #else /* CONFIG_SYSFS */ 188 189 static inline int sysfs_schedule_callback(struct kobject *kobj, 190 void (*func)(void *), void *data, struct module *owner) 191 { 192 return -ENOSYS; 193 } 194 195 static inline int sysfs_create_dir(struct kobject *kobj) 196 { 197 return 0; 198 } 199 200 static inline void sysfs_remove_dir(struct kobject *kobj) 201 { 202 } 203 204 static inline int sysfs_rename_dir(struct kobject *kobj, const char *new_name) 205 { 206 return 0; 207 } 208 209 static inline int sysfs_move_dir(struct kobject *kobj, 210 struct kobject *new_parent_kobj) 211 { 212 return 0; 213 } 214 215 static inline int sysfs_create_file(struct kobject *kobj, 216 const struct attribute *attr) 217 { 218 return 0; 219 } 220 221 static inline int sysfs_create_files(struct kobject *kobj, 222 const struct attribute **attr) 223 { 224 return 0; 225 } 226 227 static inline int sysfs_chmod_file(struct kobject *kobj, 228 struct attribute *attr, mode_t mode) 229 { 230 return 0; 231 } 232 233 static inline void sysfs_remove_file(struct kobject *kobj, 234 const struct attribute *attr) 235 { 236 } 237 238 static inline void sysfs_remove_files(struct kobject *kobj, 239 const struct attribute **attr) 240 { 241 } 242 243 static inline int sysfs_create_bin_file(struct kobject *kobj, 244 const struct bin_attribute *attr) 245 { 246 return 0; 247 } 248 249 static inline void sysfs_remove_bin_file(struct kobject *kobj, 250 const struct bin_attribute *attr) 251 { 252 } 253 254 static inline int sysfs_create_link(struct kobject *kobj, 255 struct kobject *target, const char *name) 256 { 257 return 0; 258 } 259 260 static inline int sysfs_create_link_nowarn(struct kobject *kobj, 261 struct kobject *target, 262 const char *name) 263 { 264 return 0; 265 } 266 267 static inline void sysfs_remove_link(struct kobject *kobj, const char *name) 268 { 269 } 270 271 static 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 277 static inline void sysfs_delete_link(struct kobject *k, struct kobject *t, 278 const char *name) 279 { 280 } 281 282 static inline int sysfs_create_group(struct kobject *kobj, 283 const struct attribute_group *grp) 284 { 285 return 0; 286 } 287 288 static inline int sysfs_update_group(struct kobject *kobj, 289 const struct attribute_group *grp) 290 { 291 return 0; 292 } 293 294 static inline void sysfs_remove_group(struct kobject *kobj, 295 const struct attribute_group *grp) 296 { 297 } 298 299 static inline int sysfs_add_file_to_group(struct kobject *kobj, 300 const struct attribute *attr, const char *group) 301 { 302 return 0; 303 } 304 305 static inline void sysfs_remove_file_from_group(struct kobject *kobj, 306 const struct attribute *attr, const char *group) 307 { 308 } 309 310 static inline void sysfs_notify(struct kobject *kobj, const char *dir, 311 const char *attr) 312 { 313 } 314 static inline void sysfs_notify_dirent(struct sysfs_dirent *sd) 315 { 316 } 317 static inline 318 struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, 319 const void *ns, 320 const unsigned char *name) 321 { 322 return NULL; 323 } 324 static inline struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd) 325 { 326 return NULL; 327 } 328 static inline void sysfs_put(struct sysfs_dirent *sd) 329 { 330 } 331 332 static inline void sysfs_exit_ns(int type, const void *tag) 333 { 334 } 335 336 static inline int __must_check sysfs_init(void) 337 { 338 return 0; 339 } 340 341 static inline void sysfs_printk_last_file(void) 342 { 343 } 344 345 #endif /* CONFIG_SYSFS */ 346 347 #endif /* _SYSFS_H_ */ 348