LCOV - code coverage report
Current view: top level - include/linux - kobject.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1 2 50.0 %
Date: 2014-02-18 Functions: 0 0 -
Branches: 1 14 7.1 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * kobject.h - generic kernel object infrastructure.
       3                 :            :  *
       4                 :            :  * Copyright (c) 2002-2003 Patrick Mochel
       5                 :            :  * Copyright (c) 2002-2003 Open Source Development Labs
       6                 :            :  * Copyright (c) 2006-2008 Greg Kroah-Hartman <greg@kroah.com>
       7                 :            :  * Copyright (c) 2006-2008 Novell Inc.
       8                 :            :  *
       9                 :            :  * This file is released under the GPLv2.
      10                 :            :  *
      11                 :            :  * Please read Documentation/kobject.txt before using the kobject
      12                 :            :  * interface, ESPECIALLY the parts about reference counts and object
      13                 :            :  * destructors.
      14                 :            :  */
      15                 :            : 
      16                 :            : #ifndef _KOBJECT_H_
      17                 :            : #define _KOBJECT_H_
      18                 :            : 
      19                 :            : #include <linux/types.h>
      20                 :            : #include <linux/list.h>
      21                 :            : #include <linux/sysfs.h>
      22                 :            : #include <linux/compiler.h>
      23                 :            : #include <linux/spinlock.h>
      24                 :            : #include <linux/kref.h>
      25                 :            : #include <linux/kobject_ns.h>
      26                 :            : #include <linux/kernel.h>
      27                 :            : #include <linux/wait.h>
      28                 :            : #include <linux/atomic.h>
      29                 :            : #include <linux/workqueue.h>
      30                 :            : 
      31                 :            : #define UEVENT_HELPER_PATH_LEN          256
      32                 :            : #define UEVENT_NUM_ENVP                 32      /* number of env pointers */
      33                 :            : #define UEVENT_BUFFER_SIZE              2048    /* buffer for the variables */
      34                 :            : 
      35                 :            : /* path to the userspace helper executed on an event */
      36                 :            : extern char uevent_helper[];
      37                 :            : 
      38                 :            : /* counter to tag the uevent, read only except for the kobject core */
      39                 :            : extern u64 uevent_seqnum;
      40                 :            : 
      41                 :            : /*
      42                 :            :  * The actions here must match the index to the string array
      43                 :            :  * in lib/kobject_uevent.c
      44                 :            :  *
      45                 :            :  * Do not add new actions here without checking with the driver-core
      46                 :            :  * maintainers. Action strings are not meant to express subsystem
      47                 :            :  * or device specific properties. In most cases you want to send a
      48                 :            :  * kobject_uevent_env(kobj, KOBJ_CHANGE, env) with additional event
      49                 :            :  * specific variables added to the event environment.
      50                 :            :  */
      51                 :            : enum kobject_action {
      52                 :            :         KOBJ_ADD,
      53                 :            :         KOBJ_REMOVE,
      54                 :            :         KOBJ_CHANGE,
      55                 :            :         KOBJ_MOVE,
      56                 :            :         KOBJ_ONLINE,
      57                 :            :         KOBJ_OFFLINE,
      58                 :            :         KOBJ_MAX
      59                 :            : };
      60                 :            : 
      61                 :            : struct kobject {
      62                 :            :         const char              *name;
      63                 :            :         struct list_head        entry;
      64                 :            :         struct kobject          *parent;
      65                 :            :         struct kset             *kset;
      66                 :            :         struct kobj_type        *ktype;
      67                 :            :         struct sysfs_dirent     *sd;
      68                 :            :         struct kref             kref;
      69                 :            : #ifdef CONFIG_DEBUG_KOBJECT_RELEASE
      70                 :            :         struct delayed_work     release;
      71                 :            : #endif
      72                 :            :         unsigned int state_initialized:1;
      73                 :            :         unsigned int state_in_sysfs:1;
      74                 :            :         unsigned int state_add_uevent_sent:1;
      75                 :            :         unsigned int state_remove_uevent_sent:1;
      76                 :            :         unsigned int uevent_suppress:1;
      77                 :            : };
      78                 :            : 
      79                 :            : extern __printf(2, 3)
      80                 :            : int kobject_set_name(struct kobject *kobj, const char *name, ...);
      81                 :            : extern int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
      82                 :            :                                   va_list vargs);
      83                 :            : 
      84                 :            : static inline const char *kobject_name(const struct kobject *kobj)
      85                 :            : {
      86                 :            :         return kobj->name;
      87                 :            : }
      88                 :            : 
      89                 :            : extern void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
      90                 :            : extern __printf(3, 4) __must_check
      91                 :            : int kobject_add(struct kobject *kobj, struct kobject *parent,
      92                 :            :                 const char *fmt, ...);
      93                 :            : extern __printf(4, 5) __must_check
      94                 :            : int kobject_init_and_add(struct kobject *kobj,
      95                 :            :                          struct kobj_type *ktype, struct kobject *parent,
      96                 :            :                          const char *fmt, ...);
      97                 :            : 
      98                 :            : extern void kobject_del(struct kobject *kobj);
      99                 :            : 
     100                 :            : extern struct kobject * __must_check kobject_create(void);
     101                 :            : extern struct kobject * __must_check kobject_create_and_add(const char *name,
     102                 :            :                                                 struct kobject *parent);
     103                 :            : 
     104                 :            : extern int __must_check kobject_rename(struct kobject *, const char *new_name);
     105                 :            : extern int __must_check kobject_move(struct kobject *, struct kobject *);
     106                 :            : 
     107                 :            : extern struct kobject *kobject_get(struct kobject *kobj);
     108                 :            : extern void kobject_put(struct kobject *kobj);
     109                 :            : 
     110                 :            : extern const void *kobject_namespace(struct kobject *kobj);
     111                 :            : extern char *kobject_get_path(struct kobject *kobj, gfp_t flag);
     112                 :            : 
     113                 :            : struct kobj_type {
     114                 :            :         void (*release)(struct kobject *kobj);
     115                 :            :         const struct sysfs_ops *sysfs_ops;
     116                 :            :         struct attribute **default_attrs;
     117                 :            :         const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
     118                 :            :         const void *(*namespace)(struct kobject *kobj);
     119                 :            : };
     120                 :            : 
     121                 :            : struct kobj_uevent_env {
     122                 :            :         char *envp[UEVENT_NUM_ENVP];
     123                 :            :         int envp_idx;
     124                 :            :         char buf[UEVENT_BUFFER_SIZE];
     125                 :            :         int buflen;
     126                 :            : };
     127                 :            : 
     128                 :            : struct kset_uevent_ops {
     129                 :            :         int (* const filter)(struct kset *kset, struct kobject *kobj);
     130                 :            :         const char *(* const name)(struct kset *kset, struct kobject *kobj);
     131                 :            :         int (* const uevent)(struct kset *kset, struct kobject *kobj,
     132                 :            :                       struct kobj_uevent_env *env);
     133                 :            : };
     134                 :            : 
     135                 :            : struct kobj_attribute {
     136                 :            :         struct attribute attr;
     137                 :            :         ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
     138                 :            :                         char *buf);
     139                 :            :         ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
     140                 :            :                          const char *buf, size_t count);
     141                 :            : };
     142                 :            : 
     143                 :            : extern const struct sysfs_ops kobj_sysfs_ops;
     144                 :            : 
     145                 :            : struct sock;
     146                 :            : 
     147                 :            : /**
     148                 :            :  * struct kset - a set of kobjects of a specific type, belonging to a specific subsystem.
     149                 :            :  *
     150                 :            :  * A kset defines a group of kobjects.  They can be individually
     151                 :            :  * different "types" but overall these kobjects all want to be grouped
     152                 :            :  * together and operated on in the same manner.  ksets are used to
     153                 :            :  * define the attribute callbacks and other common events that happen to
     154                 :            :  * a kobject.
     155                 :            :  *
     156                 :            :  * @list: the list of all kobjects for this kset
     157                 :            :  * @list_lock: a lock for iterating over the kobjects
     158                 :            :  * @kobj: the embedded kobject for this kset (recursion, isn't it fun...)
     159                 :            :  * @uevent_ops: the set of uevent operations for this kset.  These are
     160                 :            :  * called whenever a kobject has something happen to it so that the kset
     161                 :            :  * can add new environment variables, or filter out the uevents if so
     162                 :            :  * desired.
     163                 :            :  */
     164                 :            : struct kset {
     165                 :            :         struct list_head list;
     166                 :            :         spinlock_t list_lock;
     167                 :            :         struct kobject kobj;
     168                 :            :         const struct kset_uevent_ops *uevent_ops;
     169                 :            : };
     170                 :            : 
     171                 :            : extern void kset_init(struct kset *kset);
     172                 :            : extern int __must_check kset_register(struct kset *kset);
     173                 :            : extern void kset_unregister(struct kset *kset);
     174                 :            : extern struct kset * __must_check kset_create_and_add(const char *name,
     175                 :            :                                                 const struct kset_uevent_ops *u,
     176                 :            :                                                 struct kobject *parent_kobj);
     177                 :            : 
     178                 :            : static inline struct kset *to_kset(struct kobject *kobj)
     179                 :            : {
     180                 :            :         return kobj ? container_of(kobj, struct kset, kobj) : NULL;
     181                 :            : }
     182                 :            : 
     183                 :            : static inline struct kset *kset_get(struct kset *k)
     184                 :            : {
     185 [ +  - ][ #  # ]:        112 :         return k ? to_kset(kobject_get(&k->kobj)) : NULL;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     186                 :            : }
     187                 :            : 
     188                 :            : static inline void kset_put(struct kset *k)
     189                 :            : {
     190                 :          0 :         kobject_put(&k->kobj);
     191                 :            : }
     192                 :            : 
     193                 :            : static inline struct kobj_type *get_ktype(struct kobject *kobj)
     194                 :            : {
     195                 :            :         return kobj->ktype;
     196                 :            : }
     197                 :            : 
     198                 :            : extern struct kobject *kset_find_obj(struct kset *, const char *);
     199                 :            : 
     200                 :            : /* The global /sys/kernel/ kobject for people to chain off of */
     201                 :            : extern struct kobject *kernel_kobj;
     202                 :            : /* The global /sys/kernel/mm/ kobject for people to chain off of */
     203                 :            : extern struct kobject *mm_kobj;
     204                 :            : /* The global /sys/hypervisor/ kobject for people to chain off of */
     205                 :            : extern struct kobject *hypervisor_kobj;
     206                 :            : /* The global /sys/power/ kobject for people to chain off of */
     207                 :            : extern struct kobject *power_kobj;
     208                 :            : /* The global /sys/firmware/ kobject for people to chain off of */
     209                 :            : extern struct kobject *firmware_kobj;
     210                 :            : 
     211                 :            : int kobject_uevent(struct kobject *kobj, enum kobject_action action);
     212                 :            : int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
     213                 :            :                         char *envp[]);
     214                 :            : 
     215                 :            : __printf(2, 3)
     216                 :            : int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...);
     217                 :            : 
     218                 :            : int kobject_action_type(const char *buf, size_t count,
     219                 :            :                         enum kobject_action *type);
     220                 :            : 
     221                 :            : #endif /* _KOBJECT_H_ */

Generated by: LCOV version 1.9