ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / lib / kobject.c
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 #undef DEBUG
14
15 #include <linux/kobject.h>
16 #include <linux/string.h>
17 #include <linux/module.h>
18 #include <linux/stat.h>
19
20 /**
21  *      populate_dir - populate directory with attributes.
22  *      @kobj:  object we're working on.
23  *
24  *      Most subsystems have a set of default attributes that 
25  *      are associated with an object that registers with them.
26  *      This is a helper called during object registration that 
27  *      loops through the default attributes of the subsystem 
28  *      and creates attributes files for them in sysfs.
29  *
30  */
31
32 static int populate_dir(struct kobject * kobj)
33 {
34         struct kobj_type * t = get_ktype(kobj);
35         struct attribute * attr;
36         int error = 0;
37         int i;
38         
39         if (t && t->default_attrs) {
40                 for (i = 0; (attr = t->default_attrs[i]); i++) {
41                         if ((error = sysfs_create_file(kobj,attr)))
42                                 break;
43                 }
44         }
45         return error;
46 }
47
48 static int create_dir(struct kobject * kobj)
49 {
50         int error = 0;
51         if (kobject_name(kobj)) {
52                 error = sysfs_create_dir(kobj);
53                 if (!error) {
54                         if ((error = populate_dir(kobj)))
55                                 sysfs_remove_dir(kobj);
56                 }
57         }
58         return error;
59 }
60
61
62 static inline struct kobject * to_kobj(struct list_head * entry)
63 {
64         return container_of(entry,struct kobject,entry);
65 }
66
67
68 #ifdef CONFIG_HOTPLUG
69 static int get_kobj_path_length(struct kset *kset, struct kobject *kobj)
70 {
71         int length = 1;
72         struct kobject * parent = kobj;
73
74         /* walk up the ancestors until we hit the one pointing to the 
75          * root.
76          * Add 1 to strlen for leading '/' of each level.
77          */
78         do {
79                 length += strlen(kobject_name(parent)) + 1;
80                 parent = parent->parent;
81         } while (parent);
82         return length;
83 }
84
85 static void fill_kobj_path(struct kset *kset, struct kobject *kobj, char *path, int length)
86 {
87         struct kobject * parent;
88
89         --length;
90         for (parent = kobj; parent; parent = parent->parent) {
91                 int cur = strlen(kobject_name(parent));
92                 /* back up enough to print this name with '/' */
93                 length -= cur;
94                 strncpy (path + length, kobject_name(parent), cur);
95                 *(path + --length) = '/';
96         }
97
98         pr_debug("%s: path = '%s'\n",__FUNCTION__,path);
99 }
100
101 #define BUFFER_SIZE     1024    /* should be enough memory for the env */
102 #define NUM_ENVP        32      /* number of env pointers */
103 static unsigned long sequence_num;
104 static spinlock_t sequence_lock = SPIN_LOCK_UNLOCKED;
105
106 static void kset_hotplug(const char *action, struct kset *kset,
107                          struct kobject *kobj)
108 {
109         char *argv [3];
110         char **envp = NULL;
111         char *buffer = NULL;
112         char *scratch;
113         int i = 0;
114         int retval;
115         int kobj_path_length;
116         char *kobj_path = NULL;
117         char *name = NULL;
118         unsigned long seq;
119
120         /* If the kset has a filter operation, call it. If it returns
121            failure, no hotplug event is required. */
122         if (kset->hotplug_ops->filter) {
123                 if (!kset->hotplug_ops->filter(kset, kobj))
124                         return;
125         }
126
127         pr_debug ("%s\n", __FUNCTION__);
128
129         if (!hotplug_path[0])
130                 return;
131
132         envp = kmalloc(NUM_ENVP * sizeof (char *), GFP_KERNEL);
133         if (!envp)
134                 return;
135         memset (envp, 0x00, NUM_ENVP * sizeof (char *));
136
137         buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);
138         if (!buffer)
139                 goto exit;
140
141         if (kset->hotplug_ops->name)
142                 name = kset->hotplug_ops->name(kset, kobj);
143         if (name == NULL)
144                 name = kset->kobj.name;
145
146         argv [0] = hotplug_path;
147         argv [1] = name;
148         argv [2] = 0;
149
150         /* minimal command environment */
151         envp [i++] = "HOME=/";
152         envp [i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
153
154         scratch = buffer;
155
156         envp [i++] = scratch;
157         scratch += sprintf(scratch, "ACTION=%s", action) + 1;
158
159         spin_lock(&sequence_lock);
160         seq = sequence_num++;
161         spin_unlock(&sequence_lock);
162
163         envp [i++] = scratch;
164         scratch += sprintf(scratch, "SEQNUM=%ld", seq) + 1;
165
166         kobj_path_length = get_kobj_path_length (kset, kobj);
167         kobj_path = kmalloc (kobj_path_length, GFP_KERNEL);
168         if (!kobj_path)
169                 goto exit;
170         memset (kobj_path, 0x00, kobj_path_length);
171         fill_kobj_path (kset, kobj, kobj_path, kobj_path_length);
172
173         envp [i++] = scratch;
174         scratch += sprintf (scratch, "DEVPATH=%s", kobj_path) + 1;
175
176         if (kset->hotplug_ops->hotplug) {
177                 /* have the kset specific function add its stuff */
178                 retval = kset->hotplug_ops->hotplug (kset, kobj,
179                                   &envp[i], NUM_ENVP - i, scratch,
180                                   BUFFER_SIZE - (scratch - buffer));
181                 if (retval) {
182                         pr_debug ("%s - hotplug() returned %d\n",
183                                   __FUNCTION__, retval);
184                         goto exit;
185                 }
186         }
187
188         pr_debug ("%s: %s %s %s %s %s %s %s\n", __FUNCTION__, argv[0], argv[1],
189                   envp[0], envp[1], envp[2], envp[3], envp[4]);
190         retval = call_usermodehelper (argv[0], argv, envp, 0);
191         if (retval)
192                 pr_debug ("%s - call_usermodehelper returned %d\n",
193                           __FUNCTION__, retval);
194
195 exit:
196         kfree(kobj_path);
197         kfree(buffer);
198         kfree(envp);
199         return;
200 }
201
202 void kobject_hotplug(const char *action, struct kobject *kobj)
203 {
204         struct kobject * top_kobj = kobj;
205
206         /* If this kobj does not belong to a kset,
207            try to find a parent that does. */
208         if (!top_kobj->kset && top_kobj->parent) {
209                 do {
210                         top_kobj = top_kobj->parent;
211                 } while (!top_kobj->kset && top_kobj->parent);
212         }
213
214         if (top_kobj->kset && top_kobj->kset->hotplug_ops)
215                 kset_hotplug(action, top_kobj->kset, kobj);
216 }
217 #else
218 void kobject_hotplug(const char *action, struct kobject *kobj)
219 {
220         return;
221 }
222 #endif  /* CONFIG_HOTPLUG */
223
224 /**
225  *      kobject_init - initialize object.
226  *      @kobj:  object in question.
227  */
228
229 void kobject_init(struct kobject * kobj)
230 {
231         atomic_set(&kobj->refcount,1);
232         INIT_LIST_HEAD(&kobj->entry);
233         kobj->kset = kset_get(kobj->kset);
234 }
235
236
237 /**
238  *      unlink - remove kobject from kset list.
239  *      @kobj:  kobject.
240  *
241  *      Remove the kobject from the kset list and decrement
242  *      its parent's refcount.
243  *      This is separated out, so we can use it in both 
244  *      kobject_del() and kobject_add() on error.
245  */
246
247 static void unlink(struct kobject * kobj)
248 {
249         if (kobj->kset) {
250                 down_write(&kobj->kset->subsys->rwsem);
251                 list_del_init(&kobj->entry);
252                 up_write(&kobj->kset->subsys->rwsem);
253         }
254         kobject_put(kobj);
255 }
256
257 /**
258  *      kobject_add - add an object to the hierarchy.
259  *      @kobj:  object.
260  */
261
262 int kobject_add(struct kobject * kobj)
263 {
264         int error = 0;
265         struct kobject * parent;
266
267         if (!(kobj = kobject_get(kobj)))
268                 return -ENOENT;
269         if (!kobj->k_name)
270                 kobj->k_name = kobj->name;
271         parent = kobject_get(kobj->parent);
272
273         pr_debug("kobject %s: registering. parent: %s, set: %s\n",
274                  kobject_name(kobj), parent ? kobject_name(parent) : "<NULL>", 
275                  kobj->kset ? kobj->kset->kobj.name : "<NULL>" );
276
277         if (kobj->kset) {
278                 down_write(&kobj->kset->subsys->rwsem);
279
280                 if (!parent)
281                         parent = kobject_get(&kobj->kset->kobj);
282
283                 list_add_tail(&kobj->entry,&kobj->kset->list);
284                 up_write(&kobj->kset->subsys->rwsem);
285         }
286         kobj->parent = parent;
287
288         error = create_dir(kobj);
289         if (error) {
290                 unlink(kobj);
291                 if (parent)
292                         kobject_put(parent);
293         } else {
294                 kobject_hotplug("add", kobj);
295         }
296
297         return error;
298 }
299
300
301 /**
302  *      kobject_register - initialize and add an object.
303  *      @kobj:  object in question.
304  */
305
306 int kobject_register(struct kobject * kobj)
307 {
308         int error = 0;
309         if (kobj) {
310                 kobject_init(kobj);
311                 error = kobject_add(kobj);
312                 if (error) {
313                         printk("kobject_register failed for %s (%d)\n",
314                                kobject_name(kobj),error);
315                         dump_stack();
316                 }
317         } else
318                 error = -EINVAL;
319         return error;
320 }
321
322
323 /**
324  *      kobject_set_name - Set the name of an object
325  *      @kobj:  object.
326  *      @name:  name. 
327  *
328  *      If strlen(name) < KOBJ_NAME_LEN, then use a dynamically allocated
329  *      string that @kobj->k_name points to. Otherwise, use the static 
330  *      @kobj->name array.
331  */
332
333 int kobject_set_name(struct kobject * kobj, const char * fmt, ...)
334 {
335         int error = 0;
336         int limit = KOBJ_NAME_LEN;
337         int need;
338         va_list args;
339         char * name;
340
341         va_start(args,fmt);
342         /* 
343          * First, try the static array 
344          */
345         need = vsnprintf(kobj->name,limit,fmt,args);
346         if (need < limit) 
347                 name = kobj->name;
348         else {
349                 /* 
350                  * Need more space? Allocate it and try again 
351                  */
352                 limit = need + 1;
353                 name = kmalloc(limit,GFP_KERNEL);
354                 if (!name) {
355                         error = -ENOMEM;
356                         goto Done;
357                 }
358                 need = vsnprintf(name,limit,fmt,args);
359
360                 /* Still? Give up. */
361                 if (need >= limit) {
362                         kfree(name);
363                         error = -EFAULT;
364                         goto Done;
365                 }
366         }
367
368         /* Free the old name, if necessary. */
369         if (kobj->k_name && kobj->k_name != kobj->name)
370                 kfree(kobj->k_name);
371
372         /* Now, set the new name */
373         kobj->k_name = name;
374  Done:
375         va_end(args);
376         return error;
377 }
378
379 EXPORT_SYMBOL(kobject_set_name);
380
381
382 /**
383  *      kobject_rename - change the name of an object
384  *      @kobj:  object in question.
385  *      @new_name: object's new name
386  */
387
388 void kobject_rename(struct kobject * kobj, char *new_name)
389 {
390         kobj = kobject_get(kobj);
391         if (!kobj)
392                 return;
393         sysfs_rename_dir(kobj, new_name);
394         kobject_put(kobj);
395 }
396
397 /**
398  *      kobject_del - unlink kobject from hierarchy.
399  *      @kobj:  object.
400  */
401
402 void kobject_del(struct kobject * kobj)
403 {
404         kobject_hotplug("remove", kobj);
405         sysfs_remove_dir(kobj);
406         unlink(kobj);
407 }
408
409 /**
410  *      kobject_unregister - remove object from hierarchy and decrement refcount.
411  *      @kobj:  object going away.
412  */
413
414 void kobject_unregister(struct kobject * kobj)
415 {
416         pr_debug("kobject %s: unregistering\n",kobject_name(kobj));
417         kobject_del(kobj);
418         kobject_put(kobj);
419 }
420
421 /**
422  *      kobject_get - increment refcount for object.
423  *      @kobj:  object.
424  */
425
426 struct kobject * kobject_get(struct kobject * kobj)
427 {
428         if (kobj) {
429                 WARN_ON(!atomic_read(&kobj->refcount));
430                 atomic_inc(&kobj->refcount);
431         }
432         return kobj;
433 }
434
435 /**
436  *      kobject_cleanup - free kobject resources. 
437  *      @kobj:  object.
438  */
439
440 void kobject_cleanup(struct kobject * kobj)
441 {
442         struct kobj_type * t = get_ktype(kobj);
443         struct kset * s = kobj->kset;
444         struct kobject * parent = kobj->parent;
445
446         pr_debug("kobject %s: cleaning up\n",kobject_name(kobj));
447         if (kobj->k_name != kobj->name)
448                 kfree(kobj->k_name);
449         kobj->k_name = NULL;
450         if (t && t->release)
451                 t->release(kobj);
452         if (s)
453                 kset_put(s);
454         if (parent) 
455                 kobject_put(parent);
456 }
457
458 /**
459  *      kobject_put - decrement refcount for object.
460  *      @kobj:  object.
461  *
462  *      Decrement the refcount, and if 0, call kobject_cleanup().
463  */
464
465 void kobject_put(struct kobject * kobj)
466 {
467         if (atomic_dec_and_test(&kobj->refcount))
468                 kobject_cleanup(kobj);
469 }
470
471
472 /**
473  *      kset_init - initialize a kset for use
474  *      @k:     kset 
475  */
476
477 void kset_init(struct kset * k)
478 {
479         kobject_init(&k->kobj);
480         INIT_LIST_HEAD(&k->list);
481 }
482
483
484 /**
485  *      kset_add - add a kset object to the hierarchy.
486  *      @k:     kset.
487  *
488  *      Simply, this adds the kset's embedded kobject to the 
489  *      hierarchy. 
490  *      We also try to make sure that the kset's embedded kobject
491  *      has a parent before it is added. We only care if the embedded
492  *      kobject is not part of a kset itself, since kobject_add()
493  *      assigns a parent in that case. 
494  *      If that is the case, and the kset has a controlling subsystem,
495  *      then we set the kset's parent to be said subsystem. 
496  */
497
498 int kset_add(struct kset * k)
499 {
500         if (!k->kobj.parent && !k->kobj.kset && k->subsys)
501                 k->kobj.parent = &k->subsys->kset.kobj;
502
503         return kobject_add(&k->kobj);
504 }
505
506
507 /**
508  *      kset_register - initialize and add a kset.
509  *      @k:     kset.
510  */
511
512 int kset_register(struct kset * k)
513 {
514         kset_init(k);
515         return kset_add(k);
516 }
517
518
519 /**
520  *      kset_unregister - remove a kset.
521  *      @k:     kset.
522  */
523
524 void kset_unregister(struct kset * k)
525 {
526         kobject_unregister(&k->kobj);
527 }
528
529
530 /**
531  *      kset_find_obj - search for object in kset.
532  *      @kset:  kset we're looking in.
533  *      @name:  object's name.
534  *
535  *      Lock kset via @kset->subsys, and iterate over @kset->list,
536  *      looking for a matching kobject. Return object if found.
537  */
538
539 struct kobject * kset_find_obj(struct kset * kset, const char * name)
540 {
541         struct list_head * entry;
542         struct kobject * ret = NULL;
543
544         down_read(&kset->subsys->rwsem);
545         list_for_each(entry,&kset->list) {
546                 struct kobject * k = to_kobj(entry);
547                 if (kobject_name(k) && (!strcmp(kobject_name(k),name))) {
548                         ret = k;
549                         break;
550                 }
551         }
552         up_read(&kset->subsys->rwsem);
553         return ret;
554 }
555
556
557 void subsystem_init(struct subsystem * s)
558 {
559         init_rwsem(&s->rwsem);
560         kset_init(&s->kset);
561 }
562
563 /**
564  *      subsystem_register - register a subsystem.
565  *      @s:     the subsystem we're registering.
566  *
567  *      Once we register the subsystem, we want to make sure that 
568  *      the kset points back to this subsystem for correct usage of 
569  *      the rwsem. 
570  */
571
572 int subsystem_register(struct subsystem * s)
573 {
574         int error;
575
576         subsystem_init(s);
577         pr_debug("subsystem %s: registering\n",s->kset.kobj.name);
578
579         if (!(error = kset_add(&s->kset))) {
580                 if (!s->kset.subsys)
581                         s->kset.subsys = s;
582         }
583         return error;
584 }
585
586 void subsystem_unregister(struct subsystem * s)
587 {
588         pr_debug("subsystem %s: unregistering\n",s->kset.kobj.name);
589         kset_unregister(&s->kset);
590 }
591
592
593 /**
594  *      subsystem_create_file - export sysfs attribute file.
595  *      @s:     subsystem.
596  *      @a:     subsystem attribute descriptor.
597  */
598
599 int subsys_create_file(struct subsystem * s, struct subsys_attribute * a)
600 {
601         int error = 0;
602         if (subsys_get(s)) {
603                 error = sysfs_create_file(&s->kset.kobj,&a->attr);
604                 subsys_put(s);
605         }
606         return error;
607 }
608
609
610 /**
611  *      subsystem_remove_file - remove sysfs attribute file.
612  *      @s:     subsystem.
613  *      @a:     attribute desciptor.
614  */
615
616 void subsys_remove_file(struct subsystem * s, struct subsys_attribute * a)
617 {
618         if (subsys_get(s)) {
619                 sysfs_remove_file(&s->kset.kobj,&a->attr);
620                 subsys_put(s);
621         }
622 }
623
624
625 EXPORT_SYMBOL(kobject_init);
626 EXPORT_SYMBOL(kobject_register);
627 EXPORT_SYMBOL(kobject_unregister);
628 EXPORT_SYMBOL(kobject_get);
629 EXPORT_SYMBOL(kobject_put);
630 EXPORT_SYMBOL(kobject_add);
631 EXPORT_SYMBOL(kobject_del);
632 EXPORT_SYMBOL(kobject_rename);
633 EXPORT_SYMBOL(kobject_hotplug);
634
635 EXPORT_SYMBOL(kset_register);
636 EXPORT_SYMBOL(kset_unregister);
637 EXPORT_SYMBOL(kset_find_obj);
638
639 EXPORT_SYMBOL(subsystem_init);
640 EXPORT_SYMBOL(subsystem_register);
641 EXPORT_SYMBOL(subsystem_unregister);
642 EXPORT_SYMBOL(subsys_create_file);
643 EXPORT_SYMBOL(subsys_remove_file);