LCOV - code coverage report
Current view: top level - include/linux - sysfs.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-achx @ Mon Jul 31 20:08:12 PDT 2023 Lines: 1 1 100.0 %
Date: 2023-07-31 20:08:12 Functions: 0 0 -

          Line data    Source code
       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.rst 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             : 
      25             : struct kobject;
      26             : struct module;
      27             : struct bin_attribute;
      28             : enum kobj_ns_type;
      29             : 
      30             : struct 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)                           \
      52             : do {                                                    \
      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             :  */
      84             : struct 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.
      96             :  * See include/linux/device.h 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)                               \
     154             : static const struct attribute_group *_name##_groups[] = {       \
     155             :         &_name##_group,                                             \
     156             :         NULL,                                                   \
     157             : }
     158             : 
     159             : #define ATTRIBUTE_GROUPS(_name)                                 \
     160             : static const struct attribute_group _name##_group = {           \
     161             :         .attrs = _name##_attrs,                                 \
     162             : };                                                              \
     163             : __ATTRIBUTE_GROUPS(_name)
     164             : 
     165             : #define BIN_ATTRIBUTE_GROUPS(_name)                             \
     166             : static const struct attribute_group _name##_group = {           \
     167             :         .bin_attrs = _name##_attrs,                             \
     168             : };                                                              \
     169             : __ATTRIBUTE_GROUPS(_name)
     170             : 
     171             : struct file;
     172             : struct vm_area_struct;
     173             : struct address_space;
     174             : 
     175             : struct bin_attribute {
     176             :         struct attribute        attr;
     177             :         size_t                  size;
     178             :         void                    *private;
     179             :         struct address_space *(*f_mapping)(void);
     180             :         ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *,
     181             :                         char *, loff_t, size_t);
     182             :         ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *,
     183             :                          char *, loff_t, size_t);
     184             :         int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr,
     185             :                     struct vm_area_struct *vma);
     186             : };
     187             : 
     188             : /**
     189             :  *      sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute
     190             :  *      @attr: struct bin_attribute to initialize
     191             :  *
     192             :  *      Initialize a dynamically allocated struct bin_attribute so we
     193             :  *      can make lockdep happy.  This is a new requirement for
     194             :  *      attributes and initially this is only needed when lockdep is
     195             :  *      enabled.  Lockdep gives a nice error when your attribute is
     196             :  *      added to sysfs if you don't have this.
     197             :  */
     198             : #define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr)
     199             : 
     200             : /* macros to create static binary attributes easier */
     201             : #define __BIN_ATTR(_name, _mode, _read, _write, _size) {                \
     202             :         .attr = { .name = __stringify(_name), .mode = _mode },          \
     203             :         .read   = _read,                                                \
     204             :         .write  = _write,                                               \
     205             :         .size   = _size,                                                \
     206             : }
     207             : 
     208             : #define __BIN_ATTR_RO(_name, _size) {                                   \
     209             :         .attr   = { .name = __stringify(_name), .mode = 0444 },         \
     210             :         .read   = _name##_read,                                         \
     211             :         .size   = _size,                                                \
     212             : }
     213             : 
     214             : #define __BIN_ATTR_WO(_name, _size) {                                   \
     215             :         .attr   = { .name = __stringify(_name), .mode = 0200 },         \
     216             :         .write  = _name##_write,                                        \
     217             :         .size   = _size,                                                \
     218             : }
     219             : 
     220             : #define __BIN_ATTR_RW(_name, _size)                                     \
     221             :         __BIN_ATTR(_name, 0644, _name##_read, _name##_write, _size)
     222             : 
     223             : #define __BIN_ATTR_NULL __ATTR_NULL
     224             : 
     225             : #define BIN_ATTR(_name, _mode, _read, _write, _size)                    \
     226             : struct bin_attribute bin_attr_##_name = __BIN_ATTR(_name, _mode, _read, \
     227             :                                         _write, _size)
     228             : 
     229             : #define BIN_ATTR_RO(_name, _size)                                       \
     230             : struct bin_attribute bin_attr_##_name = __BIN_ATTR_RO(_name, _size)
     231             : 
     232             : #define BIN_ATTR_WO(_name, _size)                                       \
     233             : struct bin_attribute bin_attr_##_name = __BIN_ATTR_WO(_name, _size)
     234             : 
     235             : #define BIN_ATTR_RW(_name, _size)                                       \
     236             : struct bin_attribute bin_attr_##_name = __BIN_ATTR_RW(_name, _size)
     237             : 
     238             : 
     239             : #define __BIN_ATTR_ADMIN_RO(_name, _size) {                                     \
     240             :         .attr   = { .name = __stringify(_name), .mode = 0400 },         \
     241             :         .read   = _name##_read,                                         \
     242             :         .size   = _size,                                                \
     243             : }
     244             : 
     245             : #define __BIN_ATTR_ADMIN_RW(_name, _size)                                       \
     246             :         __BIN_ATTR(_name, 0600, _name##_read, _name##_write, _size)
     247             : 
     248             : #define BIN_ATTR_ADMIN_RO(_name, _size)                                 \
     249             : struct bin_attribute bin_attr_##_name = __BIN_ATTR_ADMIN_RO(_name, _size)
     250             : 
     251             : #define BIN_ATTR_ADMIN_RW(_name, _size)                                 \
     252             : struct bin_attribute bin_attr_##_name = __BIN_ATTR_ADMIN_RW(_name, _size)
     253             : 
     254             : struct sysfs_ops {
     255             :         ssize_t (*show)(struct kobject *, struct attribute *, char *);
     256             :         ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t);
     257             : };
     258             : 
     259             : #ifdef CONFIG_SYSFS
     260             : 
     261             : int __must_check sysfs_create_dir_ns(struct kobject *kobj, const void *ns);
     262             : void sysfs_remove_dir(struct kobject *kobj);
     263             : int __must_check sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name,
     264             :                                      const void *new_ns);
     265             : int __must_check sysfs_move_dir_ns(struct kobject *kobj,
     266             :                                    struct kobject *new_parent_kobj,
     267             :                                    const void *new_ns);
     268             : int __must_check sysfs_create_mount_point(struct kobject *parent_kobj,
     269             :                                           const char *name);
     270             : void sysfs_remove_mount_point(struct kobject *parent_kobj,
     271             :                               const char *name);
     272             : 
     273             : int __must_check sysfs_create_file_ns(struct kobject *kobj,
     274             :                                       const struct attribute *attr,
     275             :                                       const void *ns);
     276             : int __must_check sysfs_create_files(struct kobject *kobj,
     277             :                                    const struct attribute * const *attr);
     278             : int __must_check sysfs_chmod_file(struct kobject *kobj,
     279             :                                   const struct attribute *attr, umode_t mode);
     280             : struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj,
     281             :                                                   const struct attribute *attr);
     282             : void sysfs_unbreak_active_protection(struct kernfs_node *kn);
     283             : void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
     284             :                           const void *ns);
     285             : bool sysfs_remove_file_self(struct kobject *kobj, const struct attribute *attr);
     286             : void sysfs_remove_files(struct kobject *kobj, const struct attribute * const *attr);
     287             : 
     288             : int __must_check sysfs_create_bin_file(struct kobject *kobj,
     289             :                                        const struct bin_attribute *attr);
     290             : void sysfs_remove_bin_file(struct kobject *kobj,
     291             :                            const struct bin_attribute *attr);
     292             : 
     293             : int __must_check sysfs_create_link(struct kobject *kobj, struct kobject *target,
     294             :                                    const char *name);
     295             : int __must_check sysfs_create_link_nowarn(struct kobject *kobj,
     296             :                                           struct kobject *target,
     297             :                                           const char *name);
     298             : void sysfs_remove_link(struct kobject *kobj, const char *name);
     299             : 
     300             : int sysfs_rename_link_ns(struct kobject *kobj, struct kobject *target,
     301             :                          const char *old_name, const char *new_name,
     302             :                          const void *new_ns);
     303             : 
     304             : void sysfs_delete_link(struct kobject *dir, struct kobject *targ,
     305             :                         const char *name);
     306             : 
     307             : int __must_check sysfs_create_group(struct kobject *kobj,
     308             :                                     const struct attribute_group *grp);
     309             : int __must_check sysfs_create_groups(struct kobject *kobj,
     310             :                                      const struct attribute_group **groups);
     311             : int __must_check sysfs_update_groups(struct kobject *kobj,
     312             :                                      const struct attribute_group **groups);
     313             : int sysfs_update_group(struct kobject *kobj,
     314             :                        const struct attribute_group *grp);
     315             : void sysfs_remove_group(struct kobject *kobj,
     316             :                         const struct attribute_group *grp);
     317             : void sysfs_remove_groups(struct kobject *kobj,
     318             :                          const struct attribute_group **groups);
     319             : int sysfs_add_file_to_group(struct kobject *kobj,
     320             :                         const struct attribute *attr, const char *group);
     321             : void sysfs_remove_file_from_group(struct kobject *kobj,
     322             :                         const struct attribute *attr, const char *group);
     323             : int sysfs_merge_group(struct kobject *kobj,
     324             :                        const struct attribute_group *grp);
     325             : void sysfs_unmerge_group(struct kobject *kobj,
     326             :                        const struct attribute_group *grp);
     327             : int sysfs_add_link_to_group(struct kobject *kobj, const char *group_name,
     328             :                             struct kobject *target, const char *link_name);
     329             : void sysfs_remove_link_from_group(struct kobject *kobj, const char *group_name,
     330             :                                   const char *link_name);
     331             : int compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
     332             :                                          struct kobject *target_kobj,
     333             :                                          const char *target_name,
     334             :                                          const char *symlink_name);
     335             : 
     336             : void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);
     337             : 
     338             : int __must_check sysfs_init(void);
     339             : 
     340             : static inline void sysfs_enable_ns(struct kernfs_node *kn)
     341             : {
     342             :         return kernfs_enable_ns(kn);
     343             : }
     344             : 
     345             : int sysfs_file_change_owner(struct kobject *kobj, const char *name, kuid_t kuid,
     346             :                             kgid_t kgid);
     347             : int sysfs_change_owner(struct kobject *kobj, kuid_t kuid, kgid_t kgid);
     348             : int sysfs_link_change_owner(struct kobject *kobj, struct kobject *targ,
     349             :                             const char *name, kuid_t kuid, kgid_t kgid);
     350             : int sysfs_groups_change_owner(struct kobject *kobj,
     351             :                               const struct attribute_group **groups,
     352             :                               kuid_t kuid, kgid_t kgid);
     353             : int sysfs_group_change_owner(struct kobject *kobj,
     354             :                              const struct attribute_group *groups, kuid_t kuid,
     355             :                              kgid_t kgid);
     356             : __printf(2, 3)
     357             : int sysfs_emit(char *buf, const char *fmt, ...);
     358             : __printf(3, 4)
     359             : int sysfs_emit_at(char *buf, int at, const char *fmt, ...);
     360             : 
     361             : #else /* CONFIG_SYSFS */
     362             : 
     363             : static inline int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
     364             : {
     365             :         return 0;
     366             : }
     367             : 
     368             : static inline void sysfs_remove_dir(struct kobject *kobj)
     369             : {
     370             : }
     371             : 
     372             : static inline int sysfs_rename_dir_ns(struct kobject *kobj,
     373             :                                       const char *new_name, const void *new_ns)
     374             : {
     375             :         return 0;
     376             : }
     377             : 
     378             : static inline int sysfs_move_dir_ns(struct kobject *kobj,
     379             :                                     struct kobject *new_parent_kobj,
     380             :                                     const void *new_ns)
     381             : {
     382             :         return 0;
     383             : }
     384             : 
     385             : static inline int sysfs_create_mount_point(struct kobject *parent_kobj,
     386             :                                            const char *name)
     387             : {
     388             :         return 0;
     389             : }
     390             : 
     391             : static inline void sysfs_remove_mount_point(struct kobject *parent_kobj,
     392             :                                             const char *name)
     393             : {
     394             : }
     395             : 
     396             : static inline int sysfs_create_file_ns(struct kobject *kobj,
     397             :                                        const struct attribute *attr,
     398             :                                        const void *ns)
     399             : {
     400             :         return 0;
     401             : }
     402             : 
     403             : static inline int sysfs_create_files(struct kobject *kobj,
     404             :                                     const struct attribute * const *attr)
     405             : {
     406             :         return 0;
     407             : }
     408             : 
     409             : static inline int sysfs_chmod_file(struct kobject *kobj,
     410             :                                    const struct attribute *attr, umode_t mode)
     411             : {
     412             :         return 0;
     413             : }
     414             : 
     415             : static inline struct kernfs_node *
     416             : sysfs_break_active_protection(struct kobject *kobj,
     417             :                               const struct attribute *attr)
     418             : {
     419             :         return NULL;
     420             : }
     421             : 
     422             : static inline void sysfs_unbreak_active_protection(struct kernfs_node *kn)
     423             : {
     424             : }
     425             : 
     426             : static inline void sysfs_remove_file_ns(struct kobject *kobj,
     427             :                                         const struct attribute *attr,
     428             :                                         const void *ns)
     429             : {
     430             : }
     431             : 
     432             : static inline bool sysfs_remove_file_self(struct kobject *kobj,
     433             :                                           const struct attribute *attr)
     434             : {
     435             :         return false;
     436             : }
     437             : 
     438             : static inline void sysfs_remove_files(struct kobject *kobj,
     439             :                                      const struct attribute * const *attr)
     440             : {
     441             : }
     442             : 
     443             : static inline int sysfs_create_bin_file(struct kobject *kobj,
     444             :                                         const struct bin_attribute *attr)
     445             : {
     446             :         return 0;
     447             : }
     448             : 
     449             : static inline void sysfs_remove_bin_file(struct kobject *kobj,
     450             :                                          const struct bin_attribute *attr)
     451             : {
     452             : }
     453             : 
     454             : static inline int sysfs_create_link(struct kobject *kobj,
     455             :                                     struct kobject *target, const char *name)
     456             : {
     457             :         return 0;
     458             : }
     459             : 
     460             : static inline int sysfs_create_link_nowarn(struct kobject *kobj,
     461             :                                            struct kobject *target,
     462             :                                            const char *name)
     463             : {
     464             :         return 0;
     465             : }
     466             : 
     467             : static inline void sysfs_remove_link(struct kobject *kobj, const char *name)
     468             : {
     469             : }
     470             : 
     471             : static inline int sysfs_rename_link_ns(struct kobject *k, struct kobject *t,
     472             :                                        const char *old_name,
     473             :                                        const char *new_name, const void *ns)
     474             : {
     475             :         return 0;
     476             : }
     477             : 
     478             : static inline void sysfs_delete_link(struct kobject *k, struct kobject *t,
     479             :                                      const char *name)
     480             : {
     481             : }
     482             : 
     483             : static inline int sysfs_create_group(struct kobject *kobj,
     484             :                                      const struct attribute_group *grp)
     485             : {
     486             :         return 0;
     487             : }
     488             : 
     489             : static inline int sysfs_create_groups(struct kobject *kobj,
     490             :                                       const struct attribute_group **groups)
     491             : {
     492             :         return 0;
     493             : }
     494             : 
     495             : static inline int sysfs_update_groups(struct kobject *kobj,
     496             :                                       const struct attribute_group **groups)
     497             : {
     498             :         return 0;
     499             : }
     500             : 
     501             : static inline int sysfs_update_group(struct kobject *kobj,
     502             :                                 const struct attribute_group *grp)
     503             : {
     504             :         return 0;
     505             : }
     506             : 
     507             : static inline void sysfs_remove_group(struct kobject *kobj,
     508             :                                       const struct attribute_group *grp)
     509             : {
     510             : }
     511             : 
     512             : static inline void sysfs_remove_groups(struct kobject *kobj,
     513             :                                        const struct attribute_group **groups)
     514             : {
     515             : }
     516             : 
     517             : static inline int sysfs_add_file_to_group(struct kobject *kobj,
     518             :                 const struct attribute *attr, const char *group)
     519             : {
     520             :         return 0;
     521             : }
     522             : 
     523             : static inline void sysfs_remove_file_from_group(struct kobject *kobj,
     524             :                 const struct attribute *attr, const char *group)
     525             : {
     526             : }
     527             : 
     528             : static inline int sysfs_merge_group(struct kobject *kobj,
     529             :                        const struct attribute_group *grp)
     530             : {
     531             :         return 0;
     532             : }
     533             : 
     534             : static inline void sysfs_unmerge_group(struct kobject *kobj,
     535             :                        const struct attribute_group *grp)
     536             : {
     537             : }
     538             : 
     539             : static inline int sysfs_add_link_to_group(struct kobject *kobj,
     540             :                 const char *group_name, struct kobject *target,
     541             :                 const char *link_name)
     542             : {
     543             :         return 0;
     544             : }
     545             : 
     546             : static inline void sysfs_remove_link_from_group(struct kobject *kobj,
     547             :                 const char *group_name, const char *link_name)
     548             : {
     549             : }
     550             : 
     551             : static inline int compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
     552             :                                                        struct kobject *target_kobj,
     553             :                                                        const char *target_name,
     554             :                                                        const char *symlink_name)
     555             : {
     556             :         return 0;
     557             : }
     558             : 
     559             : static inline void sysfs_notify(struct kobject *kobj, const char *dir,
     560             :                                 const char *attr)
     561             : {
     562             : }
     563             : 
     564             : static inline int __must_check sysfs_init(void)
     565             : {
     566             :         return 0;
     567             : }
     568             : 
     569             : static inline void sysfs_enable_ns(struct kernfs_node *kn)
     570             : {
     571             : }
     572             : 
     573             : static inline int sysfs_file_change_owner(struct kobject *kobj,
     574             :                                           const char *name, kuid_t kuid,
     575             :                                           kgid_t kgid)
     576             : {
     577             :         return 0;
     578             : }
     579             : 
     580             : static inline int sysfs_link_change_owner(struct kobject *kobj,
     581             :                                           struct kobject *targ,
     582             :                                           const char *name, kuid_t kuid,
     583             :                                           kgid_t kgid)
     584             : {
     585             :         return 0;
     586             : }
     587             : 
     588             : static inline int sysfs_change_owner(struct kobject *kobj, kuid_t kuid, kgid_t kgid)
     589             : {
     590             :         return 0;
     591             : }
     592             : 
     593             : static inline int sysfs_groups_change_owner(struct kobject *kobj,
     594             :                           const struct attribute_group **groups,
     595             :                           kuid_t kuid, kgid_t kgid)
     596             : {
     597             :         return 0;
     598             : }
     599             : 
     600             : static inline int sysfs_group_change_owner(struct kobject *kobj,
     601             :                                            const struct attribute_group *groups,
     602             :                                            kuid_t kuid, kgid_t kgid)
     603             : {
     604             :         return 0;
     605             : }
     606             : 
     607             : __printf(2, 3)
     608             : static inline int sysfs_emit(char *buf, const char *fmt, ...)
     609             : {
     610             :         return 0;
     611             : }
     612             : 
     613             : __printf(3, 4)
     614             : static inline int sysfs_emit_at(char *buf, int at, const char *fmt, ...)
     615             : {
     616             :         return 0;
     617             : }
     618             : #endif /* CONFIG_SYSFS */
     619             : 
     620             : static inline int __must_check sysfs_create_file(struct kobject *kobj,
     621             :                                                  const struct attribute *attr)
     622             : {
     623       60880 :         return sysfs_create_file_ns(kobj, attr, NULL);
     624             : }
     625             : 
     626             : static inline void sysfs_remove_file(struct kobject *kobj,
     627             :                                      const struct attribute *attr)
     628             : {
     629             :         sysfs_remove_file_ns(kobj, attr, NULL);
     630             : }
     631             : 
     632             : static inline int sysfs_rename_link(struct kobject *kobj, struct kobject *target,
     633             :                                     const char *old_name, const char *new_name)
     634             : {
     635             :         return sysfs_rename_link_ns(kobj, target, old_name, new_name, NULL);
     636             : }
     637             : 
     638             : static inline void sysfs_notify_dirent(struct kernfs_node *kn)
     639             : {
     640             :         kernfs_notify(kn);
     641             : }
     642             : 
     643             : static inline struct kernfs_node *sysfs_get_dirent(struct kernfs_node *parent,
     644             :                                                    const char *name)
     645             : {
     646             :         return kernfs_find_and_get(parent, name);
     647             : }
     648             : 
     649             : static inline struct kernfs_node *sysfs_get(struct kernfs_node *kn)
     650             : {
     651             :         kernfs_get(kn);
     652             :         return kn;
     653             : }
     654             : 
     655             : static inline void sysfs_put(struct kernfs_node *kn)
     656             : {
     657             :         kernfs_put(kn);
     658             : }
     659             : 
     660             : #endif /* _SYSFS_H_ */

Generated by: LCOV version 1.14