LCOV - code coverage report
Current view: top level - lib - kobject.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 202 389 51.9 %
Date: 2022-12-09 01:23:36 Functions: 26 44 59.1 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  * kobject.c - library routines for handling generic kernel objects
       4             :  *
       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.
       8             :  *
       9             :  * Please see the file Documentation/core-api/kobject.rst for critical information
      10             :  * about using the kobject interface.
      11             :  */
      12             : 
      13             : #include <linux/kobject.h>
      14             : #include <linux/string.h>
      15             : #include <linux/export.h>
      16             : #include <linux/stat.h>
      17             : #include <linux/slab.h>
      18             : #include <linux/random.h>
      19             : 
      20             : /**
      21             :  * kobject_namespace() - Return @kobj's namespace tag.
      22             :  * @kobj: kobject in question
      23             :  *
      24             :  * Returns namespace tag of @kobj if its parent has namespace ops enabled
      25             :  * and thus @kobj should have a namespace tag associated with it.  Returns
      26             :  * %NULL otherwise.
      27             :  */
      28         711 : const void *kobject_namespace(struct kobject *kobj)
      29             : {
      30         711 :         const struct kobj_ns_type_operations *ns_ops = kobj_ns_ops(kobj);
      31             : 
      32         711 :         if (!ns_ops || ns_ops->type == KOBJ_NS_TYPE_NONE)
      33             :                 return NULL;
      34             : 
      35           0 :         return kobj->ktype->namespace(kobj);
      36             : }
      37             : 
      38             : /**
      39             :  * kobject_get_ownership() - Get sysfs ownership data for @kobj.
      40             :  * @kobj: kobject in question
      41             :  * @uid: kernel user ID for sysfs objects
      42             :  * @gid: kernel group ID for sysfs objects
      43             :  *
      44             :  * Returns initial uid/gid pair that should be used when creating sysfs
      45             :  * representation of given kobject. Normally used to adjust ownership of
      46             :  * objects in a container.
      47             :  */
      48        3148 : void kobject_get_ownership(struct kobject *kobj, kuid_t *uid, kgid_t *gid)
      49             : {
      50        3174 :         *uid = GLOBAL_ROOT_UID;
      51        3174 :         *gid = GLOBAL_ROOT_GID;
      52             : 
      53        3174 :         if (kobj->ktype->get_ownership)
      54        2715 :                 kobj->ktype->get_ownership(kobj, uid, gid);
      55        3148 : }
      56             : 
      57         711 : static int create_dir(struct kobject *kobj)
      58             : {
      59         711 :         const struct kobj_type *ktype = get_ktype(kobj);
      60             :         const struct kobj_ns_type_operations *ops;
      61             :         int error;
      62             : 
      63         711 :         error = sysfs_create_dir_ns(kobj, kobject_namespace(kobj));
      64         711 :         if (error)
      65             :                 return error;
      66             : 
      67         711 :         if (ktype) {
      68         711 :                 error = sysfs_create_groups(kobj, ktype->default_groups);
      69         711 :                 if (error) {
      70           0 :                         sysfs_remove_dir(kobj);
      71           0 :                         return error;
      72             :                 }
      73             :         }
      74             : 
      75             :         /*
      76             :          * @kobj->sd may be deleted by an ancestor going away.  Hold an
      77             :          * extra reference so that it stays until @kobj is gone.
      78             :          */
      79        1422 :         sysfs_get(kobj->sd);
      80             : 
      81             :         /*
      82             :          * If @kobj has ns_ops, its children need to be filtered based on
      83             :          * their namespace tags.  Enable namespace support on @kobj->sd.
      84             :          */
      85         711 :         ops = kobj_child_ns_ops(kobj);
      86         711 :         if (ops) {
      87           0 :                 BUG_ON(ops->type <= KOBJ_NS_TYPE_NONE);
      88           0 :                 BUG_ON(ops->type >= KOBJ_NS_TYPES);
      89           0 :                 BUG_ON(!kobj_ns_type_registered(ops->type));
      90             : 
      91           0 :                 sysfs_enable_ns(kobj->sd);
      92             :         }
      93             : 
      94             :         return 0;
      95             : }
      96             : 
      97         686 : static int get_kobj_path_length(struct kobject *kobj)
      98             : {
      99         686 :         int length = 1;
     100         686 :         struct kobject *parent = kobj;
     101             : 
     102             :         /* walk up the ancestors until we hit the one pointing to the
     103             :          * root.
     104             :          * Add 1 to strlen for leading '/' of each level.
     105             :          */
     106             :         do {
     107        2468 :                 if (kobject_name(parent) == NULL)
     108             :                         return 0;
     109        2468 :                 length += strlen(kobject_name(parent)) + 1;
     110        2468 :                 parent = parent->parent;
     111        2468 :         } while (parent);
     112             :         return length;
     113             : }
     114             : 
     115         686 : static void fill_kobj_path(struct kobject *kobj, char *path, int length)
     116             : {
     117             :         struct kobject *parent;
     118             : 
     119         686 :         --length;
     120        3154 :         for (parent = kobj; parent; parent = parent->parent) {
     121        2468 :                 int cur = strlen(kobject_name(parent));
     122             :                 /* back up enough to print this name with '/' */
     123        2468 :                 length -= cur;
     124        2468 :                 memcpy(path + length, kobject_name(parent), cur);
     125        2468 :                 *(path + --length) = '/';
     126             :         }
     127             : 
     128             :         pr_debug("kobject: '%s' (%p): %s: path = '%s'\n", kobject_name(kobj),
     129             :                  kobj, __func__, path);
     130         686 : }
     131             : 
     132             : /**
     133             :  * kobject_get_path() - Allocate memory and fill in the path for @kobj.
     134             :  * @kobj:       kobject in question, with which to build the path
     135             :  * @gfp_mask:   the allocation type used to allocate the path
     136             :  *
     137             :  * Return: The newly allocated memory, caller must free with kfree().
     138             :  */
     139         686 : char *kobject_get_path(struct kobject *kobj, gfp_t gfp_mask)
     140             : {
     141             :         char *path;
     142             :         int len;
     143             : 
     144         686 :         len = get_kobj_path_length(kobj);
     145         686 :         if (len == 0)
     146             :                 return NULL;
     147         686 :         path = kzalloc(len, gfp_mask);
     148         686 :         if (!path)
     149             :                 return NULL;
     150         686 :         fill_kobj_path(kobj, path, len);
     151             : 
     152         686 :         return path;
     153             : }
     154             : EXPORT_SYMBOL_GPL(kobject_get_path);
     155             : 
     156             : /* add the kobject to its kset's list */
     157             : static void kobj_kset_join(struct kobject *kobj)
     158             : {
     159         667 :         if (!kobj->kset)
     160             :                 return;
     161             : 
     162        1334 :         kset_get(kobj->kset);
     163        1334 :         spin_lock(&kobj->kset->list_lock);
     164        1334 :         list_add_tail(&kobj->entry, &kobj->kset->list);
     165         667 :         spin_unlock(&kobj->kset->list_lock);
     166             : }
     167             : 
     168             : /* remove the kobject from its kset's list */
     169             : static void kobj_kset_leave(struct kobject *kobj)
     170             : {
     171           1 :         if (!kobj->kset)
     172             :                 return;
     173             : 
     174           2 :         spin_lock(&kobj->kset->list_lock);
     175           2 :         list_del_init(&kobj->entry);
     176           2 :         spin_unlock(&kobj->kset->list_lock);
     177           1 :         kset_put(kobj->kset);
     178             : }
     179             : 
     180             : static void kobject_init_internal(struct kobject *kobj)
     181             : {
     182          67 :         if (!kobj)
     183             :                 return;
     184        1470 :         kref_init(&kobj->kref);
     185        1470 :         INIT_LIST_HEAD(&kobj->entry);
     186         735 :         kobj->state_in_sysfs = 0;
     187         735 :         kobj->state_add_uevent_sent = 0;
     188         735 :         kobj->state_remove_uevent_sent = 0;
     189         735 :         kobj->state_initialized = 1;
     190             : }
     191             : 
     192             : 
     193         711 : static int kobject_add_internal(struct kobject *kobj)
     194             : {
     195         711 :         int error = 0;
     196             :         struct kobject *parent;
     197             : 
     198         711 :         if (!kobj)
     199             :                 return -ENOENT;
     200             : 
     201         711 :         if (!kobj->name || !kobj->name[0]) {
     202           0 :                 WARN(1,
     203             :                      "kobject: (%p): attempted to be registered with empty name!\n",
     204             :                      kobj);
     205           0 :                 return -EINVAL;
     206             :         }
     207             : 
     208         711 :         parent = kobject_get(kobj->parent);
     209             : 
     210             :         /* join kset if set, use it as parent if we do not already have one */
     211         711 :         if (kobj->kset) {
     212         667 :                 if (!parent)
     213         129 :                         parent = kobject_get(&kobj->kset->kobj);
     214         667 :                 kobj_kset_join(kobj);
     215         667 :                 kobj->parent = parent;
     216             :         }
     217             : 
     218             :         pr_debug("kobject: '%s' (%p): %s: parent: '%s', set: '%s'\n",
     219             :                  kobject_name(kobj), kobj, __func__,
     220             :                  parent ? kobject_name(parent) : "<NULL>",
     221             :                  kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>");
     222             : 
     223         711 :         error = create_dir(kobj);
     224         711 :         if (error) {
     225           0 :                 kobj_kset_leave(kobj);
     226           0 :                 kobject_put(parent);
     227           0 :                 kobj->parent = NULL;
     228             : 
     229             :                 /* be noisy on error issues */
     230           0 :                 if (error == -EEXIST)
     231           0 :                         pr_err("%s failed for %s with -EEXIST, don't try to register things with the same name in the same directory.\n",
     232             :                                __func__, kobject_name(kobj));
     233             :                 else
     234           0 :                         pr_err("%s failed for %s (error: %d parent: %s)\n",
     235             :                                __func__, kobject_name(kobj), error,
     236             :                                parent ? kobject_name(parent) : "'none'");
     237             :         } else
     238         711 :                 kobj->state_in_sysfs = 1;
     239             : 
     240             :         return error;
     241             : }
     242             : 
     243             : /**
     244             :  * kobject_set_name_vargs() - Set the name of a kobject.
     245             :  * @kobj: struct kobject to set the name of
     246             :  * @fmt: format string used to build the name
     247             :  * @vargs: vargs to format the string.
     248             :  */
     249        1250 : int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
     250             :                                   va_list vargs)
     251             : {
     252             :         const char *s;
     253             : 
     254        1250 :         if (kobj->name && !fmt)
     255             :                 return 0;
     256             : 
     257         714 :         s = kvasprintf_const(GFP_KERNEL, fmt, vargs);
     258         714 :         if (!s)
     259             :                 return -ENOMEM;
     260             : 
     261             :         /*
     262             :          * ewww... some of these buggers have '/' in the name ... If
     263             :          * that's the case, we need to make sure we have an actual
     264             :          * allocated copy to modify, since kvasprintf_const may have
     265             :          * returned something from .rodata.
     266             :          */
     267         714 :         if (strchr(s, '/')) {
     268             :                 char *t;
     269             : 
     270           0 :                 t = kstrdup(s, GFP_KERNEL);
     271           0 :                 kfree_const(s);
     272           0 :                 if (!t)
     273             :                         return -ENOMEM;
     274           0 :                 strreplace(t, '/', '!');
     275           0 :                 s = t;
     276             :         }
     277         714 :         kfree_const(kobj->name);
     278         714 :         kobj->name = s;
     279             : 
     280         714 :         return 0;
     281             : }
     282             : 
     283             : /**
     284             :  * kobject_set_name() - Set the name of a kobject.
     285             :  * @kobj: struct kobject to set the name of
     286             :  * @fmt: format string used to build the name
     287             :  *
     288             :  * This sets the name of the kobject.  If you have already added the
     289             :  * kobject to the system, you must call kobject_rename() in order to
     290             :  * change the name of the kobject.
     291             :  */
     292          57 : int kobject_set_name(struct kobject *kobj, const char *fmt, ...)
     293             : {
     294             :         va_list vargs;
     295             :         int retval;
     296             : 
     297          57 :         va_start(vargs, fmt);
     298          57 :         retval = kobject_set_name_vargs(kobj, fmt, vargs);
     299          57 :         va_end(vargs);
     300             : 
     301          57 :         return retval;
     302             : }
     303             : EXPORT_SYMBOL(kobject_set_name);
     304             : 
     305             : /**
     306             :  * kobject_init() - Initialize a kobject structure.
     307             :  * @kobj: pointer to the kobject to initialize
     308             :  * @ktype: pointer to the ktype for this kobject.
     309             :  *
     310             :  * This function will properly initialize a kobject such that it can then
     311             :  * be passed to the kobject_add() call.
     312             :  *
     313             :  * After this function is called, the kobject MUST be cleaned up by a call
     314             :  * to kobject_put(), not by a call to kfree directly to ensure that all of
     315             :  * the memory is cleaned up properly.
     316             :  */
     317         668 : void kobject_init(struct kobject *kobj, const struct kobj_type *ktype)
     318             : {
     319             :         char *err_str;
     320             : 
     321         668 :         if (!kobj) {
     322             :                 err_str = "invalid kobject pointer!";
     323             :                 goto error;
     324             :         }
     325         668 :         if (!ktype) {
     326             :                 err_str = "must have a ktype to be initialized properly!\n";
     327             :                 goto error;
     328             :         }
     329         668 :         if (kobj->state_initialized) {
     330             :                 /* do not error out as sometimes we can recover */
     331           0 :                 pr_err("kobject (%p): tried to init an initialized object, something is seriously wrong.\n",
     332             :                        kobj);
     333           0 :                 dump_stack();
     334             :         }
     335             : 
     336         668 :         kobject_init_internal(kobj);
     337         668 :         kobj->ktype = ktype;
     338         668 :         return;
     339             : 
     340             : error:
     341           0 :         pr_err("kobject (%p): %s\n", kobj, err_str);
     342           0 :         dump_stack();
     343             : }
     344             : EXPORT_SYMBOL(kobject_init);
     345             : 
     346         657 : static __printf(3, 0) int kobject_add_varg(struct kobject *kobj,
     347             :                                            struct kobject *parent,
     348             :                                            const char *fmt, va_list vargs)
     349             : {
     350             :         int retval;
     351             : 
     352         657 :         retval = kobject_set_name_vargs(kobj, fmt, vargs);
     353         657 :         if (retval) {
     354           0 :                 pr_err("kobject: can not set name properly!\n");
     355           0 :                 return retval;
     356             :         }
     357         657 :         kobj->parent = parent;
     358         657 :         return kobject_add_internal(kobj);
     359             : }
     360             : 
     361             : /**
     362             :  * kobject_add() - The main kobject add function.
     363             :  * @kobj: the kobject to add
     364             :  * @parent: pointer to the parent of the kobject.
     365             :  * @fmt: format to name the kobject with.
     366             :  *
     367             :  * The kobject name is set and added to the kobject hierarchy in this
     368             :  * function.
     369             :  *
     370             :  * If @parent is set, then the parent of the @kobj will be set to it.
     371             :  * If @parent is NULL, then the parent of the @kobj will be set to the
     372             :  * kobject associated with the kset assigned to this kobject.  If no kset
     373             :  * is assigned to the kobject, then the kobject will be located in the
     374             :  * root of the sysfs tree.
     375             :  *
     376             :  * Note, no "add" uevent will be created with this call, the caller should set
     377             :  * up all of the necessary sysfs files for the object and then call
     378             :  * kobject_uevent() with the UEVENT_ADD parameter to ensure that
     379             :  * userspace is properly notified of this kobject's creation.
     380             :  *
     381             :  * Return: If this function returns an error, kobject_put() must be
     382             :  *         called to properly clean up the memory associated with the
     383             :  *         object.  Under no instance should the kobject that is passed
     384             :  *         to this function be directly freed with a call to kfree(),
     385             :  *         that can leak memory.
     386             :  *
     387             :  *         If this function returns success, kobject_put() must also be called
     388             :  *         in order to properly clean up the memory associated with the object.
     389             :  *
     390             :  *         In short, once this function is called, kobject_put() MUST be called
     391             :  *         when the use of the object is finished in order to properly free
     392             :  *         everything.
     393             :  */
     394         553 : int kobject_add(struct kobject *kobj, struct kobject *parent,
     395             :                 const char *fmt, ...)
     396             : {
     397             :         va_list args;
     398             :         int retval;
     399             : 
     400         553 :         if (!kobj)
     401             :                 return -EINVAL;
     402             : 
     403         553 :         if (!kobj->state_initialized) {
     404           0 :                 pr_err("kobject '%s' (%p): tried to add an uninitialized object, something is seriously wrong.\n",
     405             :                        kobject_name(kobj), kobj);
     406           0 :                 dump_stack();
     407           0 :                 return -EINVAL;
     408             :         }
     409         553 :         va_start(args, fmt);
     410         553 :         retval = kobject_add_varg(kobj, parent, fmt, args);
     411         553 :         va_end(args);
     412             : 
     413         553 :         return retval;
     414             : }
     415             : EXPORT_SYMBOL(kobject_add);
     416             : 
     417             : /**
     418             :  * kobject_init_and_add() - Initialize a kobject structure and add it to
     419             :  *                          the kobject hierarchy.
     420             :  * @kobj: pointer to the kobject to initialize
     421             :  * @ktype: pointer to the ktype for this kobject.
     422             :  * @parent: pointer to the parent of this kobject.
     423             :  * @fmt: the name of the kobject.
     424             :  *
     425             :  * This function combines the call to kobject_init() and kobject_add().
     426             :  *
     427             :  * If this function returns an error, kobject_put() must be called to
     428             :  * properly clean up the memory associated with the object.  This is the
     429             :  * same type of error handling after a call to kobject_add() and kobject
     430             :  * lifetime rules are the same here.
     431             :  */
     432         104 : int kobject_init_and_add(struct kobject *kobj, const struct kobj_type *ktype,
     433             :                          struct kobject *parent, const char *fmt, ...)
     434             : {
     435             :         va_list args;
     436             :         int retval;
     437             : 
     438         104 :         kobject_init(kobj, ktype);
     439             : 
     440         104 :         va_start(args, fmt);
     441         104 :         retval = kobject_add_varg(kobj, parent, fmt, args);
     442         104 :         va_end(args);
     443             : 
     444         104 :         return retval;
     445             : }
     446             : EXPORT_SYMBOL_GPL(kobject_init_and_add);
     447             : 
     448             : /**
     449             :  * kobject_rename() - Change the name of an object.
     450             :  * @kobj: object in question.
     451             :  * @new_name: object's new name
     452             :  *
     453             :  * It is the responsibility of the caller to provide mutual
     454             :  * exclusion between two different calls of kobject_rename
     455             :  * on the same kobject and to ensure that new_name is valid and
     456             :  * won't conflict with other kobjects.
     457             :  */
     458           0 : int kobject_rename(struct kobject *kobj, const char *new_name)
     459             : {
     460           0 :         int error = 0;
     461           0 :         const char *devpath = NULL;
     462           0 :         const char *dup_name = NULL, *name;
     463           0 :         char *devpath_string = NULL;
     464             :         char *envp[2];
     465             : 
     466           0 :         kobj = kobject_get(kobj);
     467           0 :         if (!kobj)
     468             :                 return -EINVAL;
     469           0 :         if (!kobj->parent) {
     470           0 :                 kobject_put(kobj);
     471           0 :                 return -EINVAL;
     472             :         }
     473             : 
     474           0 :         devpath = kobject_get_path(kobj, GFP_KERNEL);
     475           0 :         if (!devpath) {
     476             :                 error = -ENOMEM;
     477             :                 goto out;
     478             :         }
     479           0 :         devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL);
     480           0 :         if (!devpath_string) {
     481             :                 error = -ENOMEM;
     482             :                 goto out;
     483             :         }
     484           0 :         sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
     485           0 :         envp[0] = devpath_string;
     486           0 :         envp[1] = NULL;
     487             : 
     488           0 :         name = dup_name = kstrdup_const(new_name, GFP_KERNEL);
     489           0 :         if (!name) {
     490             :                 error = -ENOMEM;
     491             :                 goto out;
     492             :         }
     493             : 
     494           0 :         error = sysfs_rename_dir_ns(kobj, new_name, kobject_namespace(kobj));
     495           0 :         if (error)
     496             :                 goto out;
     497             : 
     498             :         /* Install the new kobject name */
     499           0 :         dup_name = kobj->name;
     500           0 :         kobj->name = name;
     501             : 
     502             :         /* This function is mostly/only used for network interface.
     503             :          * Some hotplug package track interfaces by their name and
     504             :          * therefore want to know when the name is changed by the user. */
     505           0 :         kobject_uevent_env(kobj, KOBJ_MOVE, envp);
     506             : 
     507             : out:
     508           0 :         kfree_const(dup_name);
     509           0 :         kfree(devpath_string);
     510           0 :         kfree(devpath);
     511           0 :         kobject_put(kobj);
     512             : 
     513           0 :         return error;
     514             : }
     515             : EXPORT_SYMBOL_GPL(kobject_rename);
     516             : 
     517             : /**
     518             :  * kobject_move() - Move object to another parent.
     519             :  * @kobj: object in question.
     520             :  * @new_parent: object's new parent (can be NULL)
     521             :  */
     522           0 : int kobject_move(struct kobject *kobj, struct kobject *new_parent)
     523             : {
     524             :         int error;
     525             :         struct kobject *old_parent;
     526           0 :         const char *devpath = NULL;
     527           0 :         char *devpath_string = NULL;
     528             :         char *envp[2];
     529             : 
     530           0 :         kobj = kobject_get(kobj);
     531           0 :         if (!kobj)
     532             :                 return -EINVAL;
     533           0 :         new_parent = kobject_get(new_parent);
     534           0 :         if (!new_parent) {
     535           0 :                 if (kobj->kset)
     536           0 :                         new_parent = kobject_get(&kobj->kset->kobj);
     537             :         }
     538             : 
     539             :         /* old object path */
     540           0 :         devpath = kobject_get_path(kobj, GFP_KERNEL);
     541           0 :         if (!devpath) {
     542             :                 error = -ENOMEM;
     543             :                 goto out;
     544             :         }
     545           0 :         devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL);
     546           0 :         if (!devpath_string) {
     547             :                 error = -ENOMEM;
     548             :                 goto out;
     549             :         }
     550           0 :         sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
     551           0 :         envp[0] = devpath_string;
     552           0 :         envp[1] = NULL;
     553           0 :         error = sysfs_move_dir_ns(kobj, new_parent, kobject_namespace(kobj));
     554           0 :         if (error)
     555             :                 goto out;
     556           0 :         old_parent = kobj->parent;
     557           0 :         kobj->parent = new_parent;
     558           0 :         new_parent = NULL;
     559           0 :         kobject_put(old_parent);
     560           0 :         kobject_uevent_env(kobj, KOBJ_MOVE, envp);
     561             : out:
     562           0 :         kobject_put(new_parent);
     563           0 :         kobject_put(kobj);
     564           0 :         kfree(devpath_string);
     565           0 :         kfree(devpath);
     566           0 :         return error;
     567             : }
     568             : EXPORT_SYMBOL_GPL(kobject_move);
     569             : 
     570           1 : static void __kobject_del(struct kobject *kobj)
     571             : {
     572             :         struct kernfs_node *sd;
     573             :         const struct kobj_type *ktype;
     574             : 
     575           1 :         sd = kobj->sd;
     576           1 :         ktype = get_ktype(kobj);
     577             : 
     578           1 :         if (ktype)
     579           1 :                 sysfs_remove_groups(kobj, ktype->default_groups);
     580             : 
     581             :         /* send "remove" if the caller did not do it but sent "add" */
     582           1 :         if (kobj->state_add_uevent_sent && !kobj->state_remove_uevent_sent) {
     583             :                 pr_debug("kobject: '%s' (%p): auto cleanup 'remove' event\n",
     584             :                          kobject_name(kobj), kobj);
     585           1 :                 kobject_uevent(kobj, KOBJ_REMOVE);
     586             :         }
     587             : 
     588           1 :         sysfs_remove_dir(kobj);
     589           1 :         sysfs_put(sd);
     590             : 
     591           1 :         kobj->state_in_sysfs = 0;
     592           1 :         kobj_kset_leave(kobj);
     593           1 :         kobj->parent = NULL;
     594           1 : }
     595             : 
     596             : /**
     597             :  * kobject_del() - Unlink kobject from hierarchy.
     598             :  * @kobj: object.
     599             :  *
     600             :  * This is the function that should be called to delete an object
     601             :  * successfully added via kobject_add().
     602             :  */
     603           0 : void kobject_del(struct kobject *kobj)
     604             : {
     605             :         struct kobject *parent;
     606             : 
     607           0 :         if (!kobj)
     608             :                 return;
     609             : 
     610           0 :         parent = kobj->parent;
     611           0 :         __kobject_del(kobj);
     612           0 :         kobject_put(parent);
     613             : }
     614             : EXPORT_SYMBOL(kobject_del);
     615             : 
     616             : /**
     617             :  * kobject_get() - Increment refcount for object.
     618             :  * @kobj: object.
     619             :  */
     620        3732 : struct kobject *kobject_get(struct kobject *kobj)
     621             : {
     622        3732 :         if (kobj) {
     623        3582 :                 if (!kobj->state_initialized)
     624           0 :                         WARN(1, KERN_WARNING
     625             :                                 "kobject: '%s' (%p): is not initialized, yet kobject_get() is being called.\n",
     626             :                              kobject_name(kobj), kobj);
     627        3582 :                 kref_get(&kobj->kref);
     628             :         }
     629        3732 :         return kobj;
     630             : }
     631             : EXPORT_SYMBOL(kobject_get);
     632             : 
     633           0 : struct kobject * __must_check kobject_get_unless_zero(struct kobject *kobj)
     634             : {
     635          94 :         if (!kobj)
     636             :                 return NULL;
     637         188 :         if (!kref_get_unless_zero(&kobj->kref))
     638           0 :                 kobj = NULL;
     639             :         return kobj;
     640             : }
     641             : EXPORT_SYMBOL(kobject_get_unless_zero);
     642             : 
     643             : /*
     644             :  * kobject_cleanup - free kobject resources.
     645             :  * @kobj: object to cleanup
     646             :  */
     647           1 : static void kobject_cleanup(struct kobject *kobj)
     648             : {
     649           1 :         struct kobject *parent = kobj->parent;
     650           1 :         const struct kobj_type *t = get_ktype(kobj);
     651           1 :         const char *name = kobj->name;
     652             : 
     653             :         pr_debug("kobject: '%s' (%p): %s, parent %p\n",
     654             :                  kobject_name(kobj), kobj, __func__, kobj->parent);
     655             : 
     656             :         if (t && !t->release)
     657             :                 pr_debug("kobject: '%s' (%p): does not have a release() function, it is broken and must be fixed. See Documentation/core-api/kobject.rst.\n",
     658             :                          kobject_name(kobj), kobj);
     659             : 
     660             :         /* remove from sysfs if the caller did not do it */
     661           1 :         if (kobj->state_in_sysfs) {
     662             :                 pr_debug("kobject: '%s' (%p): auto cleanup kobject_del\n",
     663             :                          kobject_name(kobj), kobj);
     664           1 :                 __kobject_del(kobj);
     665             :         } else {
     666             :                 /* avoid dropping the parent reference unnecessarily */
     667             :                 parent = NULL;
     668             :         }
     669             : 
     670           1 :         if (t && t->release) {
     671             :                 pr_debug("kobject: '%s' (%p): calling ktype release\n",
     672             :                          kobject_name(kobj), kobj);
     673           1 :                 t->release(kobj);
     674             :         }
     675             : 
     676             :         /* free name if we allocated it */
     677           1 :         if (name) {
     678             :                 pr_debug("kobject: '%s': free name\n", name);
     679           1 :                 kfree_const(name);
     680             :         }
     681             : 
     682           1 :         kobject_put(parent);
     683           1 : }
     684             : 
     685             : #ifdef CONFIG_DEBUG_KOBJECT_RELEASE
     686             : static void kobject_delayed_cleanup(struct work_struct *work)
     687             : {
     688             :         kobject_cleanup(container_of(to_delayed_work(work),
     689             :                                      struct kobject, release));
     690             : }
     691             : #endif
     692             : 
     693           1 : static void kobject_release(struct kref *kref)
     694             : {
     695           1 :         struct kobject *kobj = container_of(kref, struct kobject, kref);
     696             : #ifdef CONFIG_DEBUG_KOBJECT_RELEASE
     697             :         unsigned long delay = HZ + HZ * (get_random_int() & 0x3);
     698             :         pr_info("kobject: '%s' (%p): %s, parent %p (delayed %ld)\n",
     699             :                  kobject_name(kobj), kobj, __func__, kobj->parent, delay);
     700             :         INIT_DELAYED_WORK(&kobj->release, kobject_delayed_cleanup);
     701             : 
     702             :         schedule_delayed_work(&kobj->release, delay);
     703             : #else
     704           1 :         kobject_cleanup(kobj);
     705             : #endif
     706           1 : }
     707             : 
     708             : /**
     709             :  * kobject_put() - Decrement refcount for object.
     710             :  * @kobj: object.
     711             :  *
     712             :  * Decrement the refcount, and if 0, call kobject_cleanup().
     713             :  */
     714        1237 : void kobject_put(struct kobject *kobj)
     715             : {
     716        1237 :         if (kobj) {
     717        1237 :                 if (!kobj->state_initialized)
     718           0 :                         WARN(1, KERN_WARNING
     719             :                                 "kobject: '%s' (%p): is not initialized, yet kobject_put() is being called.\n",
     720             :                              kobject_name(kobj), kobj);
     721        1237 :                 kref_put(&kobj->kref, kobject_release);
     722             :         }
     723        1237 : }
     724             : EXPORT_SYMBOL(kobject_put);
     725             : 
     726           0 : static void dynamic_kobj_release(struct kobject *kobj)
     727             : {
     728             :         pr_debug("kobject: (%p): %s\n", kobj, __func__);
     729           0 :         kfree(kobj);
     730           0 : }
     731             : 
     732             : static struct kobj_type dynamic_kobj_ktype = {
     733             :         .release        = dynamic_kobj_release,
     734             :         .sysfs_ops      = &kobj_sysfs_ops,
     735             : };
     736             : 
     737             : /**
     738             :  * kobject_create() - Create a struct kobject dynamically.
     739             :  *
     740             :  * This function creates a kobject structure dynamically and sets it up
     741             :  * to be a "dynamic" kobject with a default release function set up.
     742             :  *
     743             :  * If the kobject was not able to be created, NULL will be returned.
     744             :  * The kobject structure returned from here must be cleaned up with a
     745             :  * call to kobject_put() and not kfree(), as kobject_init() has
     746             :  * already been called on this structure.
     747             :  */
     748          14 : static struct kobject *kobject_create(void)
     749             : {
     750             :         struct kobject *kobj;
     751             : 
     752          14 :         kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
     753          14 :         if (!kobj)
     754             :                 return NULL;
     755             : 
     756          14 :         kobject_init(kobj, &dynamic_kobj_ktype);
     757          14 :         return kobj;
     758             : }
     759             : 
     760             : /**
     761             :  * kobject_create_and_add() - Create a struct kobject dynamically and
     762             :  *                            register it with sysfs.
     763             :  * @name: the name for the kobject
     764             :  * @parent: the parent kobject of this kobject, if any.
     765             :  *
     766             :  * This function creates a kobject structure dynamically and registers it
     767             :  * with sysfs.  When you are finished with this structure, call
     768             :  * kobject_put() and the structure will be dynamically freed when
     769             :  * it is no longer being used.
     770             :  *
     771             :  * If the kobject was not able to be created, NULL will be returned.
     772             :  */
     773          14 : struct kobject *kobject_create_and_add(const char *name, struct kobject *parent)
     774             : {
     775             :         struct kobject *kobj;
     776             :         int retval;
     777             : 
     778          14 :         kobj = kobject_create();
     779          14 :         if (!kobj)
     780             :                 return NULL;
     781             : 
     782          14 :         retval = kobject_add(kobj, parent, "%s", name);
     783          14 :         if (retval) {
     784           0 :                 pr_warn("%s: kobject_add error: %d\n", __func__, retval);
     785           0 :                 kobject_put(kobj);
     786           0 :                 kobj = NULL;
     787             :         }
     788             :         return kobj;
     789             : }
     790             : EXPORT_SYMBOL_GPL(kobject_create_and_add);
     791             : 
     792             : /**
     793             :  * kset_init() - Initialize a kset for use.
     794             :  * @k: kset
     795             :  */
     796          13 : void kset_init(struct kset *k)
     797             : {
     798         134 :         kobject_init_internal(&k->kobj);
     799         134 :         INIT_LIST_HEAD(&k->list);
     800          67 :         spin_lock_init(&k->list_lock);
     801          13 : }
     802             : 
     803             : /* default kobject attribute operations */
     804           0 : static ssize_t kobj_attr_show(struct kobject *kobj, struct attribute *attr,
     805             :                               char *buf)
     806             : {
     807             :         struct kobj_attribute *kattr;
     808           0 :         ssize_t ret = -EIO;
     809             : 
     810           0 :         kattr = container_of(attr, struct kobj_attribute, attr);
     811           0 :         if (kattr->show)
     812           0 :                 ret = kattr->show(kobj, kattr, buf);
     813           0 :         return ret;
     814             : }
     815             : 
     816           0 : static ssize_t kobj_attr_store(struct kobject *kobj, struct attribute *attr,
     817             :                                const char *buf, size_t count)
     818             : {
     819             :         struct kobj_attribute *kattr;
     820           0 :         ssize_t ret = -EIO;
     821             : 
     822           0 :         kattr = container_of(attr, struct kobj_attribute, attr);
     823           0 :         if (kattr->store)
     824           0 :                 ret = kattr->store(kobj, kattr, buf, count);
     825           0 :         return ret;
     826             : }
     827             : 
     828             : const struct sysfs_ops kobj_sysfs_ops = {
     829             :         .show   = kobj_attr_show,
     830             :         .store  = kobj_attr_store,
     831             : };
     832             : EXPORT_SYMBOL_GPL(kobj_sysfs_ops);
     833             : 
     834             : /**
     835             :  * kset_register() - Initialize and add a kset.
     836             :  * @k: kset.
     837             :  */
     838          54 : int kset_register(struct kset *k)
     839             : {
     840             :         int err;
     841             : 
     842          54 :         if (!k)
     843             :                 return -EINVAL;
     844             : 
     845          54 :         kset_init(k);
     846          54 :         err = kobject_add_internal(&k->kobj);
     847          54 :         if (err)
     848             :                 return err;
     849          54 :         kobject_uevent(&k->kobj, KOBJ_ADD);
     850          54 :         return 0;
     851             : }
     852             : EXPORT_SYMBOL(kset_register);
     853             : 
     854             : /**
     855             :  * kset_unregister() - Remove a kset.
     856             :  * @k: kset.
     857             :  */
     858           0 : void kset_unregister(struct kset *k)
     859             : {
     860           0 :         if (!k)
     861             :                 return;
     862           0 :         kobject_del(&k->kobj);
     863           0 :         kobject_put(&k->kobj);
     864             : }
     865             : EXPORT_SYMBOL(kset_unregister);
     866             : 
     867             : /**
     868             :  * kset_find_obj() - Search for object in kset.
     869             :  * @kset: kset we're looking in.
     870             :  * @name: object's name.
     871             :  *
     872             :  * Lock kset via @kset->subsys, and iterate over @kset->list,
     873             :  * looking for a matching kobject. If matching object is found
     874             :  * take a reference and return the object.
     875             :  */
     876         131 : struct kobject *kset_find_obj(struct kset *kset, const char *name)
     877             : {
     878             :         struct kobject *k;
     879         131 :         struct kobject *ret = NULL;
     880             : 
     881         262 :         spin_lock(&kset->list_lock);
     882             : 
     883        1595 :         list_for_each_entry(k, &kset->list, entry) {
     884        1558 :                 if (kobject_name(k) && !strcmp(kobject_name(k), name)) {
     885             :                         ret = kobject_get_unless_zero(k);
     886             :                         break;
     887             :                 }
     888             :         }
     889             : 
     890         262 :         spin_unlock(&kset->list_lock);
     891         131 :         return ret;
     892             : }
     893             : EXPORT_SYMBOL_GPL(kset_find_obj);
     894             : 
     895           0 : static void kset_release(struct kobject *kobj)
     896             : {
     897           0 :         struct kset *kset = container_of(kobj, struct kset, kobj);
     898             :         pr_debug("kobject: '%s' (%p): %s\n",
     899             :                  kobject_name(kobj), kobj, __func__);
     900           0 :         kfree(kset);
     901           0 : }
     902             : 
     903          31 : static void kset_get_ownership(struct kobject *kobj, kuid_t *uid, kgid_t *gid)
     904             : {
     905          31 :         if (kobj->parent)
     906          26 :                 kobject_get_ownership(kobj->parent, uid, gid);
     907          31 : }
     908             : 
     909             : static struct kobj_type kset_ktype = {
     910             :         .sysfs_ops      = &kobj_sysfs_ops,
     911             :         .release        = kset_release,
     912             :         .get_ownership  = kset_get_ownership,
     913             : };
     914             : 
     915             : /**
     916             :  * kset_create() - Create a struct kset dynamically.
     917             :  *
     918             :  * @name: the name for the kset
     919             :  * @uevent_ops: a struct kset_uevent_ops for the kset
     920             :  * @parent_kobj: the parent kobject of this kset, if any.
     921             :  *
     922             :  * This function creates a kset structure dynamically.  This structure can
     923             :  * then be registered with the system and show up in sysfs with a call to
     924             :  * kset_register().  When you are finished with this structure, if
     925             :  * kset_register() has been called, call kset_unregister() and the
     926             :  * structure will be dynamically freed when it is no longer being used.
     927             :  *
     928             :  * If the kset was not able to be created, NULL will be returned.
     929             :  */
     930          30 : static struct kset *kset_create(const char *name,
     931             :                                 const struct kset_uevent_ops *uevent_ops,
     932             :                                 struct kobject *parent_kobj)
     933             : {
     934             :         struct kset *kset;
     935             :         int retval;
     936             : 
     937          30 :         kset = kzalloc(sizeof(*kset), GFP_KERNEL);
     938          30 :         if (!kset)
     939             :                 return NULL;
     940          30 :         retval = kobject_set_name(&kset->kobj, "%s", name);
     941          30 :         if (retval) {
     942           0 :                 kfree(kset);
     943           0 :                 return NULL;
     944             :         }
     945          30 :         kset->uevent_ops = uevent_ops;
     946          30 :         kset->kobj.parent = parent_kobj;
     947             : 
     948             :         /*
     949             :          * The kobject of this kset will have a type of kset_ktype and belong to
     950             :          * no kset itself.  That way we can properly free it when it is
     951             :          * finished being used.
     952             :          */
     953          30 :         kset->kobj.ktype = &kset_ktype;
     954          30 :         kset->kobj.kset = NULL;
     955             : 
     956          30 :         return kset;
     957             : }
     958             : 
     959             : /**
     960             :  * kset_create_and_add() - Create a struct kset dynamically and add it to sysfs.
     961             :  *
     962             :  * @name: the name for the kset
     963             :  * @uevent_ops: a struct kset_uevent_ops for the kset
     964             :  * @parent_kobj: the parent kobject of this kset, if any.
     965             :  *
     966             :  * This function creates a kset structure dynamically and registers it
     967             :  * with sysfs.  When you are finished with this structure, call
     968             :  * kset_unregister() and the structure will be dynamically freed when it
     969             :  * is no longer being used.
     970             :  *
     971             :  * If the kset was not able to be created, NULL will be returned.
     972             :  */
     973          30 : struct kset *kset_create_and_add(const char *name,
     974             :                                  const struct kset_uevent_ops *uevent_ops,
     975             :                                  struct kobject *parent_kobj)
     976             : {
     977             :         struct kset *kset;
     978             :         int error;
     979             : 
     980          30 :         kset = kset_create(name, uevent_ops, parent_kobj);
     981          30 :         if (!kset)
     982             :                 return NULL;
     983          30 :         error = kset_register(kset);
     984          30 :         if (error) {
     985           0 :                 kfree(kset);
     986           0 :                 return NULL;
     987             :         }
     988             :         return kset;
     989             : }
     990             : EXPORT_SYMBOL_GPL(kset_create_and_add);
     991             : 
     992             : 
     993             : static DEFINE_SPINLOCK(kobj_ns_type_lock);
     994             : static const struct kobj_ns_type_operations *kobj_ns_ops_tbl[KOBJ_NS_TYPES];
     995             : 
     996           0 : int kobj_ns_type_register(const struct kobj_ns_type_operations *ops)
     997             : {
     998           0 :         enum kobj_ns_type type = ops->type;
     999             :         int error;
    1000             : 
    1001           0 :         spin_lock(&kobj_ns_type_lock);
    1002             : 
    1003           0 :         error = -EINVAL;
    1004           0 :         if (type >= KOBJ_NS_TYPES)
    1005             :                 goto out;
    1006             : 
    1007           0 :         error = -EINVAL;
    1008           0 :         if (type <= KOBJ_NS_TYPE_NONE)
    1009             :                 goto out;
    1010             : 
    1011           0 :         error = -EBUSY;
    1012           0 :         if (kobj_ns_ops_tbl[type])
    1013             :                 goto out;
    1014             : 
    1015           0 :         error = 0;
    1016           0 :         kobj_ns_ops_tbl[type] = ops;
    1017             : 
    1018             : out:
    1019           0 :         spin_unlock(&kobj_ns_type_lock);
    1020           0 :         return error;
    1021             : }
    1022             : 
    1023           0 : int kobj_ns_type_registered(enum kobj_ns_type type)
    1024             : {
    1025           0 :         int registered = 0;
    1026             : 
    1027           0 :         spin_lock(&kobj_ns_type_lock);
    1028           0 :         if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES))
    1029           0 :                 registered = kobj_ns_ops_tbl[type] != NULL;
    1030           0 :         spin_unlock(&kobj_ns_type_lock);
    1031             : 
    1032           0 :         return registered;
    1033             : }
    1034             : 
    1035           0 : const struct kobj_ns_type_operations *kobj_child_ns_ops(struct kobject *parent)
    1036             : {
    1037        1422 :         const struct kobj_ns_type_operations *ops = NULL;
    1038             : 
    1039        1422 :         if (parent && parent->ktype && parent->ktype->child_ns_type)
    1040         542 :                 ops = parent->ktype->child_ns_type(parent);
    1041             : 
    1042           0 :         return ops;
    1043             : }
    1044             : 
    1045           0 : const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj)
    1046             : {
    1047        1422 :         return kobj_child_ns_ops(kobj->parent);
    1048             : }
    1049             : 
    1050           0 : bool kobj_ns_current_may_mount(enum kobj_ns_type type)
    1051             : {
    1052           0 :         bool may_mount = true;
    1053             : 
    1054           0 :         spin_lock(&kobj_ns_type_lock);
    1055           0 :         if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
    1056           0 :             kobj_ns_ops_tbl[type])
    1057           0 :                 may_mount = kobj_ns_ops_tbl[type]->current_may_mount();
    1058           0 :         spin_unlock(&kobj_ns_type_lock);
    1059             : 
    1060           0 :         return may_mount;
    1061             : }
    1062             : 
    1063           0 : void *kobj_ns_grab_current(enum kobj_ns_type type)
    1064             : {
    1065           0 :         void *ns = NULL;
    1066             : 
    1067           0 :         spin_lock(&kobj_ns_type_lock);
    1068           0 :         if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
    1069           0 :             kobj_ns_ops_tbl[type])
    1070           0 :                 ns = kobj_ns_ops_tbl[type]->grab_current_ns();
    1071           0 :         spin_unlock(&kobj_ns_type_lock);
    1072             : 
    1073           0 :         return ns;
    1074             : }
    1075             : EXPORT_SYMBOL_GPL(kobj_ns_grab_current);
    1076             : 
    1077           0 : const void *kobj_ns_netlink(enum kobj_ns_type type, struct sock *sk)
    1078             : {
    1079           0 :         const void *ns = NULL;
    1080             : 
    1081           0 :         spin_lock(&kobj_ns_type_lock);
    1082           0 :         if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
    1083           0 :             kobj_ns_ops_tbl[type])
    1084           0 :                 ns = kobj_ns_ops_tbl[type]->netlink_ns(sk);
    1085           0 :         spin_unlock(&kobj_ns_type_lock);
    1086             : 
    1087           0 :         return ns;
    1088             : }
    1089             : 
    1090           0 : const void *kobj_ns_initial(enum kobj_ns_type type)
    1091             : {
    1092           0 :         const void *ns = NULL;
    1093             : 
    1094           0 :         spin_lock(&kobj_ns_type_lock);
    1095           0 :         if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
    1096           0 :             kobj_ns_ops_tbl[type])
    1097           0 :                 ns = kobj_ns_ops_tbl[type]->initial_ns();
    1098           0 :         spin_unlock(&kobj_ns_type_lock);
    1099             : 
    1100           0 :         return ns;
    1101             : }
    1102             : 
    1103           0 : void kobj_ns_drop(enum kobj_ns_type type, void *ns)
    1104             : {
    1105           0 :         spin_lock(&kobj_ns_type_lock);
    1106           0 :         if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
    1107           0 :             kobj_ns_ops_tbl[type] && kobj_ns_ops_tbl[type]->drop_ns)
    1108           0 :                 kobj_ns_ops_tbl[type]->drop_ns(ns);
    1109           0 :         spin_unlock(&kobj_ns_type_lock);
    1110           0 : }
    1111             : EXPORT_SYMBOL_GPL(kobj_ns_drop);

Generated by: LCOV version 1.14