kobject.h 7.51 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1
2
3
/*
 * kobject.h - generic kernel object infrastructure.
 *
4
5
6
7
 * Copyright (c) 2002-2003 Patrick Mochel
 * Copyright (c) 2002-2003 Open Source Development Labs
 * Copyright (c) 2006-2007 Greg Kroah-Hartman <greg@kroah.com>
 * Copyright (c) 2006-2007 Novell Inc.
Linus Torvalds's avatar
Linus Torvalds committed
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 *
 * This file is released under the GPLv2.
 *
 * 
 * Please read Documentation/kobject.txt before using the kobject
 * interface, ESPECIALLY the parts about reference counts and object
 * destructors. 
 */

#ifndef _KOBJECT_H_
#define _KOBJECT_H_

#ifdef __KERNEL__

#include <linux/types.h>
#include <linux/list.h>
#include <linux/sysfs.h>
25
#include <linux/compiler.h>
Linus Torvalds's avatar
Linus Torvalds committed
26
27
28
#include <linux/spinlock.h>
#include <linux/kref.h>
#include <linux/kernel.h>
29
#include <linux/wait.h>
Linus Torvalds's avatar
Linus Torvalds committed
30
31
#include <asm/atomic.h>

32
33
#define KOBJ_NAME_LEN			20
#define UEVENT_HELPER_PATH_LEN		256
34
35
#define UEVENT_NUM_ENVP			32	/* number of env pointers */
#define UEVENT_BUFFER_SIZE		2048	/* buffer for the variables */
36
37

/* path to the userspace helper executed on an event */
38
extern char uevent_helper[];
39

40
41
/* counter to tag the uevent, read only except for the kobject core */
extern u64 uevent_seqnum;
Linus Torvalds's avatar
Linus Torvalds committed
42

43
44
45
46
47
48
49
50
51
52
/*
 * The actions here must match the index to the string array
 * in lib/kobject_uevent.c
 *
 * Do not add new actions here without checking with the driver-core
 * maintainers. Action strings are not meant to express subsystem
 * or device specific properties. In most cases you want to send a
 * kobject_uevent_env(kobj, KOBJ_CHANGE, env) with additional event
 * specific variables added to the event environment.
 */
53
enum kobject_action {
54
55
56
57
58
59
60
	KOBJ_ADD,
	KOBJ_REMOVE,
	KOBJ_CHANGE,
	KOBJ_MOVE,
	KOBJ_ONLINE,
	KOBJ_OFFLINE,
	KOBJ_MAX
61
62
};

Linus Torvalds's avatar
Linus Torvalds committed
63
struct kobject {
64
	const char		* k_name;
Linus Torvalds's avatar
Linus Torvalds committed
65
66
67
68
69
	struct kref		kref;
	struct list_head	entry;
	struct kobject		* parent;
	struct kset		* kset;
	struct kobj_type	* ktype;
70
	struct sysfs_dirent	* sd;
Linus Torvalds's avatar
Linus Torvalds committed
71
72
73
74
75
};

extern int kobject_set_name(struct kobject *, const char *, ...)
	__attribute__((format(printf,2,3)));

76
static inline const char * kobject_name(const struct kobject * kobj)
Linus Torvalds's avatar
Linus Torvalds committed
77
78
79
80
81
{
	return kobj->k_name;
}

extern void kobject_init(struct kobject *);
82
extern void kobject_init_ng(struct kobject *kobj, struct kobj_type *ktype);
83
extern int __must_check kobject_add(struct kobject *);
84
85
86
extern int __must_check kobject_add_ng(struct kobject *kobj,
				       struct kobject *parent,
				       const char *fmt, ...);
Linus Torvalds's avatar
Linus Torvalds committed
87
88
extern void kobject_del(struct kobject *);

89
extern int __must_check kobject_rename(struct kobject *, const char *new_name);
90
extern int __must_check kobject_move(struct kobject *, struct kobject *);
Linus Torvalds's avatar
Linus Torvalds committed
91

92
extern int __must_check kobject_register(struct kobject *);
Linus Torvalds's avatar
Linus Torvalds committed
93
94
95
96
97
extern void kobject_unregister(struct kobject *);

extern struct kobject * kobject_get(struct kobject *);
extern void kobject_put(struct kobject *);

98
99
extern struct kobject *kobject_kset_add_dir(struct kset *kset,
					    struct kobject *, const char *);
Jun'ichi Nomura's avatar
Jun'ichi Nomura committed
100
101
extern struct kobject *kobject_add_dir(struct kobject *, const char *);

Al Viro's avatar
Al Viro committed
102
extern char * kobject_get_path(struct kobject *, gfp_t);
Linus Torvalds's avatar
Linus Torvalds committed
103
104
105
106
107
108
109

struct kobj_type {
	void (*release)(struct kobject *);
	struct sysfs_ops	* sysfs_ops;
	struct attribute	** default_attrs;
};

110
111
112
113
114
115
116
struct kobj_uevent_env {
	char *envp[UEVENT_NUM_ENVP];
	int envp_idx;
	char buf[UEVENT_BUFFER_SIZE];
	int buflen;
};

Randy Dunlap's avatar
Randy Dunlap committed
117
118
119
struct kset_uevent_ops {
	int (*filter)(struct kset *kset, struct kobject *kobj);
	const char *(*name)(struct kset *kset, struct kobject *kobj);
120
121
	int (*uevent)(struct kset *kset, struct kobject *kobj,
		      struct kobj_uevent_env *env);
Randy Dunlap's avatar
Randy Dunlap committed
122
};
Linus Torvalds's avatar
Linus Torvalds committed
123

124
125
/**
 * struct kset - a set of kobjects of a specific type, belonging to a specific subsystem.
Linus Torvalds's avatar
Linus Torvalds committed
126
 *
127
128
129
130
131
 * A kset defines a group of kobjects.  They can be individually
 * different "types" but overall these kobjects all want to be grouped
 * together and operated on in the same manner.  ksets are used to
 * define the attribute callbacks and other common events that happen to
 * a kobject.
Linus Torvalds's avatar
Linus Torvalds committed
132
 *
133
134
135
136
137
138
139
140
 * @ktype: the struct kobj_type for this specific kset
 * @list: the list of all kobjects for this kset
 * @list_lock: a lock for iterating over the kobjects
 * @kobj: the embedded kobject for this kset (recursion, isn't it fun...)
 * @uevent_ops: the set of uevent operations for this kset.  These are
 * called whenever a kobject has something happen to it so that the kset
 * can add new environment variables, or filter out the uevents if so
 * desired.
Linus Torvalds's avatar
Linus Torvalds committed
141
142
 */
struct kset {
143
	struct kobj_type	*ktype;
Linus Torvalds's avatar
Linus Torvalds committed
144
145
146
	struct list_head	list;
	spinlock_t		list_lock;
	struct kobject		kobj;
147
	struct kset_uevent_ops	*uevent_ops;
Linus Torvalds's avatar
Linus Torvalds committed
148
149
150
151
};


extern void kset_init(struct kset * k);
152
153
extern int __must_check kset_add(struct kset * k);
extern int __must_check kset_register(struct kset * k);
Linus Torvalds's avatar
Linus Torvalds committed
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
extern void kset_unregister(struct kset * k);

static inline struct kset * to_kset(struct kobject * kobj)
{
	return kobj ? container_of(kobj,struct kset,kobj) : NULL;
}

static inline struct kset * kset_get(struct kset * k)
{
	return k ? to_kset(kobject_get(&k->kobj)) : NULL;
}

static inline void kset_put(struct kset * k)
{
	kobject_put(&k->kobj);
}

static inline struct kobj_type * get_ktype(struct kobject * k)
{
	if (k->kset && k->kset->ktype)
		return k->kset->ktype;
	else 
		return k->ktype;
}

extern struct kobject * kset_find_obj(struct kset *, const char *);


Randy Dunlap's avatar
Randy Dunlap committed
182
/*
Linus Torvalds's avatar
Linus Torvalds committed
183
184
185
 * Use this when initializing an embedded kset with no other 
 * fields to initialize.
 */
186
#define set_kset_name(str)	.kset = { .kobj = { .k_name = str } }
Linus Torvalds's avatar
Linus Torvalds committed
187
188


189
#define decl_subsys(_name,_type,_uevent_ops) \
190
struct kset _name##_subsys = { \
191
	.kobj = { .k_name = __stringify(_name) }, \
192
193
	.ktype = _type, \
	.uevent_ops =_uevent_ops, \
Linus Torvalds's avatar
Linus Torvalds committed
194
}
195
#define decl_subsys_name(_varname,_name,_type,_uevent_ops) \
196
struct kset _varname##_subsys = { \
197
	.kobj = { .k_name = __stringify(_name) }, \
198
199
	.ktype = _type, \
	.uevent_ops =_uevent_ops, \
Linus Torvalds's avatar
Linus Torvalds committed
200
201
202
}

/* The global /sys/kernel/ subsystem for people to chain off of */
203
extern struct kset kernel_subsys;
204
/* The global /sys/hypervisor/ subsystem  */
205
extern struct kset hypervisor_subsys;
Linus Torvalds's avatar
Linus Torvalds committed
206

Randy Dunlap's avatar
Randy Dunlap committed
207
/*
Linus Torvalds's avatar
Linus Torvalds committed
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
 * Helpers for setting the kset of registered objects.
 * Often, a registered object belongs to a kset embedded in a 
 * subsystem. These do no magic, just make the resulting code
 * easier to follow. 
 */

/**
 *	kobj_set_kset_s(obj,subsys) - set kset for embedded kobject.
 *	@obj:		ptr to some object type.
 *	@subsys:	a subsystem object (not a ptr).
 *
 *	Can be used for any object type with an embedded ->kobj.
 */

#define kobj_set_kset_s(obj,subsys) \
223
	(obj)->kobj.kset = &(subsys)
Linus Torvalds's avatar
Linus Torvalds committed
224

225
226
extern int __must_check subsystem_register(struct kset *);
extern void subsystem_unregister(struct kset *);
Linus Torvalds's avatar
Linus Torvalds committed
227
228
229

struct subsys_attribute {
	struct attribute attr;
230
231
	ssize_t (*show)(struct kset *, char *);
	ssize_t (*store)(struct kset *, const char *, size_t);
Linus Torvalds's avatar
Linus Torvalds committed
232
233
};

234
extern int __must_check subsys_create_file(struct kset *,
235
					struct subsys_attribute *);
Linus Torvalds's avatar
Linus Torvalds committed
236

Kay Sievers's avatar
Kay Sievers committed
237
#if defined(CONFIG_HOTPLUG)
238
239
int kobject_uevent(struct kobject *kobj, enum kobject_action action);
int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
240
			char *envp[]);
241

242
243
int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...)
	__attribute__((format (printf, 2, 3)));
244
245
246

int kobject_action_type(const char *buf, size_t count,
			enum kobject_action *type);
Linus Torvalds's avatar
Linus Torvalds committed
247
#else
248
249
250
static inline int kobject_uevent(struct kobject *kobj, enum kobject_action action)
{ return 0; }
static inline int kobject_uevent_env(struct kobject *kobj,
251
252
				      enum kobject_action action,
				      char *envp[])
253
{ return 0; }
254

255
static inline int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...)
Linus Torvalds's avatar
Linus Torvalds committed
256
{ return 0; }
257
258
259
260

static inline int kobject_action_type(const char *buf, size_t count,
			enum kobject_action *type)
{ return -EINVAL; }
Linus Torvalds's avatar
Linus Torvalds committed
261
262
263
264
#endif

#endif /* __KERNEL__ */
#endif /* _KOBJECT_H_ */