xref: /openbmc/linux/lib/kobject.c (revision c21b37f6)
1 /*
2  * kobject.c - library routines for handling generic kernel objects
3  *
4  * Copyright (c) 2002-2003 Patrick Mochel <mochel@osdl.org>
5  *
6  * This file is released under the GPLv2.
7  *
8  *
9  * Please see the file Documentation/kobject.txt for critical information
10  * about using the kobject interface.
11  */
12 
13 #include <linux/kobject.h>
14 #include <linux/string.h>
15 #include <linux/module.h>
16 #include <linux/stat.h>
17 #include <linux/slab.h>
18 
19 /**
20  *	populate_dir - populate directory with attributes.
21  *	@kobj:	object we're working on.
22  *
23  *	Most subsystems have a set of default attributes that
24  *	are associated with an object that registers with them.
25  *	This is a helper called during object registration that
26  *	loops through the default attributes of the subsystem
27  *	and creates attributes files for them in sysfs.
28  *
29  */
30 
31 static int populate_dir(struct kobject * kobj)
32 {
33 	struct kobj_type * t = get_ktype(kobj);
34 	struct attribute * attr;
35 	int error = 0;
36 	int i;
37 
38 	if (t && t->default_attrs) {
39 		for (i = 0; (attr = t->default_attrs[i]) != NULL; i++) {
40 			if ((error = sysfs_create_file(kobj,attr)))
41 				break;
42 		}
43 	}
44 	return error;
45 }
46 
47 static int create_dir(struct kobject *kobj, struct sysfs_dirent *shadow_parent)
48 {
49 	int error = 0;
50 	if (kobject_name(kobj)) {
51 		error = sysfs_create_dir(kobj, shadow_parent);
52 		if (!error) {
53 			if ((error = populate_dir(kobj)))
54 				sysfs_remove_dir(kobj);
55 		}
56 	}
57 	return error;
58 }
59 
60 static inline struct kobject * to_kobj(struct list_head * entry)
61 {
62 	return container_of(entry,struct kobject,entry);
63 }
64 
65 static int get_kobj_path_length(struct kobject *kobj)
66 {
67 	int length = 1;
68 	struct kobject * parent = kobj;
69 
70 	/* walk up the ancestors until we hit the one pointing to the
71 	 * root.
72 	 * Add 1 to strlen for leading '/' of each level.
73 	 */
74 	do {
75 		if (kobject_name(parent) == NULL)
76 			return 0;
77 		length += strlen(kobject_name(parent)) + 1;
78 		parent = parent->parent;
79 	} while (parent);
80 	return length;
81 }
82 
83 static void fill_kobj_path(struct kobject *kobj, char *path, int length)
84 {
85 	struct kobject * parent;
86 
87 	--length;
88 	for (parent = kobj; parent; parent = parent->parent) {
89 		int cur = strlen(kobject_name(parent));
90 		/* back up enough to print this name with '/' */
91 		length -= cur;
92 		strncpy (path + length, kobject_name(parent), cur);
93 		*(path + --length) = '/';
94 	}
95 
96 	pr_debug("%s: path = '%s'\n",__FUNCTION__,path);
97 }
98 
99 /**
100  * kobject_get_path - generate and return the path associated with a given kobj and kset pair.
101  *
102  * @kobj:	kobject in question, with which to build the path
103  * @gfp_mask:	the allocation type used to allocate the path
104  *
105  * The result must be freed by the caller with kfree().
106  */
107 char *kobject_get_path(struct kobject *kobj, gfp_t gfp_mask)
108 {
109 	char *path;
110 	int len;
111 
112 	len = get_kobj_path_length(kobj);
113 	if (len == 0)
114 		return NULL;
115 	path = kzalloc(len, gfp_mask);
116 	if (!path)
117 		return NULL;
118 	fill_kobj_path(kobj, path, len);
119 
120 	return path;
121 }
122 EXPORT_SYMBOL_GPL(kobject_get_path);
123 
124 /**
125  *	kobject_init - initialize object.
126  *	@kobj:	object in question.
127  */
128 void kobject_init(struct kobject * kobj)
129 {
130 	if (!kobj)
131 		return;
132 	kref_init(&kobj->kref);
133 	INIT_LIST_HEAD(&kobj->entry);
134 	init_waitqueue_head(&kobj->poll);
135 	kobj->kset = kset_get(kobj->kset);
136 }
137 
138 
139 /**
140  *	unlink - remove kobject from kset list.
141  *	@kobj:	kobject.
142  *
143  *	Remove the kobject from the kset list and decrement
144  *	its parent's refcount.
145  *	This is separated out, so we can use it in both
146  *	kobject_del() and kobject_add() on error.
147  */
148 
149 static void unlink(struct kobject * kobj)
150 {
151 	if (kobj->kset) {
152 		spin_lock(&kobj->kset->list_lock);
153 		list_del_init(&kobj->entry);
154 		spin_unlock(&kobj->kset->list_lock);
155 	}
156 	kobject_put(kobj);
157 }
158 
159 /**
160  *	kobject_shadow_add - add an object to the hierarchy.
161  *	@kobj:	object.
162  *	@shadow_parent: sysfs directory to add to.
163  */
164 
165 int kobject_shadow_add(struct kobject *kobj, struct sysfs_dirent *shadow_parent)
166 {
167 	int error = 0;
168 	struct kobject * parent;
169 
170 	if (!(kobj = kobject_get(kobj)))
171 		return -ENOENT;
172 	if (!kobj->k_name)
173 		kobj->k_name = kobj->name;
174 	if (!*kobj->k_name) {
175 		pr_debug("kobject attempted to be registered with no name!\n");
176 		WARN_ON(1);
177 		kobject_put(kobj);
178 		return -EINVAL;
179 	}
180 	parent = kobject_get(kobj->parent);
181 
182 	pr_debug("kobject %s: registering. parent: %s, set: %s\n",
183 		 kobject_name(kobj), parent ? kobject_name(parent) : "<NULL>",
184 		 kobj->kset ? kobj->kset->kobj.name : "<NULL>" );
185 
186 	if (kobj->kset) {
187 		spin_lock(&kobj->kset->list_lock);
188 
189 		if (!parent)
190 			parent = kobject_get(&kobj->kset->kobj);
191 
192 		list_add_tail(&kobj->entry,&kobj->kset->list);
193 		spin_unlock(&kobj->kset->list_lock);
194 		kobj->parent = parent;
195 	}
196 
197 	error = create_dir(kobj, shadow_parent);
198 	if (error) {
199 		/* unlink does the kobject_put() for us */
200 		unlink(kobj);
201 		kobject_put(parent);
202 
203 		/* be noisy on error issues */
204 		if (error == -EEXIST)
205 			printk(KERN_ERR "kobject_add failed for %s with "
206 			       "-EEXIST, don't try to register things with "
207 			       "the same name in the same directory.\n",
208 			       kobject_name(kobj));
209 		else
210 			printk(KERN_ERR "kobject_add failed for %s (%d)\n",
211 			       kobject_name(kobj), error);
212 		dump_stack();
213 	}
214 
215 	return error;
216 }
217 
218 /**
219  *	kobject_add - add an object to the hierarchy.
220  *	@kobj:	object.
221  */
222 int kobject_add(struct kobject * kobj)
223 {
224 	return kobject_shadow_add(kobj, NULL);
225 }
226 
227 
228 /**
229  *	kobject_register - initialize and add an object.
230  *	@kobj:	object in question.
231  */
232 
233 int kobject_register(struct kobject * kobj)
234 {
235 	int error = -EINVAL;
236 	if (kobj) {
237 		kobject_init(kobj);
238 		error = kobject_add(kobj);
239 		if (!error)
240 			kobject_uevent(kobj, KOBJ_ADD);
241 	}
242 	return error;
243 }
244 
245 
246 /**
247  *	kobject_set_name - Set the name of an object
248  *	@kobj:	object.
249  *	@fmt:	format string used to build the name
250  *
251  *	If strlen(name) >= KOBJ_NAME_LEN, then use a dynamically allocated
252  *	string that @kobj->k_name points to. Otherwise, use the static
253  *	@kobj->name array.
254  */
255 int kobject_set_name(struct kobject * kobj, const char * fmt, ...)
256 {
257 	int error = 0;
258 	int limit = KOBJ_NAME_LEN;
259 	int need;
260 	va_list args;
261 	char * name;
262 
263 	/*
264 	 * First, try the static array
265 	 */
266 	va_start(args,fmt);
267 	need = vsnprintf(kobj->name,limit,fmt,args);
268 	va_end(args);
269 	if (need < limit)
270 		name = kobj->name;
271 	else {
272 		/*
273 		 * Need more space? Allocate it and try again
274 		 */
275 		limit = need + 1;
276 		name = kmalloc(limit,GFP_KERNEL);
277 		if (!name) {
278 			error = -ENOMEM;
279 			goto Done;
280 		}
281 		va_start(args,fmt);
282 		need = vsnprintf(name,limit,fmt,args);
283 		va_end(args);
284 
285 		/* Still? Give up. */
286 		if (need >= limit) {
287 			kfree(name);
288 			error = -EFAULT;
289 			goto Done;
290 		}
291 	}
292 
293 	/* Free the old name, if necessary. */
294 	if (kobj->k_name && kobj->k_name != kobj->name)
295 		kfree(kobj->k_name);
296 
297 	/* Now, set the new name */
298 	kobj->k_name = name;
299  Done:
300 	return error;
301 }
302 
303 EXPORT_SYMBOL(kobject_set_name);
304 
305 
306 /**
307  *	kobject_rename - change the name of an object
308  *	@kobj:	object in question.
309  *	@new_name: object's new name
310  */
311 
312 int kobject_rename(struct kobject * kobj, const char *new_name)
313 {
314 	int error = 0;
315 	const char *devpath = NULL;
316 	char *devpath_string = NULL;
317 	char *envp[2];
318 
319 	kobj = kobject_get(kobj);
320 	if (!kobj)
321 		return -EINVAL;
322 	if (!kobj->parent)
323 		return -EINVAL;
324 
325 	devpath = kobject_get_path(kobj, GFP_KERNEL);
326 	if (!devpath) {
327 		error = -ENOMEM;
328 		goto out;
329 	}
330 	devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL);
331 	if (!devpath_string) {
332 		error = -ENOMEM;
333 		goto out;
334 	}
335 	sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
336 	envp[0] = devpath_string;
337 	envp[1] = NULL;
338 	/* Note : if we want to send the new name alone, not the full path,
339 	 * we could probably use kobject_name(kobj); */
340 
341 	error = sysfs_rename_dir(kobj, kobj->parent->sd, new_name);
342 
343 	/* This function is mostly/only used for network interface.
344 	 * Some hotplug package track interfaces by their name and
345 	 * therefore want to know when the name is changed by the user. */
346 	if (!error)
347 		kobject_uevent_env(kobj, KOBJ_MOVE, envp);
348 
349 out:
350 	kfree(devpath_string);
351 	kfree(devpath);
352 	kobject_put(kobj);
353 
354 	return error;
355 }
356 
357 /**
358  *	kobject_rename - change the name of an object
359  *	@kobj:	object in question.
360  *	@new_parent: object's new parent
361  *	@new_name: object's new name
362  */
363 
364 int kobject_shadow_rename(struct kobject *kobj,
365 			  struct sysfs_dirent *new_parent, const char *new_name)
366 {
367 	int error = 0;
368 
369 	kobj = kobject_get(kobj);
370 	if (!kobj)
371 		return -EINVAL;
372 	error = sysfs_rename_dir(kobj, new_parent, new_name);
373 	kobject_put(kobj);
374 
375 	return error;
376 }
377 
378 /**
379  *	kobject_move - move object to another parent
380  *	@kobj:	object in question.
381  *	@new_parent: object's new parent (can be NULL)
382  */
383 
384 int kobject_move(struct kobject *kobj, struct kobject *new_parent)
385 {
386 	int error;
387 	struct kobject *old_parent;
388 	const char *devpath = NULL;
389 	char *devpath_string = NULL;
390 	char *envp[2];
391 
392 	kobj = kobject_get(kobj);
393 	if (!kobj)
394 		return -EINVAL;
395 	new_parent = kobject_get(new_parent);
396 	if (!new_parent) {
397 		if (kobj->kset)
398 			new_parent = kobject_get(&kobj->kset->kobj);
399 	}
400 	/* old object path */
401 	devpath = kobject_get_path(kobj, GFP_KERNEL);
402 	if (!devpath) {
403 		error = -ENOMEM;
404 		goto out;
405 	}
406 	devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL);
407 	if (!devpath_string) {
408 		error = -ENOMEM;
409 		goto out;
410 	}
411 	sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
412 	envp[0] = devpath_string;
413 	envp[1] = NULL;
414 	error = sysfs_move_dir(kobj, new_parent);
415 	if (error)
416 		goto out;
417 	old_parent = kobj->parent;
418 	kobj->parent = new_parent;
419 	new_parent = NULL;
420 	kobject_put(old_parent);
421 	kobject_uevent_env(kobj, KOBJ_MOVE, envp);
422 out:
423 	kobject_put(new_parent);
424 	kobject_put(kobj);
425 	kfree(devpath_string);
426 	kfree(devpath);
427 	return error;
428 }
429 
430 /**
431  *	kobject_del - unlink kobject from hierarchy.
432  * 	@kobj:	object.
433  */
434 
435 void kobject_del(struct kobject * kobj)
436 {
437 	if (!kobj)
438 		return;
439 	sysfs_remove_dir(kobj);
440 	unlink(kobj);
441 }
442 
443 /**
444  *	kobject_unregister - remove object from hierarchy and decrement refcount.
445  *	@kobj:	object going away.
446  */
447 
448 void kobject_unregister(struct kobject * kobj)
449 {
450 	if (!kobj)
451 		return;
452 	pr_debug("kobject %s: unregistering\n",kobject_name(kobj));
453 	kobject_uevent(kobj, KOBJ_REMOVE);
454 	kobject_del(kobj);
455 	kobject_put(kobj);
456 }
457 
458 /**
459  *	kobject_get - increment refcount for object.
460  *	@kobj:	object.
461  */
462 
463 struct kobject * kobject_get(struct kobject * kobj)
464 {
465 	if (kobj)
466 		kref_get(&kobj->kref);
467 	return kobj;
468 }
469 
470 /**
471  *	kobject_cleanup - free kobject resources.
472  *	@kobj:	object.
473  */
474 
475 void kobject_cleanup(struct kobject * kobj)
476 {
477 	struct kobj_type * t = get_ktype(kobj);
478 	struct kset * s = kobj->kset;
479 	struct kobject * parent = kobj->parent;
480 
481 	pr_debug("kobject %s: cleaning up\n",kobject_name(kobj));
482 	if (kobj->k_name != kobj->name)
483 		kfree(kobj->k_name);
484 	kobj->k_name = NULL;
485 	if (t && t->release)
486 		t->release(kobj);
487 	if (s)
488 		kset_put(s);
489 	kobject_put(parent);
490 }
491 
492 static void kobject_release(struct kref *kref)
493 {
494 	kobject_cleanup(container_of(kref, struct kobject, kref));
495 }
496 
497 /**
498  *	kobject_put - decrement refcount for object.
499  *	@kobj:	object.
500  *
501  *	Decrement the refcount, and if 0, call kobject_cleanup().
502  */
503 void kobject_put(struct kobject * kobj)
504 {
505 	if (kobj)
506 		kref_put(&kobj->kref, kobject_release);
507 }
508 
509 
510 static void dir_release(struct kobject *kobj)
511 {
512 	kfree(kobj);
513 }
514 
515 static struct kobj_type dir_ktype = {
516 	.release	= dir_release,
517 	.sysfs_ops	= NULL,
518 	.default_attrs	= NULL,
519 };
520 
521 /**
522  *	kobject_kset_add_dir - add sub directory of object.
523  *	@kset:		kset the directory is belongs to.
524  *	@parent:	object in which a directory is created.
525  *	@name:	directory name.
526  *
527  *	Add a plain directory object as child of given object.
528  */
529 struct kobject *kobject_kset_add_dir(struct kset *kset,
530 				     struct kobject *parent, const char *name)
531 {
532 	struct kobject *k;
533 	int ret;
534 
535 	if (!parent)
536 		return NULL;
537 
538 	k = kzalloc(sizeof(*k), GFP_KERNEL);
539 	if (!k)
540 		return NULL;
541 
542 	k->kset = kset;
543 	k->parent = parent;
544 	k->ktype = &dir_ktype;
545 	kobject_set_name(k, name);
546 	ret = kobject_register(k);
547 	if (ret < 0) {
548 		printk(KERN_WARNING "%s: kobject_register error: %d\n",
549 			__func__, ret);
550 		kobject_del(k);
551 		return NULL;
552 	}
553 
554 	return k;
555 }
556 
557 /**
558  *	kobject_add_dir - add sub directory of object.
559  *	@parent:	object in which a directory is created.
560  *	@name:	directory name.
561  *
562  *	Add a plain directory object as child of given object.
563  */
564 struct kobject *kobject_add_dir(struct kobject *parent, const char *name)
565 {
566 	return kobject_kset_add_dir(NULL, parent, name);
567 }
568 
569 /**
570  *	kset_init - initialize a kset for use
571  *	@k:	kset
572  */
573 
574 void kset_init(struct kset * k)
575 {
576 	kobject_init(&k->kobj);
577 	INIT_LIST_HEAD(&k->list);
578 	spin_lock_init(&k->list_lock);
579 }
580 
581 
582 /**
583  *	kset_add - add a kset object to the hierarchy.
584  *	@k:	kset.
585  */
586 
587 int kset_add(struct kset * k)
588 {
589 	return kobject_add(&k->kobj);
590 }
591 
592 
593 /**
594  *	kset_register - initialize and add a kset.
595  *	@k:	kset.
596  */
597 
598 int kset_register(struct kset * k)
599 {
600 	int err;
601 
602 	if (!k)
603 		return -EINVAL;
604 
605 	kset_init(k);
606 	err = kset_add(k);
607 	if (err)
608 		return err;
609 	kobject_uevent(&k->kobj, KOBJ_ADD);
610 	return 0;
611 }
612 
613 
614 /**
615  *	kset_unregister - remove a kset.
616  *	@k:	kset.
617  */
618 
619 void kset_unregister(struct kset * k)
620 {
621 	if (!k)
622 		return;
623 	kobject_unregister(&k->kobj);
624 }
625 
626 
627 /**
628  *	kset_find_obj - search for object in kset.
629  *	@kset:	kset we're looking in.
630  *	@name:	object's name.
631  *
632  *	Lock kset via @kset->subsys, and iterate over @kset->list,
633  *	looking for a matching kobject. If matching object is found
634  *	take a reference and return the object.
635  */
636 
637 struct kobject * kset_find_obj(struct kset * kset, const char * name)
638 {
639 	struct list_head * entry;
640 	struct kobject * ret = NULL;
641 
642 	spin_lock(&kset->list_lock);
643 	list_for_each(entry,&kset->list) {
644 		struct kobject * k = to_kobj(entry);
645 		if (kobject_name(k) && !strcmp(kobject_name(k),name)) {
646 			ret = kobject_get(k);
647 			break;
648 		}
649 	}
650 	spin_unlock(&kset->list_lock);
651 	return ret;
652 }
653 
654 void subsystem_init(struct kset *s)
655 {
656 	kset_init(s);
657 }
658 
659 int subsystem_register(struct kset *s)
660 {
661 	return kset_register(s);
662 }
663 
664 void subsystem_unregister(struct kset *s)
665 {
666 	kset_unregister(s);
667 }
668 
669 /**
670  *	subsystem_create_file - export sysfs attribute file.
671  *	@s:	subsystem.
672  *	@a:	subsystem attribute descriptor.
673  */
674 
675 int subsys_create_file(struct kset *s, struct subsys_attribute *a)
676 {
677 	int error = 0;
678 
679 	if (!s || !a)
680 		return -EINVAL;
681 
682 	if (subsys_get(s)) {
683 		error = sysfs_create_file(&s->kobj, &a->attr);
684 		subsys_put(s);
685 	}
686 	return error;
687 }
688 
689 EXPORT_SYMBOL(kobject_init);
690 EXPORT_SYMBOL(kobject_register);
691 EXPORT_SYMBOL(kobject_unregister);
692 EXPORT_SYMBOL(kobject_get);
693 EXPORT_SYMBOL(kobject_put);
694 EXPORT_SYMBOL(kobject_add);
695 EXPORT_SYMBOL(kobject_del);
696 
697 EXPORT_SYMBOL(kset_register);
698 EXPORT_SYMBOL(kset_unregister);
699 
700 EXPORT_SYMBOL(subsystem_register);
701 EXPORT_SYMBOL(subsystem_unregister);
702 EXPORT_SYMBOL(subsys_create_file);
703