kobject.c 26.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4
/*
 * kobject.c - library routines for handling generic kernel objects
 *
 * Copyright (c) 2002-2003 Patrick Mochel <mochel@osdl.org>
5 6
 * Copyright (c) 2006-2007 Greg Kroah-Hartman <greg@kroah.com>
 * Copyright (c) 2006-2007 Novell Inc.
L
Linus Torvalds 已提交
7 8 9 10 11 12 13 14 15 16
 *
 * This file is released under the GPLv2.
 *
 *
 * Please see the file Documentation/kobject.txt for critical information
 * about using the kobject interface.
 */

#include <linux/kobject.h>
#include <linux/string.h>
17
#include <linux/export.h>
L
Linus Torvalds 已提交
18
#include <linux/stat.h>
T
Tim Schmielau 已提交
19
#include <linux/slab.h>
20
#include <linux/random.h>
L
Linus Torvalds 已提交
21

22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/**
 * kobject_namespace - return @kobj's namespace tag
 * @kobj: kobject in question
 *
 * Returns namespace tag of @kobj if its parent has namespace ops enabled
 * and thus @kobj should have a namespace tag associated with it.  Returns
 * %NULL otherwise.
 */
const void *kobject_namespace(struct kobject *kobj)
{
	const struct kobj_ns_type_operations *ns_ops = kobj_ns_ops(kobj);

	if (!ns_ops || ns_ops->type == KOBJ_NS_TYPE_NONE)
		return NULL;

37
	return kobj->ktype->namespace(kobj);
38 39
}

40 41 42
/*
 * populate_dir - populate directory with attributes.
 * @kobj: object we're working on.
L
Linus Torvalds 已提交
43
 *
44 45 46 47
 * Most subsystems have a set of default attributes that are associated
 * with an object that registers with them.  This is a helper called during
 * object registration that loops through the default attributes of the
 * subsystem and creates attributes files for them in sysfs.
L
Linus Torvalds 已提交
48
 */
49
static int populate_dir(struct kobject *kobj)
L
Linus Torvalds 已提交
50
{
51 52
	struct kobj_type *t = get_ktype(kobj);
	struct attribute *attr;
L
Linus Torvalds 已提交
53 54
	int error = 0;
	int i;
55

L
Linus Torvalds 已提交
56 57
	if (t && t->default_attrs) {
		for (i = 0; (attr = t->default_attrs[i]) != NULL; i++) {
58 59
			error = sysfs_create_file(kobj, attr);
			if (error)
L
Linus Torvalds 已提交
60 61 62 63 64 65
				break;
		}
	}
	return error;
}

66
static int create_dir(struct kobject *kobj)
L
Linus Torvalds 已提交
67
{
68
	const struct kobj_ns_type_operations *ops;
69 70 71
	int error;

	error = sysfs_create_dir_ns(kobj, kobject_namespace(kobj));
72 73 74 75 76 77 78
	if (error)
		return error;

	error = populate_dir(kobj);
	if (error) {
		sysfs_remove_dir(kobj);
		return error;
L
Linus Torvalds 已提交
79
	}
80 81 82 83 84 85 86

	/*
	 * @kobj->sd may be deleted by an ancestor going away.  Hold an
	 * extra reference so that it stays until @kobj is gone.
	 */
	sysfs_get(kobj->sd);

87 88 89 90 91 92 93 94 95 96
	/*
	 * If @kobj has ns_ops, its children need to be filtered based on
	 * their namespace tags.  Enable namespace support on @kobj->sd.
	 */
	ops = kobj_child_ns_ops(kobj);
	if (ops) {
		BUG_ON(ops->type <= KOBJ_NS_TYPE_NONE);
		BUG_ON(ops->type >= KOBJ_NS_TYPES);
		BUG_ON(!kobj_ns_type_registered(ops->type));

97
		sysfs_enable_ns(kobj->sd);
98 99 100
	}

	return 0;
L
Linus Torvalds 已提交
101 102 103 104 105
}

static int get_kobj_path_length(struct kobject *kobj)
{
	int length = 1;
106
	struct kobject *parent = kobj;
L
Linus Torvalds 已提交
107

108
	/* walk up the ancestors until we hit the one pointing to the
L
Linus Torvalds 已提交
109 110 111 112
	 * root.
	 * Add 1 to strlen for leading '/' of each level.
	 */
	do {
113 114
		if (kobject_name(parent) == NULL)
			return 0;
L
Linus Torvalds 已提交
115 116 117 118 119 120 121 122
		length += strlen(kobject_name(parent)) + 1;
		parent = parent->parent;
	} while (parent);
	return length;
}

static void fill_kobj_path(struct kobject *kobj, char *path, int length)
{
123
	struct kobject *parent;
L
Linus Torvalds 已提交
124 125 126 127 128 129

	--length;
	for (parent = kobj; parent; parent = parent->parent) {
		int cur = strlen(kobject_name(parent));
		/* back up enough to print this name with '/' */
		length -= cur;
130
		strncpy(path + length, kobject_name(parent), cur);
L
Linus Torvalds 已提交
131 132 133
		*(path + --length) = '/';
	}

134
	pr_debug("kobject: '%s' (%p): %s: path = '%s'\n", kobject_name(kobj),
135
		 kobj, __func__, path);
L
Linus Torvalds 已提交
136 137 138
}

/**
139
 * kobject_get_path - generate and return the path associated with a given kobj and kset pair.
L
Linus Torvalds 已提交
140 141 142
 *
 * @kobj:	kobject in question, with which to build the path
 * @gfp_mask:	the allocation type used to allocate the path
143 144
 *
 * The result must be freed by the caller with kfree().
L
Linus Torvalds 已提交
145
 */
A
Al Viro 已提交
146
char *kobject_get_path(struct kobject *kobj, gfp_t gfp_mask)
L
Linus Torvalds 已提交
147 148 149 150 151
{
	char *path;
	int len;

	len = get_kobj_path_length(kobj);
152 153
	if (len == 0)
		return NULL;
154
	path = kzalloc(len, gfp_mask);
L
Linus Torvalds 已提交
155 156 157 158 159 160
	if (!path)
		return NULL;
	fill_kobj_path(kobj, path, len);

	return path;
}
161
EXPORT_SYMBOL_GPL(kobject_get_path);
L
Linus Torvalds 已提交
162

163 164
/* add the kobject to its kset's list */
static void kobj_kset_join(struct kobject *kobj)
L
Linus Torvalds 已提交
165
{
166
	if (!kobj->kset)
167
		return;
168 169 170 171 172

	kset_get(kobj->kset);
	spin_lock(&kobj->kset->list_lock);
	list_add_tail(&kobj->entry, &kobj->kset->list);
	spin_unlock(&kobj->kset->list_lock);
L
Linus Torvalds 已提交
173 174
}

175 176 177 178 179
/* remove the kobject from its kset's list */
static void kobj_kset_leave(struct kobject *kobj)
{
	if (!kobj->kset)
		return;
L
Linus Torvalds 已提交
180

181 182 183 184 185
	spin_lock(&kobj->kset->list_lock);
	list_del_init(&kobj->entry);
	spin_unlock(&kobj->kset->list_lock);
	kset_put(kobj->kset);
}
L
Linus Torvalds 已提交
186

187
static void kobject_init_internal(struct kobject *kobj)
L
Linus Torvalds 已提交
188
{
189 190 191 192
	if (!kobj)
		return;
	kref_init(&kobj->kref);
	INIT_LIST_HEAD(&kobj->entry);
193 194 195 196
	kobj->state_in_sysfs = 0;
	kobj->state_add_uevent_sent = 0;
	kobj->state_remove_uevent_sent = 0;
	kobj->state_initialized = 1;
L
Linus Torvalds 已提交
197 198
}

199

200
static int kobject_add_internal(struct kobject *kobj)
L
Linus Torvalds 已提交
201 202
{
	int error = 0;
203
	struct kobject *parent;
L
Linus Torvalds 已提交
204

205
	if (!kobj)
L
Linus Torvalds 已提交
206
		return -ENOENT;
207

208
	if (!kobj->name || !kobj->name[0]) {
A
Arjan van de Ven 已提交
209
		WARN(1, "kobject: (%p): attempted to be registered with empty "
210
			 "name!\n", kobj);
211 212
		return -EINVAL;
	}
L
Linus Torvalds 已提交
213

214
	parent = kobject_get(kobj->parent);
L
Linus Torvalds 已提交
215

216
	/* join kset if set, use it as parent if we do not already have one */
L
Linus Torvalds 已提交
217
	if (kobj->kset) {
218
		if (!parent)
L
Linus Torvalds 已提交
219
			parent = kobject_get(&kobj->kset->kobj);
220
		kobj_kset_join(kobj);
221
		kobj->parent = parent;
L
Linus Torvalds 已提交
222 223
	}

224
	pr_debug("kobject: '%s' (%p): %s: parent: '%s', set: '%s'\n",
225
		 kobject_name(kobj), kobj, __func__,
226
		 parent ? kobject_name(parent) : "<NULL>",
227
		 kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>");
228

229
	error = create_dir(kobj);
L
Linus Torvalds 已提交
230
	if (error) {
231 232 233
		kobj_kset_leave(kobj);
		kobject_put(parent);
		kobj->parent = NULL;
234 235 236

		/* be noisy on error issues */
		if (error == -EEXIST)
237 238 239 240
			WARN(1, "%s failed for %s with "
			     "-EEXIST, don't try to register things with "
			     "the same name in the same directory.\n",
			     __func__, kobject_name(kobj));
241
		else
242 243 244
			WARN(1, "%s failed for %s (error: %d parent: %s)\n",
			     __func__, kobject_name(kobj), error,
			     parent ? kobject_name(parent) : "'none'");
245 246
	} else
		kobj->state_in_sysfs = 1;
L
Linus Torvalds 已提交
247 248 249 250

	return error;
}

251 252 253 254 255 256
/**
 * kobject_set_name_vargs - Set the name of an kobject
 * @kobj: struct kobject to set the name of
 * @fmt: format string used to build the name
 * @vargs: vargs to format the string.
 */
257
int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
258 259
				  va_list vargs)
{
260
	const char *s;
261

262 263 264
	if (kobj->name && !fmt)
		return 0;

265
	s = kvasprintf_const(GFP_KERNEL, fmt, vargs);
266
	if (!s)
267
		return -ENOMEM;
268

269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
	/*
	 * ewww... some of these buggers have '/' in the name ... If
	 * that's the case, we need to make sure we have an actual
	 * allocated copy to modify, since kvasprintf_const may have
	 * returned something from .rodata.
	 */
	if (strchr(s, '/')) {
		char *t;

		t = kstrdup(s, GFP_KERNEL);
		kfree_const(s);
		if (!t)
			return -ENOMEM;
		strreplace(t, '/', '!');
		s = t;
	}
	kfree_const(kobj->name);
286
	kobj->name = s;
287

288 289
	return 0;
}
L
Linus Torvalds 已提交
290 291

/**
292
 * kobject_set_name - Set the name of a kobject
293
 * @kobj: struct kobject to set the name of
294
 * @fmt: format string used to build the name
L
Linus Torvalds 已提交
295
 *
296 297 298
 * This sets the name of the kobject.  If you have already added the
 * kobject to the system, you must call kobject_rename() in order to
 * change the name of the kobject.
L
Linus Torvalds 已提交
299
 */
300
int kobject_set_name(struct kobject *kobj, const char *fmt, ...)
L
Linus Torvalds 已提交
301
{
302
	va_list vargs;
303
	int retval;
L
Linus Torvalds 已提交
304

305 306 307
	va_start(vargs, fmt);
	retval = kobject_set_name_vargs(kobj, fmt, vargs);
	va_end(vargs);
L
Linus Torvalds 已提交
308

309
	return retval;
L
Linus Torvalds 已提交
310 311 312
}
EXPORT_SYMBOL(kobject_set_name);

313
/**
314
 * kobject_init - initialize a kobject structure
315 316 317 318 319 320 321 322 323 324
 * @kobj: pointer to the kobject to initialize
 * @ktype: pointer to the ktype for this kobject.
 *
 * This function will properly initialize a kobject such that it can then
 * be passed to the kobject_add() call.
 *
 * After this function is called, the kobject MUST be cleaned up by a call
 * to kobject_put(), not by a call to kfree directly to ensure that all of
 * the memory is cleaned up properly.
 */
325
void kobject_init(struct kobject *kobj, struct kobj_type *ktype)
326 327 328 329 330 331 332 333 334 335 336
{
	char *err_str;

	if (!kobj) {
		err_str = "invalid kobject pointer!";
		goto error;
	}
	if (!ktype) {
		err_str = "must have a ktype to be initialized properly!\n";
		goto error;
	}
337
	if (kobj->state_initialized) {
338
		/* do not error out as sometimes we can recover */
339 340
		printk(KERN_ERR "kobject (%p): tried to init an initialized "
		       "object, something is seriously wrong.\n", kobj);
341 342 343
		dump_stack();
	}

344
	kobject_init_internal(kobj);
345 346 347 348
	kobj->ktype = ktype;
	return;

error:
349
	printk(KERN_ERR "kobject (%p): %s\n", kobj, err_str);
350 351
	dump_stack();
}
352
EXPORT_SYMBOL(kobject_init);
353

354 355 356
static __printf(3, 0) int kobject_add_varg(struct kobject *kobj,
					   struct kobject *parent,
					   const char *fmt, va_list vargs)
357 358 359
{
	int retval;

360
	retval = kobject_set_name_vargs(kobj, fmt, vargs);
361 362 363 364 365
	if (retval) {
		printk(KERN_ERR "kobject: can not set name properly!\n");
		return retval;
	}
	kobj->parent = parent;
366
	return kobject_add_internal(kobj);
367 368 369
}

/**
370
 * kobject_add - the main kobject add function
371 372 373 374 375 376 377 378 379
 * @kobj: the kobject to add
 * @parent: pointer to the parent of the kobject.
 * @fmt: format to name the kobject with.
 *
 * The kobject name is set and added to the kobject hierarchy in this
 * function.
 *
 * If @parent is set, then the parent of the @kobj will be set to it.
 * If @parent is NULL, then the parent of the @kobj will be set to the
380
 * kobject associated with the kset assigned to this kobject.  If no kset
381 382 383 384 385 386 387 388
 * is assigned to the kobject, then the kobject will be located in the
 * root of the sysfs tree.
 *
 * If this function returns an error, kobject_put() must be called to
 * properly clean up the memory associated with the object.
 * Under no instance should the kobject that is passed to this function
 * be directly freed with a call to kfree(), that can leak memory.
 *
389
 * Note, no "add" uevent will be created with this call, the caller should set
390 391 392 393
 * up all of the necessary sysfs files for the object and then call
 * kobject_uevent() with the UEVENT_ADD parameter to ensure that
 * userspace is properly notified of this kobject's creation.
 */
394 395
int kobject_add(struct kobject *kobj, struct kobject *parent,
		const char *fmt, ...)
396 397 398 399 400 401 402
{
	va_list args;
	int retval;

	if (!kobj)
		return -EINVAL;

403 404 405 406 407 408 409
	if (!kobj->state_initialized) {
		printk(KERN_ERR "kobject '%s' (%p): tried to add an "
		       "uninitialized object, something is seriously wrong.\n",
		       kobject_name(kobj), kobj);
		dump_stack();
		return -EINVAL;
	}
410 411 412 413 414 415
	va_start(args, fmt);
	retval = kobject_add_varg(kobj, parent, fmt, args);
	va_end(args);

	return retval;
}
416
EXPORT_SYMBOL(kobject_add);
417

418 419 420 421 422 423 424
/**
 * kobject_init_and_add - initialize a kobject structure and add it to the kobject hierarchy
 * @kobj: pointer to the kobject to initialize
 * @ktype: pointer to the ktype for this kobject.
 * @parent: pointer to the parent of this kobject.
 * @fmt: the name of the kobject.
 *
425
 * This function combines the call to kobject_init() and
426 427
 * kobject_add().  The same type of error handling after a call to
 * kobject_add() and kobject lifetime rules are the same here.
428 429 430 431 432 433 434
 */
int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,
			 struct kobject *parent, const char *fmt, ...)
{
	va_list args;
	int retval;

435
	kobject_init(kobj, ktype);
436 437 438 439 440 441 442 443 444

	va_start(args, fmt);
	retval = kobject_add_varg(kobj, parent, fmt, args);
	va_end(args);

	return retval;
}
EXPORT_SYMBOL_GPL(kobject_init_and_add);

L
Linus Torvalds 已提交
445
/**
446 447 448
 * kobject_rename - change the name of an object
 * @kobj: object in question.
 * @new_name: object's new name
449 450 451 452 453
 *
 * It is the responsibility of the caller to provide mutual
 * exclusion between two different calls of kobject_rename
 * on the same kobject and to ensure that new_name is valid and
 * won't conflict with other kobjects.
L
Linus Torvalds 已提交
454
 */
455
int kobject_rename(struct kobject *kobj, const char *new_name)
L
Linus Torvalds 已提交
456 457
{
	int error = 0;
458
	const char *devpath = NULL;
459
	const char *dup_name = NULL, *name;
460 461
	char *devpath_string = NULL;
	char *envp[2];
L
Linus Torvalds 已提交
462 463 464 465

	kobj = kobject_get(kobj);
	if (!kobj)
		return -EINVAL;
466 467
	if (!kobj->parent)
		return -EINVAL;
468 469 470 471 472 473 474 475 476 477 478 479 480 481 482

	devpath = kobject_get_path(kobj, GFP_KERNEL);
	if (!devpath) {
		error = -ENOMEM;
		goto out;
	}
	devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL);
	if (!devpath_string) {
		error = -ENOMEM;
		goto out;
	}
	sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
	envp[0] = devpath_string;
	envp[1] = NULL;

483
	name = dup_name = kstrdup_const(new_name, GFP_KERNEL);
484 485 486 487 488
	if (!name) {
		error = -ENOMEM;
		goto out;
	}

489
	error = sysfs_rename_dir_ns(kobj, new_name, kobject_namespace(kobj));
490 491 492 493 494 495
	if (error)
		goto out;

	/* Install the new kobject name */
	dup_name = kobj->name;
	kobj->name = name;
496 497 498 499

	/* This function is mostly/only used for network interface.
	 * Some hotplug package track interfaces by their name and
	 * therefore want to know when the name is changed by the user. */
500
	kobject_uevent_env(kobj, KOBJ_MOVE, envp);
501 502

out:
503
	kfree_const(dup_name);
504 505
	kfree(devpath_string);
	kfree(devpath);
506 507 508 509
	kobject_put(kobj);

	return error;
}
510
EXPORT_SYMBOL_GPL(kobject_rename);
511

512
/**
513 514 515
 * kobject_move - move object to another parent
 * @kobj: object in question.
 * @new_parent: object's new parent (can be NULL)
516 517 518 519 520 521 522 523 524 525 526 527 528 529
 */
int kobject_move(struct kobject *kobj, struct kobject *new_parent)
{
	int error;
	struct kobject *old_parent;
	const char *devpath = NULL;
	char *devpath_string = NULL;
	char *envp[2];

	kobj = kobject_get(kobj);
	if (!kobj)
		return -EINVAL;
	new_parent = kobject_get(new_parent);
	if (!new_parent) {
530 531
		if (kobj->kset)
			new_parent = kobject_get(&kobj->kset->kobj);
532
	}
533

534 535 536 537 538 539 540 541 542 543 544 545 546 547
	/* old object path */
	devpath = kobject_get_path(kobj, GFP_KERNEL);
	if (!devpath) {
		error = -ENOMEM;
		goto out;
	}
	devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL);
	if (!devpath_string) {
		error = -ENOMEM;
		goto out;
	}
	sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
	envp[0] = devpath_string;
	envp[1] = NULL;
548
	error = sysfs_move_dir_ns(kobj, new_parent, kobject_namespace(kobj));
549 550 551 552
	if (error)
		goto out;
	old_parent = kobj->parent;
	kobj->parent = new_parent;
553
	new_parent = NULL;
554 555 556
	kobject_put(old_parent);
	kobject_uevent_env(kobj, KOBJ_MOVE, envp);
out:
557
	kobject_put(new_parent);
558 559 560 561 562
	kobject_put(kobj);
	kfree(devpath_string);
	kfree(devpath);
	return error;
}
A
Anand Jain 已提交
563
EXPORT_SYMBOL_GPL(kobject_move);
564

L
Linus Torvalds 已提交
565
/**
566 567
 * kobject_del - unlink kobject from hierarchy.
 * @kobj: object.
L
Linus Torvalds 已提交
568
 */
569
void kobject_del(struct kobject *kobj)
L
Linus Torvalds 已提交
570
{
571
	struct kernfs_node *sd;
572

573 574
	if (!kobj)
		return;
575

576
	sd = kobj->sd;
L
Linus Torvalds 已提交
577
	sysfs_remove_dir(kobj);
578 579
	sysfs_put(sd);

580 581 582 583
	kobj->state_in_sysfs = 0;
	kobj_kset_leave(kobj);
	kobject_put(kobj->parent);
	kobj->parent = NULL;
L
Linus Torvalds 已提交
584
}
585
EXPORT_SYMBOL(kobject_del);
L
Linus Torvalds 已提交
586 587

/**
588 589
 * kobject_get - increment refcount for object.
 * @kobj: object.
L
Linus Torvalds 已提交
590
 */
591
struct kobject *kobject_get(struct kobject *kobj)
L
Linus Torvalds 已提交
592
{
593 594 595 596 597
	if (kobj) {
		if (!kobj->state_initialized)
			WARN(1, KERN_WARNING "kobject: '%s' (%p): is not "
			       "initialized, yet kobject_get() is being "
			       "called.\n", kobject_name(kobj), kobj);
L
Linus Torvalds 已提交
598
		kref_get(&kobj->kref);
599
	}
L
Linus Torvalds 已提交
600 601
	return kobj;
}
602
EXPORT_SYMBOL(kobject_get);
L
Linus Torvalds 已提交
603

604
struct kobject * __must_check kobject_get_unless_zero(struct kobject *kobj)
605
{
606 607
	if (!kobj)
		return NULL;
608 609 610 611
	if (!kref_get_unless_zero(&kobj->kref))
		kobj = NULL;
	return kobj;
}
612
EXPORT_SYMBOL(kobject_get_unless_zero);
613

614 615 616
/*
 * kobject_cleanup - free kobject resources.
 * @kobj: object to cleanup
L
Linus Torvalds 已提交
617
 */
618
static void kobject_cleanup(struct kobject *kobj)
L
Linus Torvalds 已提交
619
{
620
	struct kobj_type *t = get_ktype(kobj);
621
	const char *name = kobj->name;
L
Linus Torvalds 已提交
622

623 624
	pr_debug("kobject: '%s' (%p): %s, parent %p\n",
		 kobject_name(kobj), kobj, __func__, kobj->parent);
625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644

	if (t && !t->release)
		pr_debug("kobject: '%s' (%p): does not have a release() "
			 "function, it is broken and must be fixed.\n",
			 kobject_name(kobj), kobj);

	/* send "remove" if the caller did not do it but sent "add" */
	if (kobj->state_add_uevent_sent && !kobj->state_remove_uevent_sent) {
		pr_debug("kobject: '%s' (%p): auto cleanup 'remove' event\n",
			 kobject_name(kobj), kobj);
		kobject_uevent(kobj, KOBJ_REMOVE);
	}

	/* remove from sysfs if the caller did not do it */
	if (kobj->state_in_sysfs) {
		pr_debug("kobject: '%s' (%p): auto cleanup kobject_del\n",
			 kobject_name(kobj), kobj);
		kobject_del(kobj);
	}

645
	if (t && t->release) {
646 647
		pr_debug("kobject: '%s' (%p): calling ktype release\n",
			 kobject_name(kobj), kobj);
L
Linus Torvalds 已提交
648
		t->release(kobj);
649 650 651
	}

	/* free name if we allocated it */
652
	if (name) {
653
		pr_debug("kobject: '%s': free name\n", name);
654
		kfree_const(name);
655
	}
L
Linus Torvalds 已提交
656 657
}

658 659 660 661 662 663 664 665
#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
static void kobject_delayed_cleanup(struct work_struct *work)
{
	kobject_cleanup(container_of(to_delayed_work(work),
				     struct kobject, release));
}
#endif

L
Linus Torvalds 已提交
666 667
static void kobject_release(struct kref *kref)
{
668 669
	struct kobject *kobj = container_of(kref, struct kobject, kref);
#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
670 671 672
	unsigned long delay = HZ + HZ * (get_random_int() & 0x3);
	pr_info("kobject: '%s' (%p): %s, parent %p (delayed %ld)\n",
		 kobject_name(kobj), kobj, __func__, kobj->parent, delay);
673
	INIT_DELAYED_WORK(&kobj->release, kobject_delayed_cleanup);
674 675

	schedule_delayed_work(&kobj->release, delay);
676 677 678
#else
	kobject_cleanup(kobj);
#endif
L
Linus Torvalds 已提交
679 680 681
}

/**
682 683
 * kobject_put - decrement refcount for object.
 * @kobj: object.
L
Linus Torvalds 已提交
684
 *
685
 * Decrement the refcount, and if 0, call kobject_cleanup().
L
Linus Torvalds 已提交
686
 */
687
void kobject_put(struct kobject *kobj)
L
Linus Torvalds 已提交
688
{
689
	if (kobj) {
A
Arjan van de Ven 已提交
690 691
		if (!kobj->state_initialized)
			WARN(1, KERN_WARNING "kobject: '%s' (%p): is not "
692 693
			       "initialized, yet kobject_put() is being "
			       "called.\n", kobject_name(kobj), kobj);
L
Linus Torvalds 已提交
694
		kref_put(&kobj->kref, kobject_release);
695
	}
L
Linus Torvalds 已提交
696
}
697
EXPORT_SYMBOL(kobject_put);
L
Linus Torvalds 已提交
698

699
static void dynamic_kobj_release(struct kobject *kobj)
J
Jun'ichi Nomura 已提交
700
{
701
	pr_debug("kobject: (%p): %s\n", kobj, __func__);
J
Jun'ichi Nomura 已提交
702 703 704
	kfree(kobj);
}

705
static struct kobj_type dynamic_kobj_ktype = {
706 707
	.release	= dynamic_kobj_release,
	.sysfs_ops	= &kobj_sysfs_ops,
J
Jun'ichi Nomura 已提交
708 709
};

710
/**
711 712 713 714 715 716
 * kobject_create - create a struct kobject dynamically
 *
 * This function creates a kobject structure dynamically and sets it up
 * to be a "dynamic" kobject with a default release function set up.
 *
 * If the kobject was not able to be created, NULL will be returned.
717
 * The kobject structure returned from here must be cleaned up with a
718
 * call to kobject_put() and not kfree(), as kobject_init() has
719
 * already been called on this structure.
720
 */
721
struct kobject *kobject_create(void)
722 723 724 725 726 727 728
{
	struct kobject *kobj;

	kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
	if (!kobj)
		return NULL;

729
	kobject_init(kobj, &dynamic_kobj_ktype);
730 731 732 733 734 735
	return kobj;
}

/**
 * kobject_create_and_add - create a struct kobject dynamically and register it with sysfs
 *
Z
Zhi Yong Wu 已提交
736
 * @name: the name for the kobject
737 738
 * @parent: the parent kobject of this kobject, if any.
 *
D
Dave Young 已提交
739
 * This function creates a kobject structure dynamically and registers it
740
 * with sysfs.  When you are finished with this structure, call
741
 * kobject_put() and the structure will be dynamically freed when
742 743 744 745 746 747 748 749 750 751 752 753 754
 * it is no longer being used.
 *
 * If the kobject was not able to be created, NULL will be returned.
 */
struct kobject *kobject_create_and_add(const char *name, struct kobject *parent)
{
	struct kobject *kobj;
	int retval;

	kobj = kobject_create();
	if (!kobj)
		return NULL;

755
	retval = kobject_add(kobj, parent, "%s", name);
756 757
	if (retval) {
		printk(KERN_WARNING "%s: kobject_add error: %d\n",
758
		       __func__, retval);
759 760 761 762 763 764 765
		kobject_put(kobj);
		kobj = NULL;
	}
	return kobj;
}
EXPORT_SYMBOL_GPL(kobject_create_and_add);

L
Linus Torvalds 已提交
766
/**
767 768
 * kset_init - initialize a kset for use
 * @k: kset
L
Linus Torvalds 已提交
769
 */
770
void kset_init(struct kset *k)
L
Linus Torvalds 已提交
771
{
772
	kobject_init_internal(&k->kobj);
L
Linus Torvalds 已提交
773 774 775 776
	INIT_LIST_HEAD(&k->list);
	spin_lock_init(&k->list_lock);
}

777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801
/* default kobject attribute operations */
static ssize_t kobj_attr_show(struct kobject *kobj, struct attribute *attr,
			      char *buf)
{
	struct kobj_attribute *kattr;
	ssize_t ret = -EIO;

	kattr = container_of(attr, struct kobj_attribute, attr);
	if (kattr->show)
		ret = kattr->show(kobj, kattr, buf);
	return ret;
}

static ssize_t kobj_attr_store(struct kobject *kobj, struct attribute *attr,
			       const char *buf, size_t count)
{
	struct kobj_attribute *kattr;
	ssize_t ret = -EIO;

	kattr = container_of(attr, struct kobj_attribute, attr);
	if (kattr->store)
		ret = kattr->store(kobj, kattr, buf, count);
	return ret;
}

802
const struct sysfs_ops kobj_sysfs_ops = {
803 804 805
	.show	= kobj_attr_show,
	.store	= kobj_attr_store,
};
J
Jeff Mahoney 已提交
806
EXPORT_SYMBOL_GPL(kobj_sysfs_ops);
L
Linus Torvalds 已提交
807 808

/**
809 810
 * kset_register - initialize and add a kset.
 * @k: kset.
L
Linus Torvalds 已提交
811
 */
812
int kset_register(struct kset *k)
L
Linus Torvalds 已提交
813
{
814 815
	int err;

816 817
	if (!k)
		return -EINVAL;
818

L
Linus Torvalds 已提交
819
	kset_init(k);
820
	err = kobject_add_internal(&k->kobj);
821 822 823 824
	if (err)
		return err;
	kobject_uevent(&k->kobj, KOBJ_ADD);
	return 0;
L
Linus Torvalds 已提交
825
}
826
EXPORT_SYMBOL(kset_register);
L
Linus Torvalds 已提交
827 828

/**
829 830
 * kset_unregister - remove a kset.
 * @k: kset.
L
Linus Torvalds 已提交
831
 */
832
void kset_unregister(struct kset *k)
L
Linus Torvalds 已提交
833
{
834 835
	if (!k)
		return;
836
	kobject_del(&k->kobj);
837
	kobject_put(&k->kobj);
L
Linus Torvalds 已提交
838
}
839
EXPORT_SYMBOL(kset_unregister);
L
Linus Torvalds 已提交
840 841

/**
842 843 844
 * kset_find_obj - search for object in kset.
 * @kset: kset we're looking in.
 * @name: object's name.
L
Linus Torvalds 已提交
845
 *
846 847 848
 * Lock kset via @kset->subsys, and iterate over @kset->list,
 * looking for a matching kobject. If matching object is found
 * take a reference and return the object.
L
Linus Torvalds 已提交
849
 */
850
struct kobject *kset_find_obj(struct kset *kset, const char *name)
L
Linus Torvalds 已提交
851
{
852
	struct kobject *k;
853
	struct kobject *ret = NULL;
L
Linus Torvalds 已提交
854 855

	spin_lock(&kset->list_lock);
856

857
	list_for_each_entry(k, &kset->list, entry) {
858
		if (kobject_name(k) && !strcmp(kobject_name(k), name)) {
859
			ret = kobject_get_unless_zero(k);
L
Linus Torvalds 已提交
860 861 862
			break;
		}
	}
863

L
Linus Torvalds 已提交
864 865 866
	spin_unlock(&kset->list_lock);
	return ret;
}
867
EXPORT_SYMBOL_GPL(kset_find_obj);
L
Linus Torvalds 已提交
868

869 870 871
static void kset_release(struct kobject *kobj)
{
	struct kset *kset = container_of(kobj, struct kset, kobj);
872
	pr_debug("kobject: '%s' (%p): %s\n",
873
		 kobject_name(kobj), kobj, __func__);
874 875 876
	kfree(kset);
}

877 878
static struct kobj_type kset_ktype = {
	.sysfs_ops	= &kobj_sysfs_ops,
879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897
	.release = kset_release,
};

/**
 * kset_create - create a struct kset dynamically
 *
 * @name: the name for the kset
 * @uevent_ops: a struct kset_uevent_ops for the kset
 * @parent_kobj: the parent kobject of this kset, if any.
 *
 * This function creates a kset structure dynamically.  This structure can
 * then be registered with the system and show up in sysfs with a call to
 * kset_register().  When you are finished with this structure, if
 * kset_register() has been called, call kset_unregister() and the
 * structure will be dynamically freed when it is no longer being used.
 *
 * If the kset was not able to be created, NULL will be returned.
 */
static struct kset *kset_create(const char *name,
898
				const struct kset_uevent_ops *uevent_ops,
899 900 901
				struct kobject *parent_kobj)
{
	struct kset *kset;
902
	int retval;
903 904 905 906

	kset = kzalloc(sizeof(*kset), GFP_KERNEL);
	if (!kset)
		return NULL;
907
	retval = kobject_set_name(&kset->kobj, "%s", name);
908 909 910 911
	if (retval) {
		kfree(kset);
		return NULL;
	}
912 913 914 915
	kset->uevent_ops = uevent_ops;
	kset->kobj.parent = parent_kobj;

	/*
916
	 * The kobject of this kset will have a type of kset_ktype and belong to
917 918 919
	 * no kset itself.  That way we can properly free it when it is
	 * finished being used.
	 */
920
	kset->kobj.ktype = &kset_ktype;
921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940
	kset->kobj.kset = NULL;

	return kset;
}

/**
 * kset_create_and_add - create a struct kset dynamically and add it to sysfs
 *
 * @name: the name for the kset
 * @uevent_ops: a struct kset_uevent_ops for the kset
 * @parent_kobj: the parent kobject of this kset, if any.
 *
 * This function creates a kset structure dynamically and registers it
 * with sysfs.  When you are finished with this structure, call
 * kset_unregister() and the structure will be dynamically freed when it
 * is no longer being used.
 *
 * If the kset was not able to be created, NULL will be returned.
 */
struct kset *kset_create_and_add(const char *name,
941
				 const struct kset_uevent_ops *uevent_ops,
942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958
				 struct kobject *parent_kobj)
{
	struct kset *kset;
	int error;

	kset = kset_create(name, uevent_ops, parent_kobj);
	if (!kset)
		return NULL;
	error = kset_register(kset);
	if (error) {
		kfree(kset);
		return NULL;
	}
	return kset;
}
EXPORT_SYMBOL_GPL(kset_create_and_add);

959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005

static DEFINE_SPINLOCK(kobj_ns_type_lock);
static const struct kobj_ns_type_operations *kobj_ns_ops_tbl[KOBJ_NS_TYPES];

int kobj_ns_type_register(const struct kobj_ns_type_operations *ops)
{
	enum kobj_ns_type type = ops->type;
	int error;

	spin_lock(&kobj_ns_type_lock);

	error = -EINVAL;
	if (type >= KOBJ_NS_TYPES)
		goto out;

	error = -EINVAL;
	if (type <= KOBJ_NS_TYPE_NONE)
		goto out;

	error = -EBUSY;
	if (kobj_ns_ops_tbl[type])
		goto out;

	error = 0;
	kobj_ns_ops_tbl[type] = ops;

out:
	spin_unlock(&kobj_ns_type_lock);
	return error;
}

int kobj_ns_type_registered(enum kobj_ns_type type)
{
	int registered = 0;

	spin_lock(&kobj_ns_type_lock);
	if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES))
		registered = kobj_ns_ops_tbl[type] != NULL;
	spin_unlock(&kobj_ns_type_lock);

	return registered;
}

const struct kobj_ns_type_operations *kobj_child_ns_ops(struct kobject *parent)
{
	const struct kobj_ns_type_operations *ops = NULL;

1006
	if (parent && parent->ktype && parent->ktype->child_ns_type)
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016
		ops = parent->ktype->child_ns_type(parent);

	return ops;
}

const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj)
{
	return kobj_child_ns_ops(kobj->parent);
}

1017 1018
bool kobj_ns_current_may_mount(enum kobj_ns_type type)
{
1019
	bool may_mount = true;
1020 1021 1022 1023 1024 1025 1026 1027 1028

	spin_lock(&kobj_ns_type_lock);
	if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
	    kobj_ns_ops_tbl[type])
		may_mount = kobj_ns_ops_tbl[type]->current_may_mount();
	spin_unlock(&kobj_ns_type_lock);

	return may_mount;
}
1029

1030
void *kobj_ns_grab_current(enum kobj_ns_type type)
1031
{
1032
	void *ns = NULL;
1033 1034 1035 1036

	spin_lock(&kobj_ns_type_lock);
	if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
	    kobj_ns_ops_tbl[type])
1037
		ns = kobj_ns_ops_tbl[type]->grab_current_ns();
1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068
	spin_unlock(&kobj_ns_type_lock);

	return ns;
}

const void *kobj_ns_netlink(enum kobj_ns_type type, struct sock *sk)
{
	const void *ns = NULL;

	spin_lock(&kobj_ns_type_lock);
	if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
	    kobj_ns_ops_tbl[type])
		ns = kobj_ns_ops_tbl[type]->netlink_ns(sk);
	spin_unlock(&kobj_ns_type_lock);

	return ns;
}

const void *kobj_ns_initial(enum kobj_ns_type type)
{
	const void *ns = NULL;

	spin_lock(&kobj_ns_type_lock);
	if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
	    kobj_ns_ops_tbl[type])
		ns = kobj_ns_ops_tbl[type]->initial_ns();
	spin_unlock(&kobj_ns_type_lock);

	return ns;
}

1069
void kobj_ns_drop(enum kobj_ns_type type, void *ns)
1070
{
1071 1072 1073 1074 1075
	spin_lock(&kobj_ns_type_lock);
	if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
	    kobj_ns_ops_tbl[type] && kobj_ns_ops_tbl[type]->drop_ns)
		kobj_ns_ops_tbl[type]->drop_ns(ns);
	spin_unlock(&kobj_ns_type_lock);
1076
}