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

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

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
/**
 * 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;

35
	return kobj->ktype->namespace(kobj);
36 37
}

38 39 40
/*
 * populate_dir - populate directory with attributes.
 * @kobj: object we're working on.
L
Linus Torvalds 已提交
41
 *
42 43 44 45
 * 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 已提交
46
 */
47
static int populate_dir(struct kobject *kobj)
L
Linus Torvalds 已提交
48
{
49 50
	struct kobj_type *t = get_ktype(kobj);
	struct attribute *attr;
L
Linus Torvalds 已提交
51 52
	int error = 0;
	int i;
53

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

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

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

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

	/*
	 * @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);

85 86 87 88 89 90 91 92 93 94
	/*
	 * 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));

95
		sysfs_enable_ns(kobj->sd);
96 97 98
	}

	return 0;
L
Linus Torvalds 已提交
99 100 101 102 103
}

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

106
	/* walk up the ancestors until we hit the one pointing to the
L
Linus Torvalds 已提交
107 108 109 110
	 * root.
	 * Add 1 to strlen for leading '/' of each level.
	 */
	do {
111 112
		if (kobject_name(parent) == NULL)
			return 0;
L
Linus Torvalds 已提交
113 114 115 116 117 118 119 120
		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)
{
121
	struct kobject *parent;
L
Linus Torvalds 已提交
122 123 124 125 126 127

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

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

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

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

	return path;
}
159
EXPORT_SYMBOL_GPL(kobject_get_path);
L
Linus Torvalds 已提交
160

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

	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 已提交
171 172
}

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

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

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

197

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

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

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

212
	parent = kobject_get(kobj->parent);
L
Linus Torvalds 已提交
213

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

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

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

		/* be noisy on error issues */
		if (error == -EEXIST)
235 236 237 238
			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));
239
		else
240 241 242
			WARN(1, "%s failed for %s (error: %d parent: %s)\n",
			     __func__, kobject_name(kobj), error,
			     parent ? kobject_name(parent) : "'none'");
243 244
	} else
		kobj->state_in_sysfs = 1;
L
Linus Torvalds 已提交
245 246 247 248

	return error;
}

249 250 251 252 253 254
/**
 * 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.
 */
255
int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
256 257
				  va_list vargs)
{
258
	const char *s;
259

260 261 262
	if (kobj->name && !fmt)
		return 0;

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

267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
	/*
	 * 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);
284
	kobj->name = s;
285

286 287
	return 0;
}
L
Linus Torvalds 已提交
288 289

/**
290
 * kobject_set_name - Set the name of a kobject
291
 * @kobj: struct kobject to set the name of
292
 * @fmt: format string used to build the name
L
Linus Torvalds 已提交
293
 *
294 295 296
 * 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 已提交
297
 */
298
int kobject_set_name(struct kobject *kobj, const char *fmt, ...)
L
Linus Torvalds 已提交
299
{
300
	va_list vargs;
301
	int retval;
L
Linus Torvalds 已提交
302

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

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

311
/**
312
 * kobject_init - initialize a kobject structure
313 314 315 316 317 318 319 320 321 322
 * @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.
 */
323
void kobject_init(struct kobject *kobj, struct kobj_type *ktype)
324 325 326 327 328 329 330 331 332 333 334
{
	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;
	}
335
	if (kobj->state_initialized) {
336
		/* do not error out as sometimes we can recover */
337 338
		printk(KERN_ERR "kobject (%p): tried to init an initialized "
		       "object, something is seriously wrong.\n", kobj);
339 340 341
		dump_stack();
	}

342
	kobject_init_internal(kobj);
343 344 345 346
	kobj->ktype = ktype;
	return;

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

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

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

/**
368
 * kobject_add - the main kobject add function
369 370 371 372 373 374 375 376 377
 * @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
378
 * kobject associated with the kset assigned to this kobject.  If no kset
379 380 381 382 383 384 385 386
 * 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.
 *
387
 * Note, no "add" uevent will be created with this call, the caller should set
388 389 390 391
 * 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.
 */
392 393
int kobject_add(struct kobject *kobj, struct kobject *parent,
		const char *fmt, ...)
394 395 396 397 398 399 400
{
	va_list args;
	int retval;

	if (!kobj)
		return -EINVAL;

401 402 403 404 405 406 407
	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;
	}
408 409 410 411 412 413
	va_start(args, fmt);
	retval = kobject_add_varg(kobj, parent, fmt, args);
	va_end(args);

	return retval;
}
414
EXPORT_SYMBOL(kobject_add);
415

416 417 418 419 420 421 422
/**
 * 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.
 *
423
 * This function combines the call to kobject_init() and
424 425
 * kobject_add().  The same type of error handling after a call to
 * kobject_add() and kobject lifetime rules are the same here.
426 427 428 429 430 431 432
 */
int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,
			 struct kobject *parent, const char *fmt, ...)
{
	va_list args;
	int retval;

433
	kobject_init(kobj, ktype);
434 435 436 437 438 439 440 441 442

	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 已提交
443
/**
444 445 446
 * kobject_rename - change the name of an object
 * @kobj: object in question.
 * @new_name: object's new name
447 448 449 450 451
 *
 * 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 已提交
452
 */
453
int kobject_rename(struct kobject *kobj, const char *new_name)
L
Linus Torvalds 已提交
454 455
{
	int error = 0;
456
	const char *devpath = NULL;
457
	const char *dup_name = NULL, *name;
458 459
	char *devpath_string = NULL;
	char *envp[2];
L
Linus Torvalds 已提交
460 461 462 463

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

	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;

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

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

	/* Install the new kobject name */
	dup_name = kobj->name;
	kobj->name = name;
494 495 496 497

	/* 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. */
498
	kobject_uevent_env(kobj, KOBJ_MOVE, envp);
499 500

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

	return error;
}
508
EXPORT_SYMBOL_GPL(kobject_rename);
509

510
/**
511 512 513
 * kobject_move - move object to another parent
 * @kobj: object in question.
 * @new_parent: object's new parent (can be NULL)
514 515 516 517 518 519 520 521 522 523 524 525 526 527
 */
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) {
528 529
		if (kobj->kset)
			new_parent = kobject_get(&kobj->kset->kobj);
530
	}
531

532 533 534 535 536 537 538 539 540 541 542 543 544 545
	/* 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;
546
	error = sysfs_move_dir_ns(kobj, new_parent, kobject_namespace(kobj));
547 548 549 550
	if (error)
		goto out;
	old_parent = kobj->parent;
	kobj->parent = new_parent;
551
	new_parent = NULL;
552 553 554
	kobject_put(old_parent);
	kobject_uevent_env(kobj, KOBJ_MOVE, envp);
out:
555
	kobject_put(new_parent);
556 557 558 559 560
	kobject_put(kobj);
	kfree(devpath_string);
	kfree(devpath);
	return error;
}
A
Anand Jain 已提交
561
EXPORT_SYMBOL_GPL(kobject_move);
562

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

571 572
	if (!kobj)
		return;
573

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

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

/**
586 587
 * kobject_get - increment refcount for object.
 * @kobj: object.
L
Linus Torvalds 已提交
588
 */
589
struct kobject *kobject_get(struct kobject *kobj)
L
Linus Torvalds 已提交
590
{
591 592 593 594 595
	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 已提交
596
		kref_get(&kobj->kref);
597
	}
L
Linus Torvalds 已提交
598 599
	return kobj;
}
600
EXPORT_SYMBOL(kobject_get);
L
Linus Torvalds 已提交
601

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

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

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

	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);
	}

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

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

656 657 658 659 660 661 662 663
#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 已提交
664 665
static void kobject_release(struct kref *kref)
{
666 667
	struct kobject *kobj = container_of(kref, struct kobject, kref);
#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
668 669 670
	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);
671
	INIT_DELAYED_WORK(&kobj->release, kobject_delayed_cleanup);
672 673

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

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

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

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

708
/**
709 710 711 712 713 714
 * 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.
715
 * The kobject structure returned from here must be cleaned up with a
716
 * call to kobject_put() and not kfree(), as kobject_init() has
717
 * already been called on this structure.
718
 */
719
struct kobject *kobject_create(void)
720 721 722 723 724 725 726
{
	struct kobject *kobj;

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

727
	kobject_init(kobj, &dynamic_kobj_ktype);
728 729 730 731 732 733
	return kobj;
}

/**
 * kobject_create_and_add - create a struct kobject dynamically and register it with sysfs
 *
Z
Zhi Yong Wu 已提交
734
 * @name: the name for the kobject
735 736
 * @parent: the parent kobject of this kobject, if any.
 *
D
Dave Young 已提交
737
 * This function creates a kobject structure dynamically and registers it
738
 * with sysfs.  When you are finished with this structure, call
739
 * kobject_put() and the structure will be dynamically freed when
740 741 742 743 744 745 746 747 748 749 750 751 752
 * 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;

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

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

775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799
/* 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;
}

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

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

814 815
	if (!k)
		return -EINVAL;
816

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

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

/**
840 841 842
 * kset_find_obj - search for object in kset.
 * @kset: kset we're looking in.
 * @name: object's name.
L
Linus Torvalds 已提交
843
 *
844 845 846
 * 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 已提交
847
 */
848
struct kobject *kset_find_obj(struct kset *kset, const char *name)
L
Linus Torvalds 已提交
849
{
850
	struct kobject *k;
851
	struct kobject *ret = NULL;
L
Linus Torvalds 已提交
852 853

	spin_lock(&kset->list_lock);
854

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

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

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

875 876
static struct kobj_type kset_ktype = {
	.sysfs_ops	= &kobj_sysfs_ops,
877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895
	.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,
896
				const struct kset_uevent_ops *uevent_ops,
897 898 899
				struct kobject *parent_kobj)
{
	struct kset *kset;
900
	int retval;
901 902 903 904

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

	/*
914
	 * The kobject of this kset will have a type of kset_ktype and belong to
915 916 917
	 * no kset itself.  That way we can properly free it when it is
	 * finished being used.
	 */
918
	kset->kobj.ktype = &kset_ktype;
919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938
	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,
939
				 const struct kset_uevent_ops *uevent_ops,
940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956
				 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);

957 958 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

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;

1004
	if (parent && parent->ktype && parent->ktype->child_ns_type)
1005 1006 1007 1008 1009 1010 1011 1012 1013 1014
		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);
}

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

	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;
}
1027

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

	spin_lock(&kobj_ns_type_lock);
	if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
	    kobj_ns_ops_tbl[type])
1035
		ns = kobj_ns_ops_tbl[type]->grab_current_ns();
1036 1037 1038 1039
	spin_unlock(&kobj_ns_type_lock);

	return ns;
}
1040
EXPORT_SYMBOL_GPL(kobj_ns_grab_current);
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

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;
}

1068
void kobj_ns_drop(enum kobj_ns_type type, void *ns)
1069
{
1070 1071 1072 1073 1074
	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);
1075
}
1076
EXPORT_SYMBOL_GPL(kobj_ns_drop);