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