linux/include/linux/sysfs.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * sysfs.h - definitions for the device driver filesystem
   4 *
   5 * Copyright (c) 2001,2002 Patrick Mochel
   6 * Copyright (c) 2004 Silicon Graphics, Inc.
   7 * Copyright (c) 2007 SUSE Linux Products GmbH
   8 * Copyright (c) 2007 Tejun Heo <teheo@suse.de>
   9 *
  10 * Please see Documentation/filesystems/sysfs.txt for more information.
  11 */
  12
  13#ifndef _SYSFS_H_
  14#define _SYSFS_H_
  15
  16#include <linux/kernfs.h>
  17#include <linux/compiler.h>
  18#include <linux/errno.h>
  19#include <linux/list.h>
  20#include <linux/lockdep.h>
  21#include <linux/kobject_ns.h>
  22#include <linux/stat.h>
  23#include <linux/atomic.h>
  24
  25struct kobject;
  26struct module;
  27struct bin_attribute;
  28enum kobj_ns_type;
  29
  30struct attribute {
  31        const char              *name;
  32        umode_t                 mode;
  33#ifdef CONFIG_DEBUG_LOCK_ALLOC
  34        bool                    ignore_lockdep:1;
  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)                           \
  52do {                                                    \
  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/**
  62 * struct attribute_group - data structure used to declare an attribute group.
  63 * @name:       Optional: Attribute group name
  64 *              If specified, the attribute group will be created in
  65 *              a new subdirectory with this name.
  66 * @is_visible: Optional: Function to return permissions associated with an
  67 *              attribute of the group. Will be called repeatedly for each
  68 *              non-binary attribute in the group. Only read/write
  69 *              permissions as well as SYSFS_PREALLOC are accepted. Must
  70 *              return 0 if an attribute is not visible. The returned value
  71 *              will replace static permissions defined in struct attribute.
  72 * @is_bin_visible:
  73 *              Optional: Function to return permissions associated with a
  74 *              binary attribute of the group. Will be called repeatedly
  75 *              for each binary attribute in the group. Only read/write
  76 *              permissions as well as SYSFS_PREALLOC are accepted. Must
  77 *              return 0 if a binary attribute is not visible. The returned
  78 *              value will replace static permissions defined in
  79 *              struct bin_attribute.
  80 * @attrs:      Pointer to NULL terminated list of attributes.
  81 * @bin_attrs:  Pointer to NULL terminated list of binary attributes.
  82 *              Either attrs or bin_attrs or both must be provided.
  83 */
  84struct attribute_group {
  85        const char              *name;
  86        umode_t                 (*is_visible)(struct kobject *,
  87                                              struct attribute *, int);
  88        umode_t                 (*is_bin_visible)(struct kobject *,
  89                                                  struct bin_attribute *, int);
  90        struct attribute        **attrs;
  91        struct bin_attribute    **bin_attrs;
  92};
  93
  94/**
  95 * Use these macros to make defining attributes easier. See include/linux/device.h
  96 * for examples..
  97 */
  98
  99#define SYSFS_PREALLOC 010000
 100
 101#define __ATTR(_name, _mode, _show, _store) {                           \
 102        .attr = {.name = __stringify(_name),                            \
 103                 .mode = VERIFY_OCTAL_PERMISSIONS(_mode) },             \
 104        .show   = _show,                                                \
 105        .store  = _store,                                               \
 106}
 107
 108#define __ATTR_PREALLOC(_name, _mode, _show, _store) {                  \
 109        .attr = {.name = __stringify(_name),                            \
 110                 .mode = SYSFS_PREALLOC | VERIFY_OCTAL_PERMISSIONS(_mode) },\
 111        .show   = _show,                                                \
 112        .store  = _store,                                               \
 113}
 114
 115#define __ATTR_RO(_name) {                                              \
 116        .attr   = { .name = __stringify(_name), .mode = 0444 },         \
 117        .show   = _name##_show,                                         \
 118}
 119
 120#define __ATTR_RO_MODE(_name, _mode) {                                  \
 121        .attr   = { .name = __stringify(_name),                         \
 122                    .mode = VERIFY_OCTAL_PERMISSIONS(_mode) },          \
 123        .show   = _name##_show,                                         \
 124}
 125
 126#define __ATTR_RW_MODE(_name, _mode) {                                  \
 127        .attr   = { .name = __stringify(_name),                         \
 128                    .mode = VERIFY_OCTAL_PERMISSIONS(_mode) },          \
 129        .show   = _name##_show,                                         \
 130        .store  = _name##_store,                                        \
 131}
 132
 133#define __ATTR_WO(_name) {                                              \
 134        .attr   = { .name = __stringify(_name), .mode = 0200 },         \
 135        .store  = _name##_store,                                        \
 136}
 137
 138#define __ATTR_RW(_name) __ATTR(_name, 0644, _name##_show, _name##_store)
 139
 140#define __ATTR_NULL { .attr = { .name = NULL } }
 141
 142#ifdef CONFIG_DEBUG_LOCK_ALLOC
 143#define __ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) {    \
 144        .attr = {.name = __stringify(_name), .mode = _mode,     \
 145                        .ignore_lockdep = true },               \
 146        .show           = _show,                                \
 147        .store          = _store,                               \
 148}
 149#else
 150#define __ATTR_IGNORE_LOCKDEP   __ATTR
 151#endif
 152
 153#define __ATTRIBUTE_GROUPS(_name)                               \
 154static const struct attribute_group *_name##_groups[] = {       \
 155        &_name##_group,                                         \
 156        NULL,                                                   \
 157}
 158
 159#define ATTRIBUTE_GROUPS(_name)                                 \
 160static const struct attribute_group _name##_group = {           \
 161        .attrs = _name##_attrs,                                 \
 162};                                                              \
 163__ATTRIBUTE_GROUPS(_name)
 164
 165struct file;
 166struct vm_area_struct;
 167
 168struct bin_attribute {
 169        struct attribute        attr;
 170        size_t                  size;
 171        void                    *private;
 172        ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *,
 173                        char *, loff_t, size_t);
 174        ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *,
 175                         char *, loff_t, size_t);
 176        int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr,
 177                    struct vm_area_struct *vma);
 178};
 179
 180/**
 181 *      sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute
 182 *      @attr: struct bin_attribute to initialize
 183 *
 184 *      Initialize a dynamically allocated struct bin_attribute so we
 185 *      can make lockdep happy.  This is a new requirement for
 186 *      attributes and initially this is only needed when lockdep is
 187 *      enabled.  Lockdep gives a nice error when your attribute is
 188 *      added to sysfs if you don't have this.
 189 */
 190#define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr)
 191
 192/* macros to create static binary attributes easier */
 193#define __BIN_ATTR(_name, _mode, _read, _write, _size) {                \
 194        .attr = { .name = __stringify(_name), .mode = _mode },          \
 195        .read   = _read,                                                \
 196        .write  = _write,                                               \
 197        .size   = _size,                                                \
 198}
 199
 200#define __BIN_ATTR_RO(_name, _size) {                                   \
 201        .attr   = { .name = __stringify(_name), .mode = 0444 },         \
 202        .read   = _name##_read,                                         \
 203        .size   = _size,                                                \
 204}
 205
 206#define __BIN_ATTR_WO(_name, _size) {                                   \
 207        .attr   = { .name = __stringify(_name), .mode = 0200 },         \
 208        .write  = _name##_write,                                        \
 209        .size   = _size,                                                \
 210}
 211
 212#define __BIN_ATTR_RW(_name, _size)                                     \
 213        __BIN_ATTR(_name, 0644, _name##_read, _name##_write, _size)
 214
 215#define __BIN_ATTR_NULL __ATTR_NULL
 216
 217#define BIN_ATTR(_name, _mode, _read, _write, _size)                    \
 218struct bin_attribute bin_attr_##_name = __BIN_ATTR(_name, _mode, _read, \
 219                                        _write, _size)
 220
 221#define BIN_ATTR_RO(_name, _size)                                       \
 222struct bin_attribute bin_attr_##_name = __BIN_ATTR_RO(_name, _size)
 223
 224#define BIN_ATTR_WO(_name, _size)                                       \
 225struct bin_attribute bin_attr_##_name = __BIN_ATTR_WO(_name, _size)
 226
 227#define BIN_ATTR_RW(_name, _size)                                       \
 228struct bin_attribute bin_attr_##_name = __BIN_ATTR_RW(_name, _size)
 229
 230struct sysfs_ops {
 231        ssize_t (*show)(struct kobject *, struct attribute *, char *);
 232        ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t);
 233};
 234
 235#ifdef CONFIG_SYSFS
 236
 237int __must_check sysfs_create_dir_ns(struct kobject *kobj, const void *ns);
 238void sysfs_remove_dir(struct kobject *kobj);
 239int __must_check sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name,
 240                                     const void *new_ns);
 241int __must_check sysfs_move_dir_ns(struct kobject *kobj,
 242                                   struct kobject *new_parent_kobj,
 243                                   const void *new_ns);
 244int __must_check sysfs_create_mount_point(struct kobject *parent_kobj,
 245                                          const char *name);
 246void sysfs_remove_mount_point(struct kobject *parent_kobj,
 247                              const char *name);
 248
 249int __must_check sysfs_create_file_ns(struct kobject *kobj,
 250                                      const struct attribute *attr,
 251                                      const void *ns);
 252int __must_check sysfs_create_files(struct kobject *kobj,
 253                                   const struct attribute * const *attr);
 254int __must_check sysfs_chmod_file(struct kobject *kobj,
 255                                  const struct attribute *attr, umode_t mode);
 256struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj,
 257                                                  const struct attribute *attr);
 258void sysfs_unbreak_active_protection(struct kernfs_node *kn);
 259void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
 260                          const void *ns);
 261bool sysfs_remove_file_self(struct kobject *kobj, const struct attribute *attr);
 262void sysfs_remove_files(struct kobject *kobj, const struct attribute * const *attr);
 263
 264int __must_check sysfs_create_bin_file(struct kobject *kobj,
 265                                       const struct bin_attribute *attr);
 266void sysfs_remove_bin_file(struct kobject *kobj,
 267                           const struct bin_attribute *attr);
 268
 269int __must_check sysfs_create_link(struct kobject *kobj, struct kobject *target,
 270                                   const char *name);
 271int __must_check sysfs_create_link_nowarn(struct kobject *kobj,
 272                                          struct kobject *target,
 273                                          const char *name);
 274void sysfs_remove_link(struct kobject *kobj, const char *name);
 275
 276int sysfs_rename_link_ns(struct kobject *kobj, struct kobject *target,
 277                         const char *old_name, const char *new_name,
 278                         const void *new_ns);
 279
 280void sysfs_delete_link(struct kobject *dir, struct kobject *targ,
 281                        const char *name);
 282
 283int __must_check sysfs_create_group(struct kobject *kobj,
 284                                    const struct attribute_group *grp);
 285int __must_check sysfs_create_groups(struct kobject *kobj,
 286                                     const struct attribute_group **groups);
 287int __must_check sysfs_update_groups(struct kobject *kobj,
 288                                     const struct attribute_group **groups);
 289int sysfs_update_group(struct kobject *kobj,
 290                       const struct attribute_group *grp);
 291void sysfs_remove_group(struct kobject *kobj,
 292                        const struct attribute_group *grp);
 293void sysfs_remove_groups(struct kobject *kobj,
 294                         const struct attribute_group **groups);
 295int sysfs_add_file_to_group(struct kobject *kobj,
 296                        const struct attribute *attr, const char *group);
 297void sysfs_remove_file_from_group(struct kobject *kobj,
 298                        const struct attribute *attr, const char *group);
 299int sysfs_merge_group(struct kobject *kobj,
 300                       const struct attribute_group *grp);
 301void sysfs_unmerge_group(struct kobject *kobj,
 302                       const struct attribute_group *grp);
 303int sysfs_add_link_to_group(struct kobject *kobj, const char *group_name,
 304                            struct kobject *target, const char *link_name);
 305void sysfs_remove_link_from_group(struct kobject *kobj, const char *group_name,
 306                                  const char *link_name);
 307int __compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
 308                                      struct kobject *target_kobj,
 309                                      const char *target_name);
 310int compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
 311                                         struct kobject *target_kobj,
 312                                         const char *target_name,
 313                                         const char *symlink_name);
 314
 315void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);
 316
 317int __must_check sysfs_init(void);
 318
 319static inline void sysfs_enable_ns(struct kernfs_node *kn)
 320{
 321        return kernfs_enable_ns(kn);
 322}
 323
 324int sysfs_file_change_owner(struct kobject *kobj, const char *name, kuid_t kuid,
 325                            kgid_t kgid);
 326int sysfs_change_owner(struct kobject *kobj, kuid_t kuid, kgid_t kgid);
 327int sysfs_link_change_owner(struct kobject *kobj, struct kobject *targ,
 328                            const char *name, kuid_t kuid, kgid_t kgid);
 329int sysfs_groups_change_owner(struct kobject *kobj,
 330                              const struct attribute_group **groups,
 331                              kuid_t kuid, kgid_t kgid);
 332int sysfs_group_change_owner(struct kobject *kobj,
 333                             const struct attribute_group *groups, kuid_t kuid,
 334                             kgid_t kgid);
 335__printf(2, 3)
 336int sysfs_emit(char *buf, const char *fmt, ...);
 337__printf(3, 4)
 338int sysfs_emit_at(char *buf, int at, const char *fmt, ...);
 339
 340#else /* CONFIG_SYSFS */
 341
 342static inline int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
 343{
 344        return 0;
 345}
 346
 347static inline void sysfs_remove_dir(struct kobject *kobj)
 348{
 349}
 350
 351static inline int sysfs_rename_dir_ns(struct kobject *kobj,
 352                                      const char *new_name, const void *new_ns)
 353{
 354        return 0;
 355}
 356
 357static inline int sysfs_move_dir_ns(struct kobject *kobj,
 358                                    struct kobject *new_parent_kobj,
 359                                    const void *new_ns)
 360{
 361        return 0;
 362}
 363
 364static inline int sysfs_create_mount_point(struct kobject *parent_kobj,
 365                                           const char *name)
 366{
 367        return 0;
 368}
 369
 370static inline void sysfs_remove_mount_point(struct kobject *parent_kobj,
 371                                            const char *name)
 372{
 373}
 374
 375static inline int sysfs_create_file_ns(struct kobject *kobj,
 376                                       const struct attribute *attr,
 377                                       const void *ns)
 378{
 379        return 0;
 380}
 381
 382static inline int sysfs_create_files(struct kobject *kobj,
 383                                    const struct attribute * const *attr)
 384{
 385        return 0;
 386}
 387
 388static inline int sysfs_chmod_file(struct kobject *kobj,
 389                                   const struct attribute *attr, umode_t mode)
 390{
 391        return 0;
 392}
 393
 394static inline struct kernfs_node *
 395sysfs_break_active_protection(struct kobject *kobj,
 396                              const struct attribute *attr)
 397{
 398        return NULL;
 399}
 400
 401static inline void sysfs_unbreak_active_protection(struct kernfs_node *kn)
 402{
 403}
 404
 405static inline void sysfs_remove_file_ns(struct kobject *kobj,
 406                                        const struct attribute *attr,
 407                                        const void *ns)
 408{
 409}
 410
 411static inline bool sysfs_remove_file_self(struct kobject *kobj,
 412                                          const struct attribute *attr)
 413{
 414        return false;
 415}
 416
 417static inline void sysfs_remove_files(struct kobject *kobj,
 418                                     const struct attribute * const *attr)
 419{
 420}
 421
 422static inline int sysfs_create_bin_file(struct kobject *kobj,
 423                                        const struct bin_attribute *attr)
 424{
 425        return 0;
 426}
 427
 428static inline void sysfs_remove_bin_file(struct kobject *kobj,
 429                                         const struct bin_attribute *attr)
 430{
 431}
 432
 433static inline int sysfs_create_link(struct kobject *kobj,
 434                                    struct kobject *target, const char *name)
 435{
 436        return 0;
 437}
 438
 439static inline int sysfs_create_link_nowarn(struct kobject *kobj,
 440                                           struct kobject *target,
 441                                           const char *name)
 442{
 443        return 0;
 444}
 445
 446static inline void sysfs_remove_link(struct kobject *kobj, const char *name)
 447{
 448}
 449
 450static inline int sysfs_rename_link_ns(struct kobject *k, struct kobject *t,
 451                                       const char *old_name,
 452                                       const char *new_name, const void *ns)
 453{
 454        return 0;
 455}
 456
 457static inline void sysfs_delete_link(struct kobject *k, struct kobject *t,
 458                                     const char *name)
 459{
 460}
 461
 462static inline int sysfs_create_group(struct kobject *kobj,
 463                                     const struct attribute_group *grp)
 464{
 465        return 0;
 466}
 467
 468static inline int sysfs_create_groups(struct kobject *kobj,
 469                                      const struct attribute_group **groups)
 470{
 471        return 0;
 472}
 473
 474static inline int sysfs_update_groups(struct kobject *kobj,
 475                                      const struct attribute_group **groups)
 476{
 477        return 0;
 478}
 479
 480static inline int sysfs_update_group(struct kobject *kobj,
 481                                const struct attribute_group *grp)
 482{
 483        return 0;
 484}
 485
 486static inline void sysfs_remove_group(struct kobject *kobj,
 487                                      const struct attribute_group *grp)
 488{
 489}
 490
 491static inline void sysfs_remove_groups(struct kobject *kobj,
 492                                       const struct attribute_group **groups)
 493{
 494}
 495
 496static inline int sysfs_add_file_to_group(struct kobject *kobj,
 497                const struct attribute *attr, const char *group)
 498{
 499        return 0;
 500}
 501
 502static inline void sysfs_remove_file_from_group(struct kobject *kobj,
 503                const struct attribute *attr, const char *group)
 504{
 505}
 506
 507static inline int sysfs_merge_group(struct kobject *kobj,
 508                       const struct attribute_group *grp)
 509{
 510        return 0;
 511}
 512
 513static inline void sysfs_unmerge_group(struct kobject *kobj,
 514                       const struct attribute_group *grp)
 515{
 516}
 517
 518static inline int sysfs_add_link_to_group(struct kobject *kobj,
 519                const char *group_name, struct kobject *target,
 520                const char *link_name)
 521{
 522        return 0;
 523}
 524
 525static inline void sysfs_remove_link_from_group(struct kobject *kobj,
 526                const char *group_name, const char *link_name)
 527{
 528}
 529
 530static inline int __compat_only_sysfs_link_entry_to_kobj(
 531        struct kobject *kobj,
 532        struct kobject *target_kobj,
 533        const char *target_name)
 534{
 535        return 0;
 536}
 537
 538static int compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
 539                                                struct kobject *target_kobj,
 540                                                const char *target_name,
 541                                                const char *symlink_name)
 542{
 543        return 0;
 544}
 545
 546static inline void sysfs_notify(struct kobject *kobj, const char *dir,
 547                                const char *attr)
 548{
 549}
 550
 551static inline int __must_check sysfs_init(void)
 552{
 553        return 0;
 554}
 555
 556static inline void sysfs_enable_ns(struct kernfs_node *kn)
 557{
 558}
 559
 560static inline int sysfs_file_change_owner(struct kobject *kobj,
 561                                          const char *name, kuid_t kuid,
 562                                          kgid_t kgid)
 563{
 564        return 0;
 565}
 566
 567static inline int sysfs_link_change_owner(struct kobject *kobj,
 568                                          struct kobject *targ,
 569                                          const char *name, kuid_t kuid,
 570                                          kgid_t kgid)
 571{
 572        return 0;
 573}
 574
 575static inline int sysfs_change_owner(struct kobject *kobj, kuid_t kuid, kgid_t kgid)
 576{
 577        return 0;
 578}
 579
 580static inline int sysfs_groups_change_owner(struct kobject *kobj,
 581                          const struct attribute_group **groups,
 582                          kuid_t kuid, kgid_t kgid)
 583{
 584        return 0;
 585}
 586
 587static inline int sysfs_group_change_owner(struct kobject *kobj,
 588                                           const struct attribute_group *groups,
 589                                           kuid_t kuid, kgid_t kgid)
 590{
 591        return 0;
 592}
 593
 594__printf(2, 3)
 595static inline int sysfs_emit(char *buf, const char *fmt, ...)
 596{
 597        return 0;
 598}
 599
 600__printf(3, 4)
 601static inline int sysfs_emit_at(char *buf, int at, const char *fmt, ...)
 602{
 603        return 0;
 604}
 605#endif /* CONFIG_SYSFS */
 606
 607static inline int __must_check sysfs_create_file(struct kobject *kobj,
 608                                                 const struct attribute *attr)
 609{
 610        return sysfs_create_file_ns(kobj, attr, NULL);
 611}
 612
 613static inline void sysfs_remove_file(struct kobject *kobj,
 614                                     const struct attribute *attr)
 615{
 616        sysfs_remove_file_ns(kobj, attr, NULL);
 617}
 618
 619static inline int sysfs_rename_link(struct kobject *kobj, struct kobject *target,
 620                                    const char *old_name, const char *new_name)
 621{
 622        return sysfs_rename_link_ns(kobj, target, old_name, new_name, NULL);
 623}
 624
 625static inline void sysfs_notify_dirent(struct kernfs_node *kn)
 626{
 627        kernfs_notify(kn);
 628}
 629
 630static inline struct kernfs_node *sysfs_get_dirent(struct kernfs_node *parent,
 631                                                   const char *name)
 632{
 633        return kernfs_find_and_get(parent, name);
 634}
 635
 636static inline struct kernfs_node *sysfs_get(struct kernfs_node *kn)
 637{
 638        kernfs_get(kn);
 639        return kn;
 640}
 641
 642static inline void sysfs_put(struct kernfs_node *kn)
 643{
 644        kernfs_put(kn);
 645}
 646
 647#endif /* _SYSFS_H_ */
 648