diff options
Diffstat (limited to 'include/linux/kobject.h')
-rw-r--r-- | include/linux/kobject.h | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/include/linux/kobject.h b/include/linux/kobject.h index 7f7403aa4a41..2a8d8da70961 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h | |||
@@ -23,14 +23,27 @@ | |||
23 | #include <linux/spinlock.h> | 23 | #include <linux/spinlock.h> |
24 | #include <linux/rwsem.h> | 24 | #include <linux/rwsem.h> |
25 | #include <linux/kref.h> | 25 | #include <linux/kref.h> |
26 | #include <linux/kobject_uevent.h> | ||
27 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
28 | #include <asm/atomic.h> | 27 | #include <asm/atomic.h> |
29 | 28 | ||
30 | #define KOBJ_NAME_LEN 20 | 29 | #define KOBJ_NAME_LEN 20 |
30 | #define UEVENT_HELPER_PATH_LEN 256 | ||
31 | 31 | ||
32 | /* counter to tag the hotplug event, read only except for the kobject core */ | 32 | /* path to the userspace helper executed on an event */ |
33 | extern u64 hotplug_seqnum; | 33 | extern char uevent_helper[]; |
34 | |||
35 | /* counter to tag the uevent, read only except for the kobject core */ | ||
36 | extern u64 uevent_seqnum; | ||
37 | |||
38 | /* the actions here must match the proper string in lib/kobject_uevent.c */ | ||
39 | typedef int __bitwise kobject_action_t; | ||
40 | enum kobject_action { | ||
41 | KOBJ_ADD = (__force kobject_action_t) 0x01, /* exclusive to core */ | ||
42 | KOBJ_REMOVE = (__force kobject_action_t) 0x02, /* exclusive to core */ | ||
43 | KOBJ_CHANGE = (__force kobject_action_t) 0x03, /* device state change */ | ||
44 | KOBJ_OFFLINE = (__force kobject_action_t) 0x04, /* device offline */ | ||
45 | KOBJ_ONLINE = (__force kobject_action_t) 0x05, /* device online */ | ||
46 | }; | ||
34 | 47 | ||
35 | struct kobject { | 48 | struct kobject { |
36 | const char * k_name; | 49 | const char * k_name; |
@@ -87,15 +100,14 @@ struct kobj_type { | |||
87 | * of object; multiple ksets can belong to one subsystem. All | 100 | * of object; multiple ksets can belong to one subsystem. All |
88 | * ksets of a subsystem share the subsystem's lock. | 101 | * ksets of a subsystem share the subsystem's lock. |
89 | * | 102 | * |
90 | * Each kset can support hotplugging; if it does, it will be given | 103 | * Each kset can support specific event variables; it can |
91 | * the opportunity to filter out specific kobjects from being | 104 | * supress the event generation or add subsystem specific |
92 | * reported, as well as to add its own "data" elements to the | 105 | * variables carried with the event. |
93 | * environment being passed to the hotplug helper. | ||
94 | */ | 106 | */ |
95 | struct kset_hotplug_ops { | 107 | struct kset_uevent_ops { |
96 | int (*filter)(struct kset *kset, struct kobject *kobj); | 108 | int (*filter)(struct kset *kset, struct kobject *kobj); |
97 | const char *(*name)(struct kset *kset, struct kobject *kobj); | 109 | const char *(*name)(struct kset *kset, struct kobject *kobj); |
98 | int (*hotplug)(struct kset *kset, struct kobject *kobj, char **envp, | 110 | int (*uevent)(struct kset *kset, struct kobject *kobj, char **envp, |
99 | int num_envp, char *buffer, int buffer_size); | 111 | int num_envp, char *buffer, int buffer_size); |
100 | }; | 112 | }; |
101 | 113 | ||
@@ -105,7 +117,7 @@ struct kset { | |||
105 | struct list_head list; | 117 | struct list_head list; |
106 | spinlock_t list_lock; | 118 | spinlock_t list_lock; |
107 | struct kobject kobj; | 119 | struct kobject kobj; |
108 | struct kset_hotplug_ops * hotplug_ops; | 120 | struct kset_uevent_ops * uevent_ops; |
109 | }; | 121 | }; |
110 | 122 | ||
111 | 123 | ||
@@ -153,20 +165,20 @@ struct subsystem { | |||
153 | struct rw_semaphore rwsem; | 165 | struct rw_semaphore rwsem; |
154 | }; | 166 | }; |
155 | 167 | ||
156 | #define decl_subsys(_name,_type,_hotplug_ops) \ | 168 | #define decl_subsys(_name,_type,_uevent_ops) \ |
157 | struct subsystem _name##_subsys = { \ | 169 | struct subsystem _name##_subsys = { \ |
158 | .kset = { \ | 170 | .kset = { \ |
159 | .kobj = { .name = __stringify(_name) }, \ | 171 | .kobj = { .name = __stringify(_name) }, \ |
160 | .ktype = _type, \ | 172 | .ktype = _type, \ |
161 | .hotplug_ops =_hotplug_ops, \ | 173 | .uevent_ops =_uevent_ops, \ |
162 | } \ | 174 | } \ |
163 | } | 175 | } |
164 | #define decl_subsys_name(_varname,_name,_type,_hotplug_ops) \ | 176 | #define decl_subsys_name(_varname,_name,_type,_uevent_ops) \ |
165 | struct subsystem _varname##_subsys = { \ | 177 | struct subsystem _varname##_subsys = { \ |
166 | .kset = { \ | 178 | .kset = { \ |
167 | .kobj = { .name = __stringify(_name) }, \ | 179 | .kobj = { .name = __stringify(_name) }, \ |
168 | .ktype = _type, \ | 180 | .ktype = _type, \ |
169 | .hotplug_ops =_hotplug_ops, \ | 181 | .uevent_ops =_uevent_ops, \ |
170 | } \ | 182 | } \ |
171 | } | 183 | } |
172 | 184 | ||
@@ -241,15 +253,17 @@ struct subsys_attribute { | |||
241 | extern int subsys_create_file(struct subsystem * , struct subsys_attribute *); | 253 | extern int subsys_create_file(struct subsystem * , struct subsys_attribute *); |
242 | extern void subsys_remove_file(struct subsystem * , struct subsys_attribute *); | 254 | extern void subsys_remove_file(struct subsystem * , struct subsys_attribute *); |
243 | 255 | ||
244 | #ifdef CONFIG_HOTPLUG | 256 | #if defined(CONFIG_HOTPLUG) & defined(CONFIG_NET) |
245 | void kobject_hotplug(struct kobject *kobj, enum kobject_action action); | 257 | void kobject_uevent(struct kobject *kobj, enum kobject_action action); |
246 | int add_hotplug_env_var(char **envp, int num_envp, int *cur_index, | 258 | |
259 | int add_uevent_var(char **envp, int num_envp, int *cur_index, | ||
247 | char *buffer, int buffer_size, int *cur_len, | 260 | char *buffer, int buffer_size, int *cur_len, |
248 | const char *format, ...) | 261 | const char *format, ...) |
249 | __attribute__((format (printf, 7, 8))); | 262 | __attribute__((format (printf, 7, 8))); |
250 | #else | 263 | #else |
251 | static inline void kobject_hotplug(struct kobject *kobj, enum kobject_action action) { } | 264 | static inline void kobject_uevent(struct kobject *kobj, enum kobject_action action) { } |
252 | static inline int add_hotplug_env_var(char **envp, int num_envp, int *cur_index, | 265 | |
266 | static inline int add_uevent_var(char **envp, int num_envp, int *cur_index, | ||
253 | char *buffer, int buffer_size, int *cur_len, | 267 | char *buffer, int buffer_size, int *cur_len, |
254 | const char *format, ...) | 268 | const char *format, ...) |
255 | { return 0; } | 269 | { return 0; } |