LCOV - code coverage report
Current view: top level - lib - kobject.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 304 477 63.7 %
Date: 2021-04-22 12:43:58 Functions: 38 48 79.2 %

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

Generated by: LCOV version 1.14