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
  60/**
  61 * struct attribute_group - data structure used to declare an attribute group.
  62 * @name:       Optional: Attribute group name
  63 *              If specified, the attribute group will be created in
  64 *              a new subdirectory with this name.
  65 * @is_visible: Optional: Function to return permissions associated with an
  66 *              attribute of the group. Will be called repeatedly for each
  67 *              non-binary attribute in the group. Only read/write
  68 *              permissions as well as SYSFS_PREALLOC are accepted. Must
  69 *              return 0 if an attribute is not visible. The returned value
  70 *              will replace static permissions defined in struct attribute.
  71 * @is_bin_visible:
  72 *              Optional: Function to return permissions associated with a
  73 *              binary attribute of the group. Will be called repeatedly
  74 *              for each binary attribute in the group. Only read/write
  75 *              permissions as well as SYSFS_PREALLOC are accepted. Must
  76 *              return 0 if a binary attribute is not visible. The returned
  77 *              value will replace static permissions defined in
  78 *              struct bin_attribute.
  79 * @attrs:      Pointer to NULL terminated list of attributes.
  80 * @bin_attrs:  Pointer to NULL terminated list of binary attributes.
  81 *              Either attrs or bin_attrs or both must be provided.
  82 */
  83struct attribute_group {
  84        const char              *name;
  85        umode_t                 (*is_visible)(struct kobject *,
  86                                              struct attribute *, int);
  87        umode_t                 (*is_bin_visible)(struct kobject *,
  88                                                  struct bin_attribute *, int);
  89        struct attribute        **attrs;
  90        struct bin_attribute    **bin_attrs;
  91};
  92
  93/**
  94 * Use these macros to make defining attributes easier. See include/linux/device.h
  95 * for examples..
  96 */
  97
  98#define SYSFS_PREALLOC 010000
  99
 100#define __ATTR(_name, _mode, _show, _store) {                           \
 101        .attr = {.name = __stringify(_name),                            \
 102                 .mode = VERIFY_OCTAL_PERMISSIONS(_mode) },             \
 103        .show   = _show,                                                \
 104        .store  = _store,                                               \
 105}
 106
 107#define __ATTR_PREALLOC(_name, _mode, _show, _store) {                  \
 108        .attr = {.name = __stringify(_name),                            \
 109                 .mode = SYSFS_PREALLOC | VERIFY_OCTAL_PERMISSIONS(_mode) },\
 110        .show   = _show,                                                \
 111        .store  = _store,                                               \
 112}
 113
 114#define __ATTR_RO(_name) {                                              \
 115        .attr   = { .name = __stringify(_name), .mode = S_IRUGO },      \
 116        .show   = _name##_show,                                         \
 117}
 118
 119#define __ATTR_WO(_name) {                                              \
 120        .attr   = { .name = __stringify(_name), .mode = S_IWUSR },      \
 121        .store  = _name##_store,                                        \
 122}
 123
 124#define __ATTR_RW(_name) __ATTR(_name, (S_IWUSR | S_IRUGO),             \
 125                         _name##_show, _name##_store)
 126
 127#define __ATTR_NULL { .attr = { .name = NULL } }
 128
 129#ifdef CONFIG_DEBUG_LOCK_ALLOC
 130#define __ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) {    \
 131        .attr = {.name = __stringify(_name), .mode = _mode,     \
 132                        .ignore_lockdep = true },               \
 133        .show           = _show,                                \
 134        .store          = _store,                               \
 135}
 136#else
 137#define __ATTR_IGNORE_LOCKDEP   __ATTR
 138#endif
 139
 140#define __ATTRIBUTE_GROUPS(_name)                               \
 141static const struct attribute_group *_name##_groups[] = {       \
 142        &_name##_group,                                         \
 143        NULL,                                                   \
 144}
 145
 146#define ATTRIBUTE_GROUPS(_name)                                 \
 147static const struct attribute_group _name##_group = {           \
 148        .attrs = _name##_attrs,                                 \
 149};                                                              \
 150__ATTRIBUTE_GROUPS(_name)
 151
 152struct file;
 153struct vm_area_struct;
 154
 155struct bin_attribute {
 156        struct attribute        attr;
 157        size_t                  size;
 158        void                    *private;
 159        ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *,
 160                        char *, loff_t, size_t);
 161        ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *,
 162                         char *, loff_t, size_t);
 163        int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr,
 164                    struct vm_area_struct *vma);
 165};
 166
 167/**
 168 *      sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute
 169 *      @attr: struct bin_attribute to initialize
 170 *
 171 *      Initialize a dynamically allocated struct bin_attribute so we
 172 *      can make lockdep happy.  This is a new requirement for
 173 *      attributes and initially this is only needed when lockdep is
 174 *      enabled.  Lockdep gives a nice error when your attribute is
 175 *      added to sysfs if you don't have this.
 176 */
 177#define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr)
 178
 179/* macros to create static binary attributes easier */
 180#define __BIN_ATTR(_name, _mode, _read, _write, _size) {                \
 181        .attr = { .name = __stringify(_name), .mode = _mode },          \
 182        .read   = _read,                                                \
 183        .write  = _write,                                               \
 184        .size   = _size,                                                \
 185}
 186
 187#define __BIN_ATTR_RO(_name, _size) {                                   \
 188        .attr   = { .name = __stringify(_name), .mode = S_IRUGO },      \
 189        .read   = _name##_read,                                         \
 190        .size   = _size,                                                \
 191}
 192
 193#define __BIN_ATTR_RW(_name, _size) __BIN_ATTR(_name,                   \
 194                                   (S_IWUSR | S_IRUGO), _name##_read,   \
 195                                   _name##_write, _size)
 196
 197#define __BIN_ATTR_NULL __ATTR_NULL
 198
 199#define BIN_ATTR(_name, _mode, _read, _write, _size)                    \
 200struct bin_attribute bin_attr_##_name = __BIN_ATTR(_name, _mode, _read, \
 201                                        _write, _size)
 202
 203#define BIN_ATTR_RO(_name, _size)                                       \
 204struct bin_attribute bin_attr_##_name = __BIN_ATTR_RO(_name, _size)
 205
 206#define BIN_ATTR_RW(_name, _size)                                       \
 207struct bin_attribute bin_attr_##_name = __BIN_ATTR_RW(_name, _size)
 208
 209struct sysfs_ops {
 210        ssize_t (*show)(struct kobject *, struct attribute *, char *);
 211        ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t);
 212};
 213
 214#ifdef CONFIG_SYSFS
 215
 216int __must_check sysfs_create_dir_ns(struct kobject *kobj, const void *ns);
 217void sysfs_remove_dir(struct kobject *kobj);
 218int __must_check sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name,
 219                                     const void *new_ns);
 220int __must_check sysfs_move_dir_ns(struct kobject *kobj,
 221                                   struct kobject *new_parent_kobj,
 222                                   const void *new_ns);
 223int __must_check sysfs_create_mount_point(struct kobject *parent_kobj,
 224                                          const char *name);
 225void sysfs_remove_mount_point(struct kobject *parent_kobj,
 226                              const char *name);
 227
 228int __must_check sysfs_create_file_ns(struct kobject *kobj,
 229                                      const struct attribute *attr,
 230                                      const void *ns);
 231int __must_check sysfs_create_files(struct kobject *kobj,
 232                                   const struct attribute **attr);
 233int __must_check sysfs_chmod_file(struct kobject *kobj,
 234                                  const struct attribute *attr, umode_t mode);
 235void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
 236                          const void *ns);
 237bool sysfs_remove_file_self(struct kobject *kobj, const struct attribute *attr);
 238void sysfs_remove_files(struct kobject *kobj, const struct attribute **attr);
 239
 240int __must_check sysfs_create_bin_file(struct kobject *kobj,
 241                                       const struct bin_attribute *attr);
 242void sysfs_remove_bin_file(struct kobject *kobj,
 243                           const struct bin_attribute *attr);
 244
 245int __must_check sysfs_create_link(struct kobject *kobj, struct kobject *target,
 246                                   const char *name);
 247int __must_check sysfs_create_link_nowarn(struct kobject *kobj,
 248                                          struct kobject *target,
 249                                          const char *name);
 250void sysfs_remove_link(struct kobject *kobj, const char *name);
 251
 252int sysfs_rename_link_ns(struct kobject *kobj, struct kobject *target,
 253                         const char *old_name, const char *new_name,
 254                         const void *new_ns);
 255
 256void sysfs_delete_link(struct kobject *dir, struct kobject *targ,
 257                        const char *name);
 258
 259int __must_check sysfs_create_group(struct kobject *kobj,
 260                                    const struct attribute_group *grp);
 261int __must_check sysfs_create_groups(struct kobject *kobj,
 262                                     const struct attribute_group **groups);
 263int sysfs_update_group(struct kobject *kobj,
 264                       const struct attribute_group *grp);
 265void sysfs_remove_group(struct kobject *kobj,
 266                        const struct attribute_group *grp);
 267void sysfs_remove_groups(struct kobject *kobj,
 268                         const struct attribute_group **groups);
 269int sysfs_add_file_to_group(struct kobject *kobj,
 270                        const struct attribute *attr, const char *group);
 271void sysfs_remove_file_from_group(struct kobject *kobj,
 272                        const struct attribute *attr, const char *group);
 273int sysfs_merge_group(struct kobject *kobj,
 274                       const struct attribute_group *grp);
 275void sysfs_unmerge_group(struct kobject *kobj,
 276                       const struct attribute_group *grp);
 277int sysfs_add_link_to_group(struct kobject *kobj, const char *group_name,
 278                            struct kobject *target, const char *link_name);
 279void sysfs_remove_link_from_group(struct kobject *kobj, const char *group_name,
 280                                  const char *link_name);
 281int __compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
 282                                      struct kobject *target_kobj,
 283                                      const char *target_name);
 284
 285void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);
 286
 287int __must_check sysfs_init(void);
 288
 289static inline void sysfs_enable_ns(struct kernfs_node *kn)
 290{
 291        return kernfs_enable_ns(kn);
 292}
 293
 294#else /* CONFIG_SYSFS */
 295
 296static inline int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
 297{
 298        return 0;
 299}
 300
 301static inline void sysfs_remove_dir(struct kobject *kobj)
 302{
 303}
 304
 305static inline int sysfs_rename_dir_ns(struct kobject *kobj,
 306                                      const char *new_name, const void *new_ns)
 307{
 308        return 0;
 309}
 310
 311static inline int sysfs_move_dir_ns(struct kobject *kobj,
 312                                    struct kobject *new_parent_kobj,
 313                                    const void *new_ns)
 314{
 315        return 0;
 316}
 317
 318static inline int sysfs_create_mount_point(struct kobject *parent_kobj,
 319                                           const char *name)
 320{
 321        return 0;
 322}
 323
 324static inline void sysfs_remove_mount_point(struct kobject *parent_kobj,
 325                                            const char *name)
 326{
 327}
 328
 329static inline int sysfs_create_file_ns(struct kobject *kobj,
 330                                       const struct attribute *attr,
 331                                       const void *ns)
 332{
 333        return 0;
 334}
 335
 336static inline int sysfs_create_files(struct kobject *kobj,
 337                                    const struct attribute **attr)
 338{
 339        return 0;
 340}
 341
 342static inline int sysfs_chmod_file(struct kobject *kobj,
 343                                   const struct attribute *attr, umode_t mode)
 344{
 345        return 0;
 346}
 347
 348static inline void sysfs_remove_file_ns(struct kobject *kobj,
 349                                        const struct attribute *attr,
 350                                        const void *ns)
 351{
 352}
 353
 354static inline bool sysfs_remove_file_self(struct kobject *kobj,
 355                                          const struct attribute *attr)
 356{
 357        return false;
 358}
 359
 360static inline void sysfs_remove_files(struct kobject *kobj,
 361                                     const struct attribute **attr)
 362{
 363}
 364
 365static inline int sysfs_create_bin_file(struct kobject *kobj,
 366                                        const struct bin_attribute *attr)
 367{
 368        return 0;
 369}
 370
 371static inline void sysfs_remove_bin_file(struct kobject *kobj,
 372                                         const struct bin_attribute *attr)
 373{
 374}
 375
 376static inline int sysfs_create_link(struct kobject *kobj,
 377                                    struct kobject *target, const char *name)
 378{
 379        return 0;
 380}
 381
 382static inline int sysfs_create_link_nowarn(struct kobject *kobj,
 383                                           struct kobject *target,
 384                                           const char *name)
 385{
 386        return 0;
 387}
 388
 389static inline void sysfs_remove_link(struct kobject *kobj, const char *name)
 390{
 391}
 392
 393static inline int sysfs_rename_link_ns(struct kobject *k, struct kobject *t,
 394                                       const char *old_name,
 395                                       const char *new_name, const void *ns)
 396{
 397        return 0;
 398}
 399
 400static inline void sysfs_delete_link(struct kobject *k, struct kobject *t,
 401                                     const char *name)
 402{
 403}
 404
 405static inline int sysfs_create_group(struct kobject *kobj,
 406                                     const struct attribute_group *grp)
 407{
 408        return 0;
 409}
 410
 411static inline int sysfs_create_groups(struct kobject *kobj,
 412                                      const struct attribute_group **groups)
 413{
 414        return 0;
 415}
 416
 417static inline int sysfs_update_group(struct kobject *kobj,
 418                                const struct attribute_group *grp)
 419{
 420        return 0;
 421}
 422
 423static inline void sysfs_remove_group(struct kobject *kobj,
 424                                      const struct attribute_group *grp)
 425{
 426}
 427
 428static inline void sysfs_remove_groups(struct kobject *kobj,
 429                                       const struct attribute_group **groups)
 430{
 431}
 432
 433static inline int sysfs_add_file_to_group(struct kobject *kobj,
 434                const struct attribute *attr, const char *group)
 435{
 436        return 0;
 437}
 438
 439static inline void sysfs_remove_file_from_group(struct kobject *kobj,
 440                const struct attribute *attr, const char *group)
 441{
 442}
 443
 444static inline int sysfs_merge_group(struct kobject *kobj,
 445                       const struct attribute_group *grp)
 446{
 447        return 0;
 448}
 449
 450static inline void sysfs_unmerge_group(struct kobject *kobj,
 451                       const struct attribute_group *grp)
 452{
 453}
 454
 455static inline int sysfs_add_link_to_group(struct kobject *kobj,
 456                const char *group_name, struct kobject *target,
 457                const char *link_name)
 458{
 459        return 0;
 460}
 461
 462static inline void sysfs_remove_link_from_group(struct kobject *kobj,
 463                const char *group_name, const char *link_name)
 464{
 465}
 466
 467static inline int __compat_only_sysfs_link_entry_to_kobj(
 468        struct kobject *kobj,
 469        struct kobject *target_kobj,
 470        const char *target_name)
 471{
 472        return 0;
 473}
 474
 475static inline void sysfs_notify(struct kobject *kobj, const char *dir,
 476                                const char *attr)
 477{
 478}
 479
 480static inline int __must_check sysfs_init(void)
 481{
 482        return 0;
 483}
 484
 485static inline void sysfs_enable_ns(struct kernfs_node *kn)
 486{
 487}
 488
 489#endif /* CONFIG_SYSFS */
 490
 491static inline int __must_check sysfs_create_file(struct kobject *kobj,
 492                                                 const struct attribute *attr)
 493{
 494        return sysfs_create_file_ns(kobj, attr, NULL);
 495}
 496
 497static inline void sysfs_remove_file(struct kobject *kobj,
 498                                     const struct attribute *attr)
 499{
 500        sysfs_remove_file_ns(kobj, attr, NULL);
 501}
 502
 503static inline int sysfs_rename_link(struct kobject *kobj, struct kobject *target,
 504                                    const char *old_name, const char *new_name)
 505{
 506        return sysfs_rename_link_ns(kobj, target, old_name, new_name, NULL);
 507}
 508
 509static inline void sysfs_notify_dirent(struct kernfs_node *kn)
 510{
 511        kernfs_notify(kn);
 512}
 513
 514static inline struct kernfs_node *sysfs_get_dirent(struct kernfs_node *parent,
 515                                                   const unsigned char *name)
 516{
 517        return kernfs_find_and_get(parent, name);
 518}
 519
 520static inline struct kernfs_node *sysfs_get(struct kernfs_node *kn)
 521{
 522        kernfs_get(kn);
 523        return kn;
 524}
 525
 526static inline void sysfs_put(struct kernfs_node *kn)
 527{
 528        kernfs_put(kn);
 529}
 530
 531#endif /* _SYSFS_H_ */
 532