Lines Matching refs:kobj

30 const void *kobject_namespace(const struct kobject *kobj)  in kobject_namespace()  argument
32 const struct kobj_ns_type_operations *ns_ops = kobj_ns_ops(kobj); in kobject_namespace()
37 return kobj->ktype->namespace(kobj); in kobject_namespace()
50 void kobject_get_ownership(const struct kobject *kobj, kuid_t *uid, kgid_t *gid) in kobject_get_ownership() argument
55 if (kobj->ktype->get_ownership) in kobject_get_ownership()
56 kobj->ktype->get_ownership(kobj, uid, gid); in kobject_get_ownership()
67 static int create_dir(struct kobject *kobj) in create_dir() argument
69 const struct kobj_type *ktype = get_ktype(kobj); in create_dir()
73 error = sysfs_create_dir_ns(kobj, kobject_namespace(kobj)); in create_dir()
77 error = sysfs_create_groups(kobj, ktype->default_groups); in create_dir()
79 sysfs_remove_dir(kobj); in create_dir()
87 sysfs_get(kobj->sd); in create_dir()
93 ops = kobj_child_ns_ops(kobj); in create_dir()
98 sysfs_enable_ns(kobj->sd); in create_dir()
104 static int get_kobj_path_length(const struct kobject *kobj) in get_kobj_path_length() argument
107 const struct kobject *parent = kobj; in get_kobj_path_length()
122 static int fill_kobj_path(const struct kobject *kobj, char *path, int length) in fill_kobj_path() argument
127 for (parent = kobj; parent; parent = parent->parent) { in fill_kobj_path()
137 pr_debug("'%s' (%p): %s: path = '%s'\n", kobject_name(kobj), in fill_kobj_path()
138 kobj, __func__, path); in fill_kobj_path()
150 char *kobject_get_path(const struct kobject *kobj, gfp_t gfp_mask) in kobject_get_path() argument
156 len = get_kobj_path_length(kobj); in kobject_get_path()
162 if (fill_kobj_path(kobj, path, len)) { in kobject_get_path()
172 static void kobj_kset_join(struct kobject *kobj) in kobj_kset_join() argument
174 if (!kobj->kset) in kobj_kset_join()
177 kset_get(kobj->kset); in kobj_kset_join()
178 spin_lock(&kobj->kset->list_lock); in kobj_kset_join()
179 list_add_tail(&kobj->entry, &kobj->kset->list); in kobj_kset_join()
180 spin_unlock(&kobj->kset->list_lock); in kobj_kset_join()
184 static void kobj_kset_leave(struct kobject *kobj) in kobj_kset_leave() argument
186 if (!kobj->kset) in kobj_kset_leave()
189 spin_lock(&kobj->kset->list_lock); in kobj_kset_leave()
190 list_del_init(&kobj->entry); in kobj_kset_leave()
191 spin_unlock(&kobj->kset->list_lock); in kobj_kset_leave()
192 kset_put(kobj->kset); in kobj_kset_leave()
195 static void kobject_init_internal(struct kobject *kobj) in kobject_init_internal() argument
197 if (!kobj) in kobject_init_internal()
199 kref_init(&kobj->kref); in kobject_init_internal()
200 INIT_LIST_HEAD(&kobj->entry); in kobject_init_internal()
201 kobj->state_in_sysfs = 0; in kobject_init_internal()
202 kobj->state_add_uevent_sent = 0; in kobject_init_internal()
203 kobj->state_remove_uevent_sent = 0; in kobject_init_internal()
204 kobj->state_initialized = 1; in kobject_init_internal()
208 static int kobject_add_internal(struct kobject *kobj) in kobject_add_internal() argument
213 if (!kobj) in kobject_add_internal()
216 if (!kobj->name || !kobj->name[0]) { in kobject_add_internal()
219 kobj); in kobject_add_internal()
223 parent = kobject_get(kobj->parent); in kobject_add_internal()
226 if (kobj->kset) { in kobject_add_internal()
228 parent = kobject_get(&kobj->kset->kobj); in kobject_add_internal()
229 kobj_kset_join(kobj); in kobject_add_internal()
230 kobj->parent = parent; in kobject_add_internal()
234 kobject_name(kobj), kobj, __func__, in kobject_add_internal()
236 kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>"); in kobject_add_internal()
238 error = create_dir(kobj); in kobject_add_internal()
240 kobj_kset_leave(kobj); in kobject_add_internal()
242 kobj->parent = NULL; in kobject_add_internal()
247 __func__, kobject_name(kobj)); in kobject_add_internal()
250 __func__, kobject_name(kobj), error, in kobject_add_internal()
253 kobj->state_in_sysfs = 1; in kobject_add_internal()
264 int kobject_set_name_vargs(struct kobject *kobj, const char *fmt, in kobject_set_name_vargs() argument
269 if (kobj->name && !fmt) in kobject_set_name_vargs()
291 kfree_const(kobj->name); in kobject_set_name_vargs()
292 kobj->name = s; in kobject_set_name_vargs()
306 int kobject_set_name(struct kobject *kobj, const char *fmt, ...) in kobject_set_name() argument
312 retval = kobject_set_name_vargs(kobj, fmt, vargs); in kobject_set_name()
331 void kobject_init(struct kobject *kobj, const struct kobj_type *ktype) in kobject_init() argument
335 if (!kobj) { in kobject_init()
343 if (kobj->state_initialized) { in kobject_init()
346 kobj); in kobject_init()
350 kobject_init_internal(kobj); in kobject_init()
351 kobj->ktype = ktype; in kobject_init()
355 pr_err("kobject (%p): %s\n", kobj, err_str); in kobject_init()
360 static __printf(3, 0) int kobject_add_varg(struct kobject *kobj, in kobject_add_varg() argument
366 retval = kobject_set_name_vargs(kobj, fmt, vargs); in kobject_add_varg()
371 kobj->parent = parent; in kobject_add_varg()
372 return kobject_add_internal(kobj); in kobject_add_varg()
408 int kobject_add(struct kobject *kobj, struct kobject *parent, in kobject_add() argument
414 if (!kobj) in kobject_add()
417 if (!kobj->state_initialized) { in kobject_add()
419 kobject_name(kobj), kobj); in kobject_add()
424 retval = kobject_add_varg(kobj, parent, fmt, args); in kobject_add()
446 int kobject_init_and_add(struct kobject *kobj, const struct kobj_type *ktype, in kobject_init_and_add() argument
452 kobject_init(kobj, ktype); in kobject_init_and_add()
455 retval = kobject_add_varg(kobj, parent, fmt, args); in kobject_init_and_add()
472 int kobject_rename(struct kobject *kobj, const char *new_name) in kobject_rename() argument
480 kobj = kobject_get(kobj); in kobject_rename()
481 if (!kobj) in kobject_rename()
483 if (!kobj->parent) { in kobject_rename()
484 kobject_put(kobj); in kobject_rename()
488 devpath = kobject_get_path(kobj, GFP_KERNEL); in kobject_rename()
508 error = sysfs_rename_dir_ns(kobj, new_name, kobject_namespace(kobj)); in kobject_rename()
513 dup_name = kobj->name; in kobject_rename()
514 kobj->name = name; in kobject_rename()
519 kobject_uevent_env(kobj, KOBJ_MOVE, envp); in kobject_rename()
525 kobject_put(kobj); in kobject_rename()
536 int kobject_move(struct kobject *kobj, struct kobject *new_parent) in kobject_move() argument
544 kobj = kobject_get(kobj); in kobject_move()
545 if (!kobj) in kobject_move()
549 if (kobj->kset) in kobject_move()
550 new_parent = kobject_get(&kobj->kset->kobj); in kobject_move()
554 devpath = kobject_get_path(kobj, GFP_KERNEL); in kobject_move()
567 error = sysfs_move_dir_ns(kobj, new_parent, kobject_namespace(kobj)); in kobject_move()
570 old_parent = kobj->parent; in kobject_move()
571 kobj->parent = new_parent; in kobject_move()
574 kobject_uevent_env(kobj, KOBJ_MOVE, envp); in kobject_move()
577 kobject_put(kobj); in kobject_move()
584 static void __kobject_del(struct kobject *kobj) in __kobject_del() argument
589 sd = kobj->sd; in __kobject_del()
590 ktype = get_ktype(kobj); in __kobject_del()
592 sysfs_remove_groups(kobj, ktype->default_groups); in __kobject_del()
595 if (kobj->state_add_uevent_sent && !kobj->state_remove_uevent_sent) { in __kobject_del()
597 kobject_name(kobj), kobj); in __kobject_del()
598 kobject_uevent(kobj, KOBJ_REMOVE); in __kobject_del()
601 sysfs_remove_dir(kobj); in __kobject_del()
604 kobj->state_in_sysfs = 0; in __kobject_del()
605 kobj_kset_leave(kobj); in __kobject_del()
606 kobj->parent = NULL; in __kobject_del()
616 void kobject_del(struct kobject *kobj) in kobject_del() argument
620 if (!kobj) in kobject_del()
623 parent = kobj->parent; in kobject_del()
624 __kobject_del(kobj); in kobject_del()
633 struct kobject *kobject_get(struct kobject *kobj) in kobject_get() argument
635 if (kobj) { in kobject_get()
636 if (!kobj->state_initialized) in kobject_get()
639 kobject_name(kobj), kobj); in kobject_get()
640 kref_get(&kobj->kref); in kobject_get()
642 return kobj; in kobject_get()
646 struct kobject * __must_check kobject_get_unless_zero(struct kobject *kobj) in kobject_get_unless_zero() argument
648 if (!kobj) in kobject_get_unless_zero()
650 if (!kref_get_unless_zero(&kobj->kref)) in kobject_get_unless_zero()
651 kobj = NULL; in kobject_get_unless_zero()
652 return kobj; in kobject_get_unless_zero()
660 static void kobject_cleanup(struct kobject *kobj) in kobject_cleanup() argument
662 struct kobject *parent = kobj->parent; in kobject_cleanup()
663 const struct kobj_type *t = get_ktype(kobj); in kobject_cleanup()
664 const char *name = kobj->name; in kobject_cleanup()
667 kobject_name(kobj), kobj, __func__, kobj->parent); in kobject_cleanup()
670 if (kobj->state_in_sysfs) { in kobject_cleanup()
672 kobject_name(kobj), kobj); in kobject_cleanup()
673 __kobject_del(kobj); in kobject_cleanup()
681 kobject_name(kobj), kobj); in kobject_cleanup()
682 t->release(kobj); in kobject_cleanup()
685 kobject_name(kobj), kobj); in kobject_cleanup()
707 struct kobject *kobj = container_of(kref, struct kobject, kref); in kobject_release() local
711 kobject_name(kobj), kobj, __func__, kobj->parent, delay); in kobject_release()
712 INIT_DELAYED_WORK(&kobj->release, kobject_delayed_cleanup); in kobject_release()
714 schedule_delayed_work(&kobj->release, delay); in kobject_release()
716 kobject_cleanup(kobj); in kobject_release()
726 void kobject_put(struct kobject *kobj) in kobject_put() argument
728 if (kobj) { in kobject_put()
729 if (!kobj->state_initialized) in kobject_put()
732 kobject_name(kobj), kobj); in kobject_put()
733 kref_put(&kobj->kref, kobject_release); in kobject_put()
738 static void dynamic_kobj_release(struct kobject *kobj) in dynamic_kobj_release() argument
740 pr_debug("(%p): %s\n", kobj, __func__); in dynamic_kobj_release()
741 kfree(kobj); in dynamic_kobj_release()
762 struct kobject *kobj; in kobject_create() local
764 kobj = kzalloc(sizeof(*kobj), GFP_KERNEL); in kobject_create()
765 if (!kobj) in kobject_create()
768 kobject_init(kobj, &dynamic_kobj_ktype); in kobject_create()
769 return kobj; in kobject_create()
787 struct kobject *kobj; in kobject_create_and_add() local
790 kobj = kobject_create(); in kobject_create_and_add()
791 if (!kobj) in kobject_create_and_add()
794 retval = kobject_add(kobj, parent, "%s", name); in kobject_create_and_add()
797 kobject_put(kobj); in kobject_create_and_add()
798 kobj = NULL; in kobject_create_and_add()
800 return kobj; in kobject_create_and_add()
810 kobject_init_internal(&k->kobj); in kset_init()
816 static ssize_t kobj_attr_show(struct kobject *kobj, struct attribute *attr, in kobj_attr_show() argument
824 ret = kattr->show(kobj, kattr, buf); in kobj_attr_show()
828 static ssize_t kobj_attr_store(struct kobject *kobj, struct attribute *attr, in kobj_attr_store() argument
836 ret = kattr->store(kobj, kattr, buf, count); in kobj_attr_store()
860 if (!k->kobj.ktype) { in kset_register()
866 err = kobject_add_internal(&k->kobj); in kset_register()
868 kfree_const(k->kobj.name); in kset_register()
870 k->kobj.name = NULL; in kset_register()
873 kobject_uevent(&k->kobj, KOBJ_ADD); in kset_register()
886 kobject_del(&k->kobj); in kset_unregister()
887 kobject_put(&k->kobj); in kset_unregister()
919 static void kset_release(struct kobject *kobj) in kset_release() argument
921 struct kset *kset = container_of(kobj, struct kset, kobj); in kset_release()
923 kobject_name(kobj), kobj, __func__); in kset_release()
927 static void kset_get_ownership(const struct kobject *kobj, kuid_t *uid, kgid_t *gid) in kset_get_ownership() argument
929 if (kobj->parent) in kset_get_ownership()
930 kobject_get_ownership(kobj->parent, uid, gid); in kset_get_ownership()
964 retval = kobject_set_name(&kset->kobj, "%s", name); in kset_create()
970 kset->kobj.parent = parent_kobj; in kset_create()
977 kset->kobj.ktype = &kset_ktype; in kset_create()
978 kset->kobj.kset = NULL; in kset_create()
1065 const struct kobj_ns_type_operations *kobj_ns_ops(const struct kobject *kobj) in kobj_ns_ops() argument
1067 return kobj_child_ns_ops(kobj->parent); in kobj_ns_ops()