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/kernfs.h>
  16#include <linux/compiler.h>
  17#include <linux/errno.h>
  18#include <linux/list.h>
  19#include <linux/lockdep.h>
  20#include <linux/kobject_ns.h>
  21#include <linux/stat.h>
  22#include <linux/atomic.h>
  23
  24struct kobject;
  25struct module;
  26struct bin_attribute;
  27enum kobj_ns_type;
  28
  29struct attribute {
  30        const char              *name;
  31        umode_t                 mode;
  32#ifdef CONFIG_DEBUG_LOCK_ALLOC
  33        bool                    ignore_lockdep:1;
  34        struct lock_class_key   *key;
  35        struct lock_class_key   skey;
  36#endif
  37};
  38
  39/**
  40 *      sysfs_attr_init - initialize a dynamically allocated sysfs attribute
  41 *      @attr: struct attribute to initialize
  42 *
  43 *      Initialize a dynamically allocated struct attribute so we can
  44 *      make lockdep happy.  This is a new requirement for attributes
  45 *      and initially this is only needed when lockdep is enabled.
  46 *      Lockdep gives a nice error when your attribute is added to
  47 *      sysfs if you don't have this.
  48 */
  49#ifdef CONFIG_DEBUG_LOCK_ALLOC
  50#define sysfs_attr_init(attr)                           \
  51do {                                                    \
  52        static struct lock_class_key __key;             \
  53                                                        \
  54        (attr)->key = &__key;                           \
  55} while (0)
  56#else
  57#define sysfs_attr_init(attr) do {} while (0)
  58#endif
  59
  60struct attribute_group {
  61        const char              *name;
  62        umode_t                 (*is_visible)(struct kobject *,
  63                                              struct attribute *, int);
  64        struct attribute        **attrs;
  65        struct bin_attribute    **bin_attrs;
  66};
  67
  68/**
  69 * Use these macros to make defining attributes easier. See include/linux/device.h
  70 * for examples..
  71 */
  72
  73#define __ATTR(_name, _mode, _show, _store) {                           \
  74        .attr = {.name = __stringify(_name),                            \
  75                 .mode = VERIFY_OCTAL_PERMISSIONS(_mode) },             \
  76        .show   = _show,                                                \
  77        .store  = _store,                                               \
  78}
  79
  80#define __ATTR_RO(_name) {                                              \
  81        .attr   = { .name = __stringify(_name), .mode = S_IRUGO },      \
  82        .show   = _name##_show,                                         \
  83}
  84
  85#define __ATTR_WO(_name) {                                              \
  86        .attr   = { .name = __stringify(_name), .mode = S_IWUSR },      \
  87        .store  = _name##_store,                                        \
  88}
  89
  90#define __ATTR_RW(_name) __ATTR(_name, (S_IWUSR | S_IRUGO),             \
  91                         _name##_show, _name##_store)
  92
  93#define __ATTR_NULL { .attr = { .name = NULL } }
  94
  95#ifdef CONFIG_DEBUG_LOCK_ALLOC
  96#define __ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) {    \
  97        .attr = {.name = __stringify(_name), .mode = _mode,     \
  98                        .ignore_lockdep = true },               \
  99        .show           = _show,                                \
 100        .store          = _store,                               \
 101}
 102#else
 103#define __ATTR_IGNORE_LOCKDEP   __ATTR
 104#endif
 105
 106#define __ATTRIBUTE_GROUPS(_name)                               \
 107static const struct attribute_group *_name##_groups[] = {       \
 108        &_name##_group,                                         \
 109        NULL,                                                   \
 110}
 111
 112#define ATTRIBUTE_GROUPS(_name)                                 \
 113static const struct attribute_group _name##_group = {           \
 114        .attrs = _name##_attrs,                                 \
 115};                                                              \
 116__ATTRIBUTE_GROUPS(_name)
 117
 118struct file;
 119struct vm_area_struct;
 120
 121struct bin_attribute {
 122        struct attribute        attr;
 123        size_t                  size;
 124        void                    *private;
 125        ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *,
 126                        char *, loff_t, size_t);
 127        ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *,
 128                         char *, loff_t, size_t);
 129        int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr,
 130                    struct vm_area_struct *vma);
 131};
 132
 133/**
 134 *      sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute
 135 *      @attr: struct bin_attribute to initialize
 136 *
 137 *      Initialize a dynamically allocated struct bin_attribute so we
 138 *      can make lockdep happy.  This is a new requirement for
 139 *      attributes and initially this is only needed when lockdep is
 140 *      enabled.  Lockdep gives a nice error when your attribute is
 141 *      added to sysfs if you don't have this.
 142 */
 143#define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr)
 144
 145/* macros to create static binary attributes easier */
 146#define __BIN_ATTR(_name, _mode, _read, _write, _size) {                \
 147        .attr = { .name = __stringify(_name), .mode = _mode },          \
 148        .read   = _read,                                                \
 149        .write  = _write,                                               \
 150        .size   = _size,                                                \
 151}
 152
 153#define __BIN_ATTR_RO(_name, _size) {                                   \
 154        .attr   = { .name = __stringify(_name), .mode = S_IRUGO },      \
 155        .read   = _name##_read,                                         \
 156        .size   = _size,                                                \
 157}
 158
 159#define __BIN_ATTR_RW(_name, _size) __BIN_ATTR(_name,                   \
 160                                   (S_IWUSR | S_IRUGO), _name##_read,   \
 161                                   _name##_write, _size)
 162
 163#define __BIN_ATTR_NULL __ATTR_NULL
 164
 165#define BIN_ATTR(_name, _mode, _read, _write, _size)                    \
 166struct bin_attribute bin_attr_##_name = __BIN_ATTR(_name, _mode, _read, \
 167                                        _write, _size)
 168
 169#define BIN_ATTR_RO(_name, _size)                                       \
 170struct bin_attribute bin_attr_##_name = __BIN_ATTR_RO(_name, _size)
 171
 172#define BIN_ATTR_RW(_name, _size)                                       \
 173struct bin_attribute bin_attr_##_name = __BIN_ATTR_RW(_name, _size)
 174
 175struct sysfs_ops {
 176        ssize_t (*show)(struct kobject *, struct attribute *, char *);
 177        ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t);
 178};
 179
 180#ifdef CONFIG_SYSFS
 181
 182int __must_check sysfs_create_dir_ns(struct kobject *kobj, const void *ns);
 183void sysfs_remove_dir(struct kobject *kobj);
 184int __must_check sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name,
 185                                     const void *new_ns);
 186int __must_check sysfs_move_dir_ns(struct kobject *kobj,
 187                                   struct kobject *new_parent_kobj,
 188                                   const void *new_ns);
 189
 190int __must_check sysfs_create_file_ns(struct kobject *kobj,
 191                                      const struct attribute *attr,
 192                                      const void *ns);
 193int __must_check sysfs_create_files(struct kobject *kobj,
 194                                   const struct attribute **attr);
 195int __must_check sysfs_chmod_file(struct kobject *kobj,
 196                                  const struct attribute *attr, umode_t mode);
 197void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
 198                          const void *ns);
 199bool sysfs_remove_file_self(struct kobject *kobj, const struct attribute *attr);
 200void sysfs_remove_files(struct kobject *kobj, const struct attribute **attr);
 201
 202int __must_check sysfs_create_bin_file(struct kobject *kobj,
 203                                       const struct bin_attribute *attr);
 204void sysfs_remove_bin_file(struct kobject *kobj,
 205                           const struct bin_attribute *attr);
 206
 207int __must_check sysfs_create_link(struct kobject *kobj, struct kobject *target,
 208                                   const char *name);
 209int __must_check sysfs_create_link_nowarn(struct kobject *kobj,
 210                                          struct kobject *target,
 211                                          const char *name);
 212void sysfs_remove_link(struct kobject *kobj, const char *name);
 213
 214int sysfs_rename_link_ns(struct kobject *kobj, struct kobject *target,
 215                         const char *old_name, const char *new_name,
 216                         const void *new_ns);
 217
 218void sysfs_delete_link(struct kobject *dir, struct kobject *targ,
 219                        const char *name);
 220
 221int __must_check sysfs_create_group(struct kobject *kobj,
 222                                    const struct attribute_group *grp);
 223int __must_check sysfs_create_groups(struct kobject *kobj,
 224                                     const struct attribute_group **groups);
 225int sysfs_update_group(struct kobject *kobj,
 226                       const struct attribute_group *grp);
 227void sysfs_remove_group(struct kobject *kobj,
 228                        const struct attribute_group *grp);
 229void sysfs_remove_groups(struct kobject *kobj,
 230                         const struct attribute_group **groups);
 231int sysfs_add_file_to_group(struct kobject *kobj,
 232                        const struct attribute *attr, const char *group);
 233void sysfs_remove_file_from_group(struct kobject *kobj,
 234                        const struct attribute *attr, const char *group);
 235int sysfs_merge_group(struct kobject *kobj,
 236                       const struct attribute_group *grp);
 237void sysfs_unmerge_group(struct kobject *kobj,
 238                       const struct attribute_group *grp);
 239int sysfs_add_link_to_group(struct kobject *kobj, const char *group_name,
 240                            struct kobject *target, const char *link_name);
 241void sysfs_remove_link_from_group(struct kobject *kobj, const char *group_name,
 242                                  const char *link_name);
 243
 244void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);
 245
 246int __must_check sysfs_init(void);
 247
 248static inline void sysfs_enable_ns(struct kernfs_node *kn)
 249{
 250        return kernfs_enable_ns(kn);
 251}
 252
 253#else /* CONFIG_SYSFS */
 254
 255static inline int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
 256{
 257        return 0;
 258}
 259
 260static inline void sysfs_remove_dir(struct kobject *kobj)
 261{
 262}
 263
 264static inline int sysfs_rename_dir_ns(struct kobject *kobj,
 265                                      const char *new_name, const void *new_ns)
 266{
 267        return 0;
 268}
 269
 270static inline int sysfs_move_dir_ns(struct kobject *kobj,
 271                                    struct kobject *new_parent_kobj,
 272                                    const void *new_ns)
 273{
 274        return 0;
 275}
 276
 277static inline int sysfs_create_file_ns(struct kobject *kobj,
 278                                       const struct attribute *attr,
 279                                       const void *ns)
 280{
 281        return 0;
 282}
 283
 284static inline int sysfs_create_files(struct kobject *kobj,
 285                                    const struct attribute **attr)
 286{
 287        return 0;
 288}
 289
 290static inline int sysfs_chmod_file(struct kobject *kobj,
 291                                   const struct attribute *attr, umode_t mode)
 292{
 293        return 0;
 294}
 295
 296static inline void sysfs_remove_file_ns(struct kobject *kobj,
 297                                        const struct attribute *attr,
 298                                        const void *ns)
 299{
 300}
 301
 302static inline bool sysfs_remove_file_self(struct kobject *kobj,
 303                                          const struct attribute *attr)
 304{
 305        return false;
 306}
 307
 308static inline void sysfs_remove_files(struct kobject *kobj,
 309                                     const struct attribute **attr)
 310{
 311}
 312
 313static inline int sysfs_create_bin_file(struct kobject *kobj,
 314                                        const struct bin_attribute *attr)
 315{
 316        return 0;
 317}
 318
 319static inline void sysfs_remove_bin_file(struct kobject *kobj,
 320                                         const struct bin_attribute *attr)
 321{
 322}
 323
 324static inline int sysfs_create_link(struct kobject *kobj,
 325                                    struct kobject *target, const char *name)
 326{
 327        return 0;
 328}
 329
 330static inline int sysfs_create_link_nowarn(struct kobject *kobj,
 331                                           struct kobject *target,
 332                                           const char *name)
 333{
 334        return 0;
 335}
 336
 337static inline void sysfs_remove_link(struct kobject *kobj, const char *name)
 338{
 339}
 340
 341static inline int sysfs_rename_link_ns(struct kobject *k, struct kobject *t,
 342                                       const char *old_name,
 343                                       const char *new_name, const void *ns)
 344{
 345        return 0;
 346}
 347
 348static inline void sysfs_delete_link(struct kobject *k, struct kobject *t,
 349                                     const char *name)
 350{
 351}
 352
 353static inline int sysfs_create_group(struct kobject *kobj,
 354                                     const struct attribute_group *grp)
 355{
 356        return 0;
 357}
 358
 359static inline int sysfs_create_groups(struct kobject *kobj,
 360                                      const struct attribute_group **groups)
 361{
 362        return 0;
 363}
 364
 365static inline int sysfs_update_group(struct kobject *kobj,
 366                                const struct attribute_group *grp)
 367{
 368        return 0;
 369}
 370
 371static inline void sysfs_remove_group(struct kobject *kobj,
 372                                      const struct attribute_group *grp)
 373{
 374}
 375
 376static inline void sysfs_remove_groups(struct kobject *kobj,
 377                                       const struct attribute_group **groups)
 378{
 379}
 380
 381static inline int sysfs_add_file_to_group(struct kobject *kobj,
 382                const struct attribute *attr, const char *group)
 383{
 384        return 0;
 385}
 386
 387static inline void sysfs_remove_file_from_group(struct kobject *kobj,
 388                const struct attribute *attr, const char *group)
 389{
 390}
 391
 392static inline int sysfs_merge_group(struct kobject *kobj,
 393                       const struct attribute_group *grp)
 394{
 395        return 0;
 396}
 397
 398static inline void sysfs_unmerge_group(struct kobject *kobj,
 399                       const struct attribute_group *grp)
 400{
 401}
 402
 403static inline int sysfs_add_link_to_group(struct kobject *kobj,
 404                const char *group_name, struct kobject *target,
 405                const char *link_name)
 406{
 407        return 0;
 408}
 409
 410static inline void sysfs_remove_link_from_group(struct kobject *kobj,
 411                const char *group_name, const char *link_name)
 412{
 413}
 414
 415static inline void sysfs_notify(struct kobject *kobj, const char *dir,
 416                                const char *attr)
 417{
 418}
 419
 420static inline int __must_check sysfs_init(void)
 421{
 422        return 0;
 423}
 424
 425static inline void sysfs_enable_ns(struct kernfs_node *kn)
 426{
 427}
 428
 429#endif /* CONFIG_SYSFS */
 430
 431static inline int __must_check sysfs_create_file(struct kobject *kobj,
 432                                                 const struct attribute *attr)
 433{
 434        return sysfs_create_file_ns(kobj, attr, NULL);
 435}
 436
 437static inline void sysfs_remove_file(struct kobject *kobj,
 438                                     const struct attribute *attr)
 439{
 440        sysfs_remove_file_ns(kobj, attr, NULL);
 441}
 442
 443static inline int sysfs_rename_link(struct kobject *kobj, struct kobject *target,
 444                                    const char *old_name, const char *new_name)
 445{
 446        return sysfs_rename_link_ns(kobj, target, old_name, new_name, NULL);
 447}
 448
 449static inline void sysfs_notify_dirent(struct kernfs_node *kn)
 450{
 451        kernfs_notify(kn);
 452}
 453
 454static inline struct kernfs_node *sysfs_get_dirent(struct kernfs_node *parent,
 455                                                   const unsigned char *name)
 456{
 457        return kernfs_find_and_get(parent, name);
 458}
 459
 460static inline struct kernfs_node *sysfs_get(struct kernfs_node *kn)
 461{
 462        kernfs_get(kn);
 463        return kn;
 464}
 465
 466static inline void sysfs_put(struct kernfs_node *kn)
 467{
 468        kernfs_put(kn);
 469}
 470
 471#endif /* _SYSFS_H_ */
 472