LCOV - code coverage report
Current view: top level - include/linux - sysfs.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 4 5 80.0 %
Date: 2022-12-09 01:23:36 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             : struct sysfs_ops {
     239             :         ssize_t (*show)(struct kobject *, struct attribute *, char *);
     240             :         ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t);
     241             : };
     242             : 
     243             : #ifdef CONFIG_SYSFS
     244             : 
     245             : int __must_check sysfs_create_dir_ns(struct kobject *kobj, const void *ns);
     246             : void sysfs_remove_dir(struct kobject *kobj);
     247             : int __must_check sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name,
     248             :                                      const void *new_ns);
     249             : int __must_check sysfs_move_dir_ns(struct kobject *kobj,
     250             :                                    struct kobject *new_parent_kobj,
     251             :                                    const void *new_ns);
     252             : int __must_check sysfs_create_mount_point(struct kobject *parent_kobj,
     253             :                                           const char *name);
     254             : void sysfs_remove_mount_point(struct kobject *parent_kobj,
     255             :                               const char *name);
     256             : 
     257             : int __must_check sysfs_create_file_ns(struct kobject *kobj,
     258             :                                       const struct attribute *attr,
     259             :                                       const void *ns);
     260             : int __must_check sysfs_create_files(struct kobject *kobj,
     261             :                                    const struct attribute * const *attr);
     262             : int __must_check sysfs_chmod_file(struct kobject *kobj,
     263             :                                   const struct attribute *attr, umode_t mode);
     264             : struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj,
     265             :                                                   const struct attribute *attr);
     266             : void sysfs_unbreak_active_protection(struct kernfs_node *kn);
     267             : void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
     268             :                           const void *ns);
     269             : bool sysfs_remove_file_self(struct kobject *kobj, const struct attribute *attr);
     270             : void sysfs_remove_files(struct kobject *kobj, const struct attribute * const *attr);
     271             : 
     272             : int __must_check sysfs_create_bin_file(struct kobject *kobj,
     273             :                                        const struct bin_attribute *attr);
     274             : void sysfs_remove_bin_file(struct kobject *kobj,
     275             :                            const struct bin_attribute *attr);
     276             : 
     277             : int __must_check sysfs_create_link(struct kobject *kobj, struct kobject *target,
     278             :                                    const char *name);
     279             : int __must_check sysfs_create_link_nowarn(struct kobject *kobj,
     280             :                                           struct kobject *target,
     281             :                                           const char *name);
     282             : void sysfs_remove_link(struct kobject *kobj, const char *name);
     283             : 
     284             : int sysfs_rename_link_ns(struct kobject *kobj, struct kobject *target,
     285             :                          const char *old_name, const char *new_name,
     286             :                          const void *new_ns);
     287             : 
     288             : void sysfs_delete_link(struct kobject *dir, struct kobject *targ,
     289             :                         const char *name);
     290             : 
     291             : int __must_check sysfs_create_group(struct kobject *kobj,
     292             :                                     const struct attribute_group *grp);
     293             : int __must_check sysfs_create_groups(struct kobject *kobj,
     294             :                                      const struct attribute_group **groups);
     295             : int __must_check sysfs_update_groups(struct kobject *kobj,
     296             :                                      const struct attribute_group **groups);
     297             : int sysfs_update_group(struct kobject *kobj,
     298             :                        const struct attribute_group *grp);
     299             : void sysfs_remove_group(struct kobject *kobj,
     300             :                         const struct attribute_group *grp);
     301             : void sysfs_remove_groups(struct kobject *kobj,
     302             :                          const struct attribute_group **groups);
     303             : int sysfs_add_file_to_group(struct kobject *kobj,
     304             :                         const struct attribute *attr, const char *group);
     305             : void sysfs_remove_file_from_group(struct kobject *kobj,
     306             :                         const struct attribute *attr, const char *group);
     307             : int sysfs_merge_group(struct kobject *kobj,
     308             :                        const struct attribute_group *grp);
     309             : void sysfs_unmerge_group(struct kobject *kobj,
     310             :                        const struct attribute_group *grp);
     311             : int sysfs_add_link_to_group(struct kobject *kobj, const char *group_name,
     312             :                             struct kobject *target, const char *link_name);
     313             : void sysfs_remove_link_from_group(struct kobject *kobj, const char *group_name,
     314             :                                   const char *link_name);
     315             : int compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
     316             :                                          struct kobject *target_kobj,
     317             :                                          const char *target_name,
     318             :                                          const char *symlink_name);
     319             : 
     320             : void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);
     321             : 
     322             : int __must_check sysfs_init(void);
     323             : 
     324             : static inline void sysfs_enable_ns(struct kernfs_node *kn)
     325             : {
     326           0 :         return kernfs_enable_ns(kn);
     327             : }
     328             : 
     329             : int sysfs_file_change_owner(struct kobject *kobj, const char *name, kuid_t kuid,
     330             :                             kgid_t kgid);
     331             : int sysfs_change_owner(struct kobject *kobj, kuid_t kuid, kgid_t kgid);
     332             : int sysfs_link_change_owner(struct kobject *kobj, struct kobject *targ,
     333             :                             const char *name, kuid_t kuid, kgid_t kgid);
     334             : int sysfs_groups_change_owner(struct kobject *kobj,
     335             :                               const struct attribute_group **groups,
     336             :                               kuid_t kuid, kgid_t kgid);
     337             : int sysfs_group_change_owner(struct kobject *kobj,
     338             :                              const struct attribute_group *groups, kuid_t kuid,
     339             :                              kgid_t kgid);
     340             : __printf(2, 3)
     341             : int sysfs_emit(char *buf, const char *fmt, ...);
     342             : __printf(3, 4)
     343             : int sysfs_emit_at(char *buf, int at, const char *fmt, ...);
     344             : 
     345             : #else /* CONFIG_SYSFS */
     346             : 
     347             : static inline int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
     348             : {
     349             :         return 0;
     350             : }
     351             : 
     352             : static inline void sysfs_remove_dir(struct kobject *kobj)
     353             : {
     354             : }
     355             : 
     356             : static inline int sysfs_rename_dir_ns(struct kobject *kobj,
     357             :                                       const char *new_name, const void *new_ns)
     358             : {
     359             :         return 0;
     360             : }
     361             : 
     362             : static inline int sysfs_move_dir_ns(struct kobject *kobj,
     363             :                                     struct kobject *new_parent_kobj,
     364             :                                     const void *new_ns)
     365             : {
     366             :         return 0;
     367             : }
     368             : 
     369             : static inline int sysfs_create_mount_point(struct kobject *parent_kobj,
     370             :                                            const char *name)
     371             : {
     372             :         return 0;
     373             : }
     374             : 
     375             : static inline void sysfs_remove_mount_point(struct kobject *parent_kobj,
     376             :                                             const char *name)
     377             : {
     378             : }
     379             : 
     380             : static inline int sysfs_create_file_ns(struct kobject *kobj,
     381             :                                        const struct attribute *attr,
     382             :                                        const void *ns)
     383             : {
     384             :         return 0;
     385             : }
     386             : 
     387             : static inline int sysfs_create_files(struct kobject *kobj,
     388             :                                     const struct attribute * const *attr)
     389             : {
     390             :         return 0;
     391             : }
     392             : 
     393             : static inline int sysfs_chmod_file(struct kobject *kobj,
     394             :                                    const struct attribute *attr, umode_t mode)
     395             : {
     396             :         return 0;
     397             : }
     398             : 
     399             : static inline struct kernfs_node *
     400             : sysfs_break_active_protection(struct kobject *kobj,
     401             :                               const struct attribute *attr)
     402             : {
     403             :         return NULL;
     404             : }
     405             : 
     406             : static inline void sysfs_unbreak_active_protection(struct kernfs_node *kn)
     407             : {
     408             : }
     409             : 
     410             : static inline void sysfs_remove_file_ns(struct kobject *kobj,
     411             :                                         const struct attribute *attr,
     412             :                                         const void *ns)
     413             : {
     414             : }
     415             : 
     416             : static inline bool sysfs_remove_file_self(struct kobject *kobj,
     417             :                                           const struct attribute *attr)
     418             : {
     419             :         return false;
     420             : }
     421             : 
     422             : static inline void sysfs_remove_files(struct kobject *kobj,
     423             :                                      const struct attribute * const *attr)
     424             : {
     425             : }
     426             : 
     427             : static inline int sysfs_create_bin_file(struct kobject *kobj,
     428             :                                         const struct bin_attribute *attr)
     429             : {
     430             :         return 0;
     431             : }
     432             : 
     433             : static inline void sysfs_remove_bin_file(struct kobject *kobj,
     434             :                                          const struct bin_attribute *attr)
     435             : {
     436             : }
     437             : 
     438             : static inline int sysfs_create_link(struct kobject *kobj,
     439             :                                     struct kobject *target, const char *name)
     440             : {
     441             :         return 0;
     442             : }
     443             : 
     444             : static inline int sysfs_create_link_nowarn(struct kobject *kobj,
     445             :                                            struct kobject *target,
     446             :                                            const char *name)
     447             : {
     448             :         return 0;
     449             : }
     450             : 
     451             : static inline void sysfs_remove_link(struct kobject *kobj, const char *name)
     452             : {
     453             : }
     454             : 
     455             : static inline int sysfs_rename_link_ns(struct kobject *k, struct kobject *t,
     456             :                                        const char *old_name,
     457             :                                        const char *new_name, const void *ns)
     458             : {
     459             :         return 0;
     460             : }
     461             : 
     462             : static inline void sysfs_delete_link(struct kobject *k, struct kobject *t,
     463             :                                      const char *name)
     464             : {
     465             : }
     466             : 
     467             : static inline int sysfs_create_group(struct kobject *kobj,
     468             :                                      const struct attribute_group *grp)
     469             : {
     470             :         return 0;
     471             : }
     472             : 
     473             : static inline int sysfs_create_groups(struct kobject *kobj,
     474             :                                       const struct attribute_group **groups)
     475             : {
     476             :         return 0;
     477             : }
     478             : 
     479             : static inline int sysfs_update_groups(struct kobject *kobj,
     480             :                                       const struct attribute_group **groups)
     481             : {
     482             :         return 0;
     483             : }
     484             : 
     485             : static inline int sysfs_update_group(struct kobject *kobj,
     486             :                                 const struct attribute_group *grp)
     487             : {
     488             :         return 0;
     489             : }
     490             : 
     491             : static inline void sysfs_remove_group(struct kobject *kobj,
     492             :                                       const struct attribute_group *grp)
     493             : {
     494             : }
     495             : 
     496             : static inline void sysfs_remove_groups(struct kobject *kobj,
     497             :                                        const struct attribute_group **groups)
     498             : {
     499             : }
     500             : 
     501             : static inline int sysfs_add_file_to_group(struct kobject *kobj,
     502             :                 const struct attribute *attr, const char *group)
     503             : {
     504             :         return 0;
     505             : }
     506             : 
     507             : static inline void sysfs_remove_file_from_group(struct kobject *kobj,
     508             :                 const struct attribute *attr, const char *group)
     509             : {
     510             : }
     511             : 
     512             : static inline int sysfs_merge_group(struct kobject *kobj,
     513             :                        const struct attribute_group *grp)
     514             : {
     515             :         return 0;
     516             : }
     517             : 
     518             : static inline void sysfs_unmerge_group(struct kobject *kobj,
     519             :                        const struct attribute_group *grp)
     520             : {
     521             : }
     522             : 
     523             : static inline int sysfs_add_link_to_group(struct kobject *kobj,
     524             :                 const char *group_name, struct kobject *target,
     525             :                 const char *link_name)
     526             : {
     527             :         return 0;
     528             : }
     529             : 
     530             : static inline void sysfs_remove_link_from_group(struct kobject *kobj,
     531             :                 const char *group_name, const char *link_name)
     532             : {
     533             : }
     534             : 
     535             : static inline int compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
     536             :                                                        struct kobject *target_kobj,
     537             :                                                        const char *target_name,
     538             :                                                        const char *symlink_name)
     539             : {
     540             :         return 0;
     541             : }
     542             : 
     543             : static inline void sysfs_notify(struct kobject *kobj, const char *dir,
     544             :                                 const char *attr)
     545             : {
     546             : }
     547             : 
     548             : static inline int __must_check sysfs_init(void)
     549             : {
     550             :         return 0;
     551             : }
     552             : 
     553             : static inline void sysfs_enable_ns(struct kernfs_node *kn)
     554             : {
     555             : }
     556             : 
     557             : static inline int sysfs_file_change_owner(struct kobject *kobj,
     558             :                                           const char *name, kuid_t kuid,
     559             :                                           kgid_t kgid)
     560             : {
     561             :         return 0;
     562             : }
     563             : 
     564             : static inline int sysfs_link_change_owner(struct kobject *kobj,
     565             :                                           struct kobject *targ,
     566             :                                           const char *name, kuid_t kuid,
     567             :                                           kgid_t kgid)
     568             : {
     569             :         return 0;
     570             : }
     571             : 
     572             : static inline int sysfs_change_owner(struct kobject *kobj, kuid_t kuid, kgid_t kgid)
     573             : {
     574             :         return 0;
     575             : }
     576             : 
     577             : static inline int sysfs_groups_change_owner(struct kobject *kobj,
     578             :                           const struct attribute_group **groups,
     579             :                           kuid_t kuid, kgid_t kgid)
     580             : {
     581             :         return 0;
     582             : }
     583             : 
     584             : static inline int sysfs_group_change_owner(struct kobject *kobj,
     585             :                                            const struct attribute_group *groups,
     586             :                                            kuid_t kuid, kgid_t kgid)
     587             : {
     588             :         return 0;
     589             : }
     590             : 
     591             : __printf(2, 3)
     592             : static inline int sysfs_emit(char *buf, const char *fmt, ...)
     593             : {
     594             :         return 0;
     595             : }
     596             : 
     597             : __printf(3, 4)
     598             : static inline int sysfs_emit_at(char *buf, int at, const char *fmt, ...)
     599             : {
     600             :         return 0;
     601             : }
     602             : #endif /* CONFIG_SYSFS */
     603             : 
     604             : static inline int __must_check sysfs_create_file(struct kobject *kobj,
     605             :                                                  const struct attribute *attr)
     606             : {
     607        1154 :         return sysfs_create_file_ns(kobj, attr, NULL);
     608             : }
     609             : 
     610             : static inline void sysfs_remove_file(struct kobject *kobj,
     611             :                                      const struct attribute *attr)
     612             : {
     613           3 :         sysfs_remove_file_ns(kobj, attr, NULL);
     614             : }
     615             : 
     616             : static inline int sysfs_rename_link(struct kobject *kobj, struct kobject *target,
     617             :                                     const char *old_name, const char *new_name)
     618             : {
     619             :         return sysfs_rename_link_ns(kobj, target, old_name, new_name, NULL);
     620             : }
     621             : 
     622             : static inline void sysfs_notify_dirent(struct kernfs_node *kn)
     623             : {
     624             :         kernfs_notify(kn);
     625             : }
     626             : 
     627             : static inline struct kernfs_node *sysfs_get_dirent(struct kernfs_node *parent,
     628             :                                                    const char *name)
     629             : {
     630             :         return kernfs_find_and_get(parent, name);
     631             : }
     632             : 
     633             : static inline struct kernfs_node *sysfs_get(struct kernfs_node *kn)
     634             : {
     635         711 :         kernfs_get(kn);
     636             :         return kn;
     637             : }
     638             : 
     639             : static inline void sysfs_put(struct kernfs_node *kn)
     640             : {
     641           1 :         kernfs_put(kn);
     642             : }
     643             : 
     644             : #endif /* _SYSFS_H_ */

Generated by: LCOV version 1.14