Lines Matching +full:container +full:- +full:rules
1 // SPDX-License-Identifier: GPL-2.0
3 * kobject.c - library routines for handling generic kernel objects
5 * Copyright (c) 2002-2003 Patrick Mochel <mochel@osdl.org>
6 * Copyright (c) 2006-2007 Greg Kroah-Hartman <greg@kroah.com>
7 * Copyright (c) 2006-2007 Novell Inc.
9 * Please see the file Documentation/core-api/kobject.rst for critical information
23 * kobject_namespace() - Return @kobj's namespace tag.
34 if (!ns_ops || ns_ops->type == KOBJ_NS_TYPE_NONE) in kobject_namespace()
37 return kobj->ktype->namespace(kobj); in kobject_namespace()
41 * kobject_get_ownership() - Get sysfs ownership data for @kobj.
48 * objects in a container.
55 if (kobj->ktype->get_ownership) in kobject_get_ownership()
56 kobj->ktype->get_ownership(kobj, uid, gid); in kobject_get_ownership()
77 error = sysfs_create_groups(kobj, ktype->default_groups); in create_dir()
84 * @kobj->sd may be deleted by an ancestor going away. Hold an in create_dir()
87 sysfs_get(kobj->sd); in create_dir()
91 * their namespace tags. Enable namespace support on @kobj->sd. in create_dir()
95 BUG_ON(!kobj_ns_type_is_valid(ops->type)); in create_dir()
96 BUG_ON(!kobj_ns_type_registered(ops->type)); in create_dir()
98 sysfs_enable_ns(kobj->sd); in create_dir()
117 parent = parent->parent; in get_kobj_path_length()
126 --length; in fill_kobj_path()
127 for (parent = kobj; parent; parent = parent->parent) { in fill_kobj_path()
130 length -= cur; in fill_kobj_path()
132 return -EINVAL; in fill_kobj_path()
134 *(path + --length) = '/'; in fill_kobj_path()
144 * kobject_get_path() - Allocate memory and fill in the path for @kobj.
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()
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()
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()
214 return -ENOENT; in kobject_add_internal()
216 if (!kobj->name || !kobj->name[0]) { in kobject_add_internal()
220 return -EINVAL; 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()
230 kobj->parent = parent; in kobject_add_internal()
236 kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>"); in kobject_add_internal()
242 kobj->parent = NULL; in kobject_add_internal()
245 if (error == -EEXIST) in kobject_add_internal()
246 …pr_err("%s failed for %s with -EEXIST, don't try to register things with the same name in the same… in kobject_add_internal()
253 kobj->state_in_sysfs = 1; in kobject_add_internal()
259 * kobject_set_name_vargs() - Set the name of a kobject.
269 if (kobj->name && !fmt) in kobject_set_name_vargs()
274 return -ENOMEM; in kobject_set_name_vargs()
288 return -ENOMEM; in kobject_set_name_vargs()
291 kfree_const(kobj->name); in kobject_set_name_vargs()
292 kobj->name = s; in kobject_set_name_vargs()
298 * kobject_set_name() - Set the name of a kobject.
320 * kobject_init() - Initialize a kobject structure.
343 if (kobj->state_initialized) { in kobject_init()
351 kobj->ktype = ktype; in kobject_init()
371 kobj->parent = parent; in kobject_add_varg()
376 * kobject_add() - The main kobject add function.
415 return -EINVAL; in kobject_add()
417 if (!kobj->state_initialized) { in kobject_add()
421 return -EINVAL; in kobject_add()
432 * kobject_init_and_add() - Initialize a kobject structure and add it to
444 * lifetime rules are the same here.
463 * kobject_rename() - Change the name of an object.
482 return -EINVAL; in kobject_rename()
483 if (!kobj->parent) { in kobject_rename()
485 return -EINVAL; in kobject_rename()
490 error = -ENOMEM; in kobject_rename()
495 error = -ENOMEM; in kobject_rename()
504 error = -ENOMEM; in kobject_rename()
513 dup_name = kobj->name; in kobject_rename()
514 kobj->name = name; in kobject_rename()
532 * kobject_move() - Move object to another parent.
546 return -EINVAL; in kobject_move()
549 if (kobj->kset) in kobject_move()
550 new_parent = kobject_get(&kobj->kset->kobj); in kobject_move()
556 error = -ENOMEM; in kobject_move()
561 error = -ENOMEM; in kobject_move()
570 old_parent = kobj->parent; in kobject_move()
571 kobj->parent = new_parent; in kobject_move()
589 sd = kobj->sd; 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()
604 kobj->state_in_sysfs = 0; in __kobject_del()
606 kobj->parent = NULL; in __kobject_del()
610 * kobject_del() - Unlink kobject from hierarchy.
623 parent = kobj->parent; in kobject_del()
630 * kobject_get() - Increment refcount for object.
636 if (!kobj->state_initialized) in kobject_get()
640 kref_get(&kobj->kref); in kobject_get()
650 if (!kref_get_unless_zero(&kobj->kref)) in kobject_get_unless_zero()
657 * kobject_cleanup - free kobject resources.
662 struct kobject *parent = kobj->parent; 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()
679 if (t->release) { in kobject_cleanup()
682 t->release(kobj); in kobject_cleanup()
684 …e a release() function, it is broken and must be fixed. See Documentation/core-api/kobject.rst.\n", in kobject_cleanup()
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()
721 * kobject_put() - Decrement refcount for object.
729 if (!kobj->state_initialized) in kobject_put()
733 kref_put(&kobj->kref, kobject_release); in kobject_put()
750 * kobject_create() - Create a struct kobject dynamically.
773 * kobject_create_and_add() - Create a struct kobject dynamically and
805 * kset_init() - Initialize a kset for use.
810 kobject_init_internal(&k->kobj); in kset_init()
811 INIT_LIST_HEAD(&k->list); in kset_init()
812 spin_lock_init(&k->list_lock); in kset_init()
820 ssize_t ret = -EIO; in kobj_attr_show()
823 if (kattr->show) in kobj_attr_show()
824 ret = kattr->show(kobj, kattr, buf); in kobj_attr_show()
832 ssize_t ret = -EIO; in kobj_attr_store()
835 if (kattr->store) in kobj_attr_store()
836 ret = kattr->store(kobj, kattr, buf, count); in kobj_attr_store()
847 * kset_register() - Initialize and add a kset.
858 return -EINVAL; in kset_register()
860 if (!k->kobj.ktype) { in kset_register()
862 return -EINVAL; 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()
879 * kset_unregister() - Remove a kset.
886 kobject_del(&k->kobj); in kset_unregister()
887 kobject_put(&k->kobj); in kset_unregister()
892 * kset_find_obj() - Search for object in kset.
896 * Lock kset via @kset->subsys, and iterate over @kset->list,
905 spin_lock(&kset->list_lock); in kset_find_obj()
907 list_for_each_entry(k, &kset->list, entry) { in kset_find_obj()
914 spin_unlock(&kset->list_lock); in kset_find_obj()
929 if (kobj->parent) in kset_get_ownership()
930 kobject_get_ownership(kobj->parent, uid, gid); in kset_get_ownership()
940 * kset_create() - Create a struct kset dynamically.
964 retval = kobject_set_name(&kset->kobj, "%s", name); in kset_create()
969 kset->uevent_ops = uevent_ops; 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()
984 * kset_create_and_add() - Create a struct kset dynamically and add it to sysfs.
1022 enum kobj_ns_type type = ops->type; in kobj_ns_type_register()
1027 error = -EINVAL; in kobj_ns_type_register()
1031 error = -EBUSY; in kobj_ns_type_register()
1059 if (parent && parent->ktype->child_ns_type) in kobj_child_ns_ops()
1060 ops = parent->ktype->child_ns_type(parent); in kobj_child_ns_ops()
1067 return kobj_child_ns_ops(kobj->parent); in kobj_ns_ops()
1076 may_mount = kobj_ns_ops_tbl[type]->current_may_mount(); in kobj_ns_current_may_mount()
1088 ns = kobj_ns_ops_tbl[type]->grab_current_ns(); in kobj_ns_grab_current()
1101 ns = kobj_ns_ops_tbl[type]->netlink_ns(sk); in kobj_ns_netlink()
1113 ns = kobj_ns_ops_tbl[type]->initial_ns(); in kobj_ns_initial()
1123 kobj_ns_ops_tbl[type] && kobj_ns_ops_tbl[type]->drop_ns) in kobj_ns_drop()
1124 kobj_ns_ops_tbl[type]->drop_ns(ns); in kobj_ns_drop()