Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
kobject.c
Go to the documentation of this file.
1 /*
2  * kobject.c - library routines for handling generic kernel objects
3  *
4  * Copyright (c) 2002-2003 Patrick Mochel <[email protected]>
5  * Copyright (c) 2006-2007 Greg Kroah-Hartman <[email protected]>
6  * Copyright (c) 2006-2007 Novell Inc.
7  *
8  * This file is released under the GPLv2.
9  *
10  *
11  * Please see the file Documentation/kobject.txt for critical information
12  * about using the kobject interface.
13  */
14 
15 #include <linux/kobject.h>
16 #include <linux/string.h>
17 #include <linux/export.h>
18 #include <linux/stat.h>
19 #include <linux/slab.h>
20 
21 /*
22  * populate_dir - populate directory with attributes.
23  * @kobj: object we're working on.
24  *
25  * Most subsystems have a set of default attributes that are associated
26  * with an object that registers with them. This is a helper called during
27  * object registration that loops through the default attributes of the
28  * subsystem and creates attributes files for them in sysfs.
29  */
30 static int populate_dir(struct kobject *kobj)
31 {
32  struct kobj_type *t = get_ktype(kobj);
33  struct attribute *attr;
34  int error = 0;
35  int i;
36 
37  if (t && t->default_attrs) {
38  for (i = 0; (attr = t->default_attrs[i]) != NULL; i++) {
39  error = sysfs_create_file(kobj, attr);
40  if (error)
41  break;
42  }
43  }
44  return error;
45 }
46 
47 static int create_dir(struct kobject *kobj)
48 {
49  int error = 0;
50  error = sysfs_create_dir(kobj);
51  if (!error) {
52  error = populate_dir(kobj);
53  if (error)
54  sysfs_remove_dir(kobj);
55  }
56  return error;
57 }
58 
59 static int get_kobj_path_length(struct kobject *kobj)
60 {
61  int length = 1;
62  struct kobject *parent = kobj;
63 
64  /* walk up the ancestors until we hit the one pointing to the
65  * root.
66  * Add 1 to strlen for leading '/' of each level.
67  */
68  do {
69  if (kobject_name(parent) == NULL)
70  return 0;
71  length += strlen(kobject_name(parent)) + 1;
72  parent = parent->parent;
73  } while (parent);
74  return length;
75 }
76 
77 static void fill_kobj_path(struct kobject *kobj, char *path, int length)
78 {
79  struct kobject *parent;
80 
81  --length;
82  for (parent = kobj; parent; parent = parent->parent) {
83  int cur = strlen(kobject_name(parent));
84  /* back up enough to print this name with '/' */
85  length -= cur;
86  strncpy(path + length, kobject_name(parent), cur);
87  *(path + --length) = '/';
88  }
89 
90  pr_debug("kobject: '%s' (%p): %s: path = '%s'\n", kobject_name(kobj),
91  kobj, __func__, path);
92 }
93 
103 {
104  char *path;
105  int len;
106 
107  len = get_kobj_path_length(kobj);
108  if (len == 0)
109  return NULL;
110  path = kzalloc(len, gfp_mask);
111  if (!path)
112  return NULL;
113  fill_kobj_path(kobj, path, len);
114 
115  return path;
116 }
118 
119 /* add the kobject to its kset's list */
120 static void kobj_kset_join(struct kobject *kobj)
121 {
122  if (!kobj->kset)
123  return;
124 
125  kset_get(kobj->kset);
126  spin_lock(&kobj->kset->list_lock);
127  list_add_tail(&kobj->entry, &kobj->kset->list);
128  spin_unlock(&kobj->kset->list_lock);
129 }
130 
131 /* remove the kobject from its kset's list */
132 static void kobj_kset_leave(struct kobject *kobj)
133 {
134  if (!kobj->kset)
135  return;
136 
137  spin_lock(&kobj->kset->list_lock);
138  list_del_init(&kobj->entry);
139  spin_unlock(&kobj->kset->list_lock);
140  kset_put(kobj->kset);
141 }
142 
143 static void kobject_init_internal(struct kobject *kobj)
144 {
145  if (!kobj)
146  return;
147  kref_init(&kobj->kref);
148  INIT_LIST_HEAD(&kobj->entry);
149  kobj->state_in_sysfs = 0;
150  kobj->state_add_uevent_sent = 0;
151  kobj->state_remove_uevent_sent = 0;
152  kobj->state_initialized = 1;
153 }
154 
155 
156 static int kobject_add_internal(struct kobject *kobj)
157 {
158  int error = 0;
159  struct kobject *parent;
160 
161  if (!kobj)
162  return -ENOENT;
163 
164  if (!kobj->name || !kobj->name[0]) {
165  WARN(1, "kobject: (%p): attempted to be registered with empty "
166  "name!\n", kobj);
167  return -EINVAL;
168  }
169 
170  parent = kobject_get(kobj->parent);
171 
172  /* join kset if set, use it as parent if we do not already have one */
173  if (kobj->kset) {
174  if (!parent)
175  parent = kobject_get(&kobj->kset->kobj);
176  kobj_kset_join(kobj);
177  kobj->parent = parent;
178  }
179 
180  pr_debug("kobject: '%s' (%p): %s: parent: '%s', set: '%s'\n",
181  kobject_name(kobj), kobj, __func__,
182  parent ? kobject_name(parent) : "<NULL>",
183  kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>");
184 
185  error = create_dir(kobj);
186  if (error) {
187  kobj_kset_leave(kobj);
188  kobject_put(parent);
189  kobj->parent = NULL;
190 
191  /* be noisy on error issues */
192  if (error == -EEXIST)
193  WARN(1, "%s failed for %s with "
194  "-EEXIST, don't try to register things with "
195  "the same name in the same directory.\n",
196  __func__, kobject_name(kobj));
197  else
198  WARN(1, "%s failed for %s (error: %d parent: %s)\n",
199  __func__, kobject_name(kobj), error,
200  parent ? kobject_name(parent) : "'none'");
201  } else
202  kobj->state_in_sysfs = 1;
203 
204  return error;
205 }
206 
213 int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
214  va_list vargs)
215 {
216  const char *old_name = kobj->name;
217  char *s;
218 
219  if (kobj->name && !fmt)
220  return 0;
221 
222  kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs);
223  if (!kobj->name)
224  return -ENOMEM;
225 
226  /* ewww... some of these buggers have '/' in the name ... */
227  while ((s = strchr(kobj->name, '/')))
228  s[0] = '!';
229 
230  kfree(old_name);
231  return 0;
232 }
233 
243 int kobject_set_name(struct kobject *kobj, const char *fmt, ...)
244 {
245  va_list vargs;
246  int retval;
247 
248  va_start(vargs, fmt);
249  retval = kobject_set_name_vargs(kobj, fmt, vargs);
250  va_end(vargs);
251 
252  return retval;
253 }
255 
268 void kobject_init(struct kobject *kobj, struct kobj_type *ktype)
269 {
270  char *err_str;
271 
272  if (!kobj) {
273  err_str = "invalid kobject pointer!";
274  goto error;
275  }
276  if (!ktype) {
277  err_str = "must have a ktype to be initialized properly!\n";
278  goto error;
279  }
280  if (kobj->state_initialized) {
281  /* do not error out as sometimes we can recover */
282  printk(KERN_ERR "kobject (%p): tried to init an initialized "
283  "object, something is seriously wrong.\n", kobj);
284  dump_stack();
285  }
286 
287  kobject_init_internal(kobj);
288  kobj->ktype = ktype;
289  return;
290 
291 error:
292  printk(KERN_ERR "kobject (%p): %s\n", kobj, err_str);
293  dump_stack();
294 }
296 
297 static int kobject_add_varg(struct kobject *kobj, struct kobject *parent,
298  const char *fmt, va_list vargs)
299 {
300  int retval;
301 
302  retval = kobject_set_name_vargs(kobj, fmt, vargs);
303  if (retval) {
304  printk(KERN_ERR "kobject: can not set name properly!\n");
305  return retval;
306  }
307  kobj->parent = parent;
308  return kobject_add_internal(kobj);
309 }
310 
336 int kobject_add(struct kobject *kobj, struct kobject *parent,
337  const char *fmt, ...)
338 {
339  va_list args;
340  int retval;
341 
342  if (!kobj)
343  return -EINVAL;
344 
345  if (!kobj->state_initialized) {
346  printk(KERN_ERR "kobject '%s' (%p): tried to add an "
347  "uninitialized object, something is seriously wrong.\n",
348  kobject_name(kobj), kobj);
349  dump_stack();
350  return -EINVAL;
351  }
352  va_start(args, fmt);
353  retval = kobject_add_varg(kobj, parent, fmt, args);
354  va_end(args);
355 
356  return retval;
357 }
359 
371 int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,
372  struct kobject *parent, const char *fmt, ...)
373 {
374  va_list args;
375  int retval;
376 
377  kobject_init(kobj, ktype);
378 
379  va_start(args, fmt);
380  retval = kobject_add_varg(kobj, parent, fmt, args);
381  va_end(args);
382 
383  return retval;
384 }
386 
397 int kobject_rename(struct kobject *kobj, const char *new_name)
398 {
399  int error = 0;
400  const char *devpath = NULL;
401  const char *dup_name = NULL, *name;
402  char *devpath_string = NULL;
403  char *envp[2];
404 
405  kobj = kobject_get(kobj);
406  if (!kobj)
407  return -EINVAL;
408  if (!kobj->parent)
409  return -EINVAL;
410 
411  devpath = kobject_get_path(kobj, GFP_KERNEL);
412  if (!devpath) {
413  error = -ENOMEM;
414  goto out;
415  }
416  devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL);
417  if (!devpath_string) {
418  error = -ENOMEM;
419  goto out;
420  }
421  sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
422  envp[0] = devpath_string;
423  envp[1] = NULL;
424 
425  name = dup_name = kstrdup(new_name, GFP_KERNEL);
426  if (!name) {
427  error = -ENOMEM;
428  goto out;
429  }
430 
431  error = sysfs_rename_dir(kobj, new_name);
432  if (error)
433  goto out;
434 
435  /* Install the new kobject name */
436  dup_name = kobj->name;
437  kobj->name = name;
438 
439  /* This function is mostly/only used for network interface.
440  * Some hotplug package track interfaces by their name and
441  * therefore want to know when the name is changed by the user. */
442  kobject_uevent_env(kobj, KOBJ_MOVE, envp);
443 
444 out:
445  kfree(dup_name);
446  kfree(devpath_string);
447  kfree(devpath);
448  kobject_put(kobj);
449 
450  return error;
451 }
453 
459 int kobject_move(struct kobject *kobj, struct kobject *new_parent)
460 {
461  int error;
462  struct kobject *old_parent;
463  const char *devpath = NULL;
464  char *devpath_string = NULL;
465  char *envp[2];
466 
467  kobj = kobject_get(kobj);
468  if (!kobj)
469  return -EINVAL;
470  new_parent = kobject_get(new_parent);
471  if (!new_parent) {
472  if (kobj->kset)
473  new_parent = kobject_get(&kobj->kset->kobj);
474  }
475  /* old object path */
476  devpath = kobject_get_path(kobj, GFP_KERNEL);
477  if (!devpath) {
478  error = -ENOMEM;
479  goto out;
480  }
481  devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL);
482  if (!devpath_string) {
483  error = -ENOMEM;
484  goto out;
485  }
486  sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
487  envp[0] = devpath_string;
488  envp[1] = NULL;
489  error = sysfs_move_dir(kobj, new_parent);
490  if (error)
491  goto out;
492  old_parent = kobj->parent;
493  kobj->parent = new_parent;
494  new_parent = NULL;
495  kobject_put(old_parent);
496  kobject_uevent_env(kobj, KOBJ_MOVE, envp);
497 out:
498  kobject_put(new_parent);
499  kobject_put(kobj);
500  kfree(devpath_string);
501  kfree(devpath);
502  return error;
503 }
504 
509 void kobject_del(struct kobject *kobj)
510 {
511  if (!kobj)
512  return;
513 
514  sysfs_remove_dir(kobj);
515  kobj->state_in_sysfs = 0;
516  kobj_kset_leave(kobj);
517  kobject_put(kobj->parent);
518  kobj->parent = NULL;
519 }
520 
525 struct kobject *kobject_get(struct kobject *kobj)
526 {
527  if (kobj)
528  kref_get(&kobj->kref);
529  return kobj;
530 }
531 
532 /*
533  * kobject_cleanup - free kobject resources.
534  * @kobj: object to cleanup
535  */
536 static void kobject_cleanup(struct kobject *kobj)
537 {
538  struct kobj_type *t = get_ktype(kobj);
539  const char *name = kobj->name;
540 
541  pr_debug("kobject: '%s' (%p): %s\n",
542  kobject_name(kobj), kobj, __func__);
543 
544  if (t && !t->release)
545  pr_debug("kobject: '%s' (%p): does not have a release() "
546  "function, it is broken and must be fixed.\n",
547  kobject_name(kobj), kobj);
548 
549  /* send "remove" if the caller did not do it but sent "add" */
550  if (kobj->state_add_uevent_sent && !kobj->state_remove_uevent_sent) {
551  pr_debug("kobject: '%s' (%p): auto cleanup 'remove' event\n",
552  kobject_name(kobj), kobj);
554  }
555 
556  /* remove from sysfs if the caller did not do it */
557  if (kobj->state_in_sysfs) {
558  pr_debug("kobject: '%s' (%p): auto cleanup kobject_del\n",
559  kobject_name(kobj), kobj);
560  kobject_del(kobj);
561  }
562 
563  if (t && t->release) {
564  pr_debug("kobject: '%s' (%p): calling ktype release\n",
565  kobject_name(kobj), kobj);
566  t->release(kobj);
567  }
568 
569  /* free name if we allocated it */
570  if (name) {
571  pr_debug("kobject: '%s': free name\n", name);
572  kfree(name);
573  }
574 }
575 
576 static void kobject_release(struct kref *kref)
577 {
578  kobject_cleanup(container_of(kref, struct kobject, kref));
579 }
580 
587 void kobject_put(struct kobject *kobj)
588 {
589  if (kobj) {
590  if (!kobj->state_initialized)
591  WARN(1, KERN_WARNING "kobject: '%s' (%p): is not "
592  "initialized, yet kobject_put() is being "
593  "called.\n", kobject_name(kobj), kobj);
594  kref_put(&kobj->kref, kobject_release);
595  }
596 }
597 
598 static void dynamic_kobj_release(struct kobject *kobj)
599 {
600  pr_debug("kobject: (%p): %s\n", kobj, __func__);
601  kfree(kobj);
602 }
603 
604 static struct kobj_type dynamic_kobj_ktype = {
605  .release = dynamic_kobj_release,
606  .sysfs_ops = &kobj_sysfs_ops,
607 };
608 
620 struct kobject *kobject_create(void)
621 {
622  struct kobject *kobj;
623 
624  kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
625  if (!kobj)
626  return NULL;
627 
628  kobject_init(kobj, &dynamic_kobj_ktype);
629  return kobj;
630 }
631 
645 struct kobject *kobject_create_and_add(const char *name, struct kobject *parent)
646 {
647  struct kobject *kobj;
648  int retval;
649 
650  kobj = kobject_create();
651  if (!kobj)
652  return NULL;
653 
654  retval = kobject_add(kobj, parent, "%s", name);
655  if (retval) {
656  printk(KERN_WARNING "%s: kobject_add error: %d\n",
657  __func__, retval);
658  kobject_put(kobj);
659  kobj = NULL;
660  }
661  return kobj;
662 }
664 
669 void kset_init(struct kset *k)
670 {
671  kobject_init_internal(&k->kobj);
672  INIT_LIST_HEAD(&k->list);
674 }
675 
676 /* default kobject attribute operations */
677 static ssize_t kobj_attr_show(struct kobject *kobj, struct attribute *attr,
678  char *buf)
679 {
680  struct kobj_attribute *kattr;
681  ssize_t ret = -EIO;
682 
683  kattr = container_of(attr, struct kobj_attribute, attr);
684  if (kattr->show)
685  ret = kattr->show(kobj, kattr, buf);
686  return ret;
687 }
688 
689 static ssize_t kobj_attr_store(struct kobject *kobj, struct attribute *attr,
690  const char *buf, size_t count)
691 {
692  struct kobj_attribute *kattr;
693  ssize_t ret = -EIO;
694 
695  kattr = container_of(attr, struct kobj_attribute, attr);
696  if (kattr->store)
697  ret = kattr->store(kobj, kattr, buf, count);
698  return ret;
699 }
700 
701 const struct sysfs_ops kobj_sysfs_ops = {
702  .show = kobj_attr_show,
703  .store = kobj_attr_store,
704 };
705 
710 int kset_register(struct kset *k)
711 {
712  int err;
713 
714  if (!k)
715  return -EINVAL;
716 
717  kset_init(k);
718  err = kobject_add_internal(&k->kobj);
719  if (err)
720  return err;
722  return 0;
723 }
724 
729 void kset_unregister(struct kset *k)
730 {
731  if (!k)
732  return;
733  kobject_put(&k->kobj);
734 }
735 
745 struct kobject *kset_find_obj(struct kset *kset, const char *name)
746 {
747  struct kobject *k;
748  struct kobject *ret = NULL;
749 
750  spin_lock(&kset->list_lock);
751 
752  list_for_each_entry(k, &kset->list, entry) {
753  if (kobject_name(k) && !strcmp(kobject_name(k), name)) {
754  ret = kobject_get(k);
755  break;
756  }
757  }
758 
759  spin_unlock(&kset->list_lock);
760  return ret;
761 }
762 
763 static void kset_release(struct kobject *kobj)
764 {
765  struct kset *kset = container_of(kobj, struct kset, kobj);
766  pr_debug("kobject: '%s' (%p): %s\n",
767  kobject_name(kobj), kobj, __func__);
768  kfree(kset);
769 }
770 
771 static struct kobj_type kset_ktype = {
772  .sysfs_ops = &kobj_sysfs_ops,
773  .release = kset_release,
774 };
775 
791 static struct kset *kset_create(const char *name,
792  const struct kset_uevent_ops *uevent_ops,
793  struct kobject *parent_kobj)
794 {
795  struct kset *kset;
796  int retval;
797 
798  kset = kzalloc(sizeof(*kset), GFP_KERNEL);
799  if (!kset)
800  return NULL;
801  retval = kobject_set_name(&kset->kobj, name);
802  if (retval) {
803  kfree(kset);
804  return NULL;
805  }
806  kset->uevent_ops = uevent_ops;
807  kset->kobj.parent = parent_kobj;
808 
809  /*
810  * The kobject of this kset will have a type of kset_ktype and belong to
811  * no kset itself. That way we can properly free it when it is
812  * finished being used.
813  */
814  kset->kobj.ktype = &kset_ktype;
815  kset->kobj.kset = NULL;
816 
817  return kset;
818 }
819 
834 struct kset *kset_create_and_add(const char *name,
835  const struct kset_uevent_ops *uevent_ops,
836  struct kobject *parent_kobj)
837 {
838  struct kset *kset;
839  int error;
840 
841  kset = kset_create(name, uevent_ops, parent_kobj);
842  if (!kset)
843  return NULL;
844  error = kset_register(kset);
845  if (error) {
846  kfree(kset);
847  return NULL;
848  }
849  return kset;
850 }
852 
853 
854 static DEFINE_SPINLOCK(kobj_ns_type_lock);
855 static const struct kobj_ns_type_operations *kobj_ns_ops_tbl[KOBJ_NS_TYPES];
856 
858 {
859  enum kobj_ns_type type = ops->type;
860  int error;
861 
862  spin_lock(&kobj_ns_type_lock);
863 
864  error = -EINVAL;
865  if (type >= KOBJ_NS_TYPES)
866  goto out;
867 
868  error = -EINVAL;
869  if (type <= KOBJ_NS_TYPE_NONE)
870  goto out;
871 
872  error = -EBUSY;
873  if (kobj_ns_ops_tbl[type])
874  goto out;
875 
876  error = 0;
877  kobj_ns_ops_tbl[type] = ops;
878 
879 out:
880  spin_unlock(&kobj_ns_type_lock);
881  return error;
882 }
883 
885 {
886  int registered = 0;
887 
888  spin_lock(&kobj_ns_type_lock);
889  if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES))
890  registered = kobj_ns_ops_tbl[type] != NULL;
891  spin_unlock(&kobj_ns_type_lock);
892 
893  return registered;
894 }
895 
896 const struct kobj_ns_type_operations *kobj_child_ns_ops(struct kobject *parent)
897 {
898  const struct kobj_ns_type_operations *ops = NULL;
899 
900  if (parent && parent->ktype->child_ns_type)
901  ops = parent->ktype->child_ns_type(parent);
902 
903  return ops;
904 }
905 
906 const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj)
907 {
908  return kobj_child_ns_ops(kobj->parent);
909 }
910 
911 
913 {
914  void *ns = NULL;
915 
916  spin_lock(&kobj_ns_type_lock);
917  if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
918  kobj_ns_ops_tbl[type])
919  ns = kobj_ns_ops_tbl[type]->grab_current_ns();
920  spin_unlock(&kobj_ns_type_lock);
921 
922  return ns;
923 }
924 
925 const void *kobj_ns_netlink(enum kobj_ns_type type, struct sock *sk)
926 {
927  const void *ns = NULL;
928 
929  spin_lock(&kobj_ns_type_lock);
930  if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
931  kobj_ns_ops_tbl[type])
932  ns = kobj_ns_ops_tbl[type]->netlink_ns(sk);
933  spin_unlock(&kobj_ns_type_lock);
934 
935  return ns;
936 }
937 
939 {
940  const void *ns = NULL;
941 
942  spin_lock(&kobj_ns_type_lock);
943  if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
944  kobj_ns_ops_tbl[type])
945  ns = kobj_ns_ops_tbl[type]->initial_ns();
946  spin_unlock(&kobj_ns_type_lock);
947 
948  return ns;
949 }
950 
951 void kobj_ns_drop(enum kobj_ns_type type, void *ns)
952 {
953  spin_lock(&kobj_ns_type_lock);
954  if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
955  kobj_ns_ops_tbl[type] && kobj_ns_ops_tbl[type]->drop_ns)
956  kobj_ns_ops_tbl[type]->drop_ns(ns);
957  spin_unlock(&kobj_ns_type_lock);
958 }
959 
963