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);
 184int sysfs_add_link_to_group(struct kobject *kobj, const char *group_name,
 185                            struct kobject *target, const char *link_name);
 186void sysfs_remove_link_from_group(struct kobject *kobj, const char *group_name,
 187                                  const char *link_name);
 188
 189void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);
 190void sysfs_notify_dirent(struct sysfs_dirent *sd);
 191struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
 192                                      const void *ns,
 193                                      const unsigned char *name);
 194struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd);
 195void sysfs_put(struct sysfs_dirent *sd);
 196
 197int __must_check sysfs_init(void);
 198
 199#else /* CONFIG_SYSFS */
 200
 201static inline int sysfs_schedule_callback(struct kobject *kobj,
 202                void (*func)(void *), void *data, struct module *owner)
 203{
 204        return -ENOSYS;
 205}
 206
 207static inline int sysfs_create_dir(struct kobject *kobj)
 208{
 209        return 0;
 210}
 211
 212static inline void sysfs_remove_dir(struct kobject *kobj)
 213{
 214}
 215
 216static inline int sysfs_rename_dir(struct kobject *kobj, const char *new_name)
 217{
 218        return 0;
 219}
 220
 221static inline int sysfs_move_dir(struct kobject *kobj,
 222                                 struct kobject *new_parent_kobj)
 223{
 224        return 0;
 225}
 226
 227static inline int sysfs_create_file(struct kobject *kobj,
 228                                    const struct attribute *attr)
 229{
 230        return 0;
 231}
 232
 233static inline int sysfs_create_files(struct kobject *kobj,
 234                                    const struct attribute **attr)
 235{
 236        return 0;
 237}
 238
 239static inline int sysfs_chmod_file(struct kobject *kobj,
 240                                   const struct attribute *attr, umode_t mode)
 241{
 242        return 0;
 243}
 244
 245static inline void sysfs_remove_file(struct kobject *kobj,
 246                                     const struct attribute *attr)
 247{
 248}
 249
 250static inline void sysfs_remove_files(struct kobject *kobj,
 251                                     const struct attribute **attr)
 252{
 253}
 254
 255static inline int sysfs_create_bin_file(struct kobject *kobj,
 256                                        const struct bin_attribute *attr)
 257{
 258        return 0;
 259}
 260
 261static inline void sysfs_remove_bin_file(struct kobject *kobj,
 262                                         const struct bin_attribute *attr)
 263{
 264}
 265
 266static inline int sysfs_create_link(struct kobject *kobj,
 267                                    struct kobject *target, const char *name)
 268{
 269        return 0;
 270}
 271
 272static inline int sysfs_create_link_nowarn(struct kobject *kobj,
 273                                           struct kobject *target,
 274                                           const char *name)
 275{
 276        return 0;
 277}
 278
 279static inline void sysfs_remove_link(struct kobject *kobj, const char *name)
 280{
 281}
 282
 283static inline int sysfs_rename_link(struct kobject *k, struct kobject *t,
 284                                    const char *old_name, const char *new_name)
 285{
 286        return 0;
 287}
 288
 289static inline void sysfs_delete_link(struct kobject *k, struct kobject *t,
 290                                     const char *name)
 291{
 292}
 293
 294static inline int sysfs_create_group(struct kobject *kobj,
 295                                     const struct attribute_group *grp)
 296{
 297        return 0;
 298}
 299
 300static inline int sysfs_update_group(struct kobject *kobj,
 301                                const struct attribute_group *grp)
 302{
 303        return 0;
 304}
 305
 306static inline void sysfs_remove_group(struct kobject *kobj,
 307                                      const struct attribute_group *grp)
 308{
 309}
 310
 311static inline int sysfs_add_file_to_group(struct kobject *kobj,
 312                const struct attribute *attr, const char *group)
 313{
 314        return 0;
 315}
 316
 317static inline void sysfs_remove_file_from_group(struct kobject *kobj,
 318                const struct attribute *attr, const char *group)
 319{
 320}
 321
 322static inline int sysfs_merge_group(struct kobject *kobj,
 323                       const struct attribute_group *grp)
 324{
 325        return 0;
 326}
 327
 328static inline void sysfs_unmerge_group(struct kobject *kobj,
 329                       const struct attribute_group *grp)
 330{
 331}
 332
 333static inline int sysfs_add_link_to_group(struct kobject *kobj,
 334                const char *group_name, struct kobject *target,
 335                const char *link_name)
 336{
 337        return 0;
 338}
 339
 340static inline void sysfs_remove_link_from_group(struct kobject *kobj,
 341                const char *group_name, const char *link_name)
 342{
 343}
 344
 345static inline void sysfs_notify(struct kobject *kobj, const char *dir,
 346                                const char *attr)
 347{
 348}
 349static inline void sysfs_notify_dirent(struct sysfs_dirent *sd)
 350{
 351}
 352static inline
 353struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
 354                                      const void *ns,
 355                                      const unsigned char *name)
 356{
 357        return NULL;
 358}
 359static inline struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd)
 360{
 361        return NULL;
 362}
 363static inline void sysfs_put(struct sysfs_dirent *sd)
 364{
 365}
 366
 367static inline int __must_check sysfs_init(void)
 368{
 369        return 0;
 370}
 371
 372#endif /* CONFIG_SYSFS */
 373
 374#endif /* _SYSFS_H_ */
 375