The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/lib/kobject.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * kobject.c - library routines for handling generic kernel objects
    3  *
    4  * Copyright (c) 2002-2003 Patrick Mochel <mochel@osdl.org>
    5  * Copyright (c) 2006-2007 Greg Kroah-Hartman <greg@kroah.com>
    6  * Copyright (c) 2006-2007 Novell Inc.
    7  *
    8  * This file is released under the GPLv2.
    9  *
   10  *
   11  * Please see the file Documentation/kobject.txt for critical information
   12  * about using the kobject interface.
   13  */
   14 
   15 #include <linux/kobject.h>
   16 #include <linux/string.h>
   17 #include <linux/export.h>
   18 #include <linux/stat.h>
   19 #include <linux/slab.h>
   20 
   21 /*
   22  * populate_dir - populate directory with attributes.
   23  * @kobj: object we're working on.
   24  *
   25  * Most subsystems have a set of default attributes that are associated
   26  * with an object that registers with them.  This is a helper called during
   27  * object registration that loops through the default attributes of the
   28  * subsystem and creates attributes files for them in sysfs.
   29  */
   30 static int populate_dir(struct kobject *kobj)
   31 {
   32         struct kobj_type *t = get_ktype(kobj);
   33         struct attribute *attr;
   34         int error = 0;
   35         int i;
   36 
   37         if (t && t->default_attrs) {
   38                 for (i = 0; (attr = t->default_attrs[i]) != NULL; i++) {
   39                         error = sysfs_create_file(kobj, attr);
   40                         if (error)
   41                                 break;
   42                 }
   43         }
   44         return error;
   45 }
   46 
   47 static int create_dir(struct kobject *kobj)
   48 {
   49         int error = 0;
   50         error = sysfs_create_dir(kobj);
   51         if (!error) {
   52                 error = populate_dir(kobj);
   53                 if (error)
   54                         sysfs_remove_dir(kobj);
   55         }
   56         return error;
   57 }
   58 
   59 static int get_kobj_path_length(struct kobject *kobj)
   60 {
   61         int length = 1;
   62         struct kobject *parent = kobj;
   63 
   64         /* walk up the ancestors until we hit the one pointing to the
   65          * root.
   66          * Add 1 to strlen for leading '/' of each level.
   67          */
   68         do {
   69                 if (kobject_name(parent) == NULL)
   70                         return 0;
   71                 length += strlen(kobject_name(parent)) + 1;
   72                 parent = parent->parent;
   73         } while (parent);
   74         return length;
   75 }
   76 
   77 static void fill_kobj_path(struct kobject *kobj, char *path, int length)
   78 {
   79         struct kobject *parent;
   80 
   81         --length;
   82         for (parent = kobj; parent; parent = parent->parent) {
   83                 int cur = strlen(kobject_name(parent));
   84                 /* back up enough to print this name with '/' */
   85                 length -= cur;
   86                 strncpy(path + length, kobject_name(parent), cur);
   87                 *(path + --length) = '/';
   88         }
   89 
   90         pr_debug("kobject: '%s' (%p): %s: path = '%s'\n", kobject_name(kobj),
   91                  kobj, __func__, path);
   92 }
   93 
   94 /**
   95  * kobject_get_path - generate and return the path associated with a given kobj and kset pair.
   96  *
   97  * @kobj:       kobject in question, with which to build the path
   98  * @gfp_mask:   the allocation type used to allocate the path
   99  *
  100  * The result must be freed by the caller with kfree().
  101  */
  102 char *kobject_get_path(struct kobject *kobj, gfp_t gfp_mask)
  103 {
  104         char *path;
  105         int len;
  106 
  107         len = get_kobj_path_length(kobj);
  108         if (len == 0)
  109                 return NULL;
  110         path = kzalloc(len, gfp_mask);
  111         if (!path)
  112                 return NULL;
  113         fill_kobj_path(kobj, path, len);
  114 
  115         return path;
  116 }
  117 EXPORT_SYMBOL_GPL(kobject_get_path);
  118 
  119 /* add the kobject to its kset's list */
  120 static void kobj_kset_join(struct kobject *kobj)
  121 {
  122         if (!kobj->kset)
  123                 return;
  124 
  125         kset_get(kobj->kset);
  126         spin_lock(&kobj->kset->list_lock);
  127         list_add_tail(&kobj->entry, &kobj->kset->list);
  128         spin_unlock(&kobj->kset->list_lock);
  129 }
  130 
  131 /* remove the kobject from its kset's list */
  132 static void kobj_kset_leave(struct kobject *kobj)
  133 {
  134         if (!kobj->kset)
  135                 return;
  136 
  137         spin_lock(&kobj->kset->list_lock);
  138         list_del_init(&kobj->entry);
  139         spin_unlock(&kobj->kset->list_lock);
  140         kset_put(kobj->kset);
  141 }
  142 
  143 static void kobject_init_internal(struct kobject *kobj)
  144 {
  145         if (!kobj)
  146                 return;
  147         kref_init(&kobj->kref);
  148         INIT_LIST_HEAD(&kobj->entry);
  149         kobj->state_in_sysfs = 0;
  150         kobj->state_add_uevent_sent = 0;
  151         kobj->state_remove_uevent_sent = 0;
  152         kobj->state_initialized = 1;
  153 }
  154 
  155 
  156 static int kobject_add_internal(struct kobject *kobj)
  157 {
  158         int error = 0;
  159         struct kobject *parent;
  160 
  161         if (!kobj)
  162                 return -ENOENT;
  163 
  164         if (!kobj->name || !kobj->name[0]) {
  165                 WARN(1, "kobject: (%p): attempted to be registered with empty "
  166                          "name!\n", kobj);
  167                 return -EINVAL;
  168         }
  169 
  170         parent = kobject_get(kobj->parent);
  171 
  172         /* join kset if set, use it as parent if we do not already have one */
  173         if (kobj->kset) {
  174                 if (!parent)
  175                         parent = kobject_get(&kobj->kset->kobj);
  176                 kobj_kset_join(kobj);
  177                 kobj->parent = parent;
  178         }
  179 
  180         pr_debug("kobject: '%s' (%p): %s: parent: '%s', set: '%s'\n",
  181                  kobject_name(kobj), kobj, __func__,
  182                  parent ? kobject_name(parent) : "<NULL>",
  183                  kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>");
  184 
  185         error = create_dir(kobj);
  186         if (error) {
  187                 kobj_kset_leave(kobj);
  188                 kobject_put(parent);
  189                 kobj->parent = NULL;
  190 
  191                 /* be noisy on error issues */
  192                 if (error == -EEXIST)
  193                         WARN(1, "%s failed for %s with "
  194                              "-EEXIST, don't try to register things with "
  195                              "the same name in the same directory.\n",
  196                              __func__, kobject_name(kobj));
  197                 else
  198                         WARN(1, "%s failed for %s (error: %d parent: %s)\n",
  199                              __func__, kobject_name(kobj), error,
  200                              parent ? kobject_name(parent) : "'none'");
  201         } else
  202                 kobj->state_in_sysfs = 1;
  203 
  204         return error;
  205 }
  206 
  207 /**
  208  * kobject_set_name_vargs - Set the name of an kobject
  209  * @kobj: struct kobject to set the name of
  210  * @fmt: format string used to build the name
  211  * @vargs: vargs to format the string.
  212  */
  213 int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
  214                                   va_list vargs)
  215 {
  216         const char *old_name = kobj->name;
  217         char *s;
  218 
  219         if (kobj->name && !fmt)
  220                 return 0;
  221 
  222         kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs);
  223         if (!kobj->name)
  224                 return -ENOMEM;
  225 
  226         /* ewww... some of these buggers have '/' in the name ... */
  227         while ((s = strchr(kobj->name, '/')))
  228                 s[0] = '!';
  229 
  230         kfree(old_name);
  231         return 0;
  232 }
  233 
  234 /**
  235  * kobject_set_name - Set the name of a kobject
  236  * @kobj: struct kobject to set the name of
  237  * @fmt: format string used to build the name
  238  *
  239  * This sets the name of the kobject.  If you have already added the
  240  * kobject to the system, you must call kobject_rename() in order to
  241  * change the name of the kobject.
  242  */
  243 int kobject_set_name(struct kobject *kobj, const char *fmt, ...)
  244 {
  245         va_list vargs;
  246         int retval;
  247 
  248         va_start(vargs, fmt);
  249         retval = kobject_set_name_vargs(kobj, fmt, vargs);
  250         va_end(vargs);
  251 
  252         return retval;
  253 }
  254 EXPORT_SYMBOL(kobject_set_name);
  255 
  256 /**
  257  * kobject_init - initialize a kobject structure
  258  * @kobj: pointer to the kobject to initialize
  259  * @ktype: pointer to the ktype for this kobject.
  260  *
  261  * This function will properly initialize a kobject such that it can then
  262  * be passed to the kobject_add() call.
  263  *
  264  * After this function is called, the kobject MUST be cleaned up by a call
  265  * to kobject_put(), not by a call to kfree directly to ensure that all of
  266  * the memory is cleaned up properly.
  267  */
  268 void kobject_init(struct kobject *kobj, struct kobj_type *ktype)
  269 {
  270         char *err_str;
  271 
  272         if (!kobj) {
  273                 err_str = "invalid kobject pointer!";
  274                 goto error;
  275         }
  276         if (!ktype) {
  277                 err_str = "must have a ktype to be initialized properly!\n";
  278                 goto error;
  279         }
  280         if (kobj->state_initialized) {
  281                 /* do not error out as sometimes we can recover */
  282                 printk(KERN_ERR "kobject (%p): tried to init an initialized "
  283                        "object, something is seriously wrong.\n", kobj);
  284                 dump_stack();
  285         }
  286 
  287         kobject_init_internal(kobj);
  288         kobj->ktype = ktype;
  289         return;
  290 
  291 error:
  292         printk(KERN_ERR "kobject (%p): %s\n", kobj, err_str);
  293         dump_stack();
  294 }
  295 EXPORT_SYMBOL(kobject_init);
  296 
  297 static int kobject_add_varg(struct kobject *kobj, struct kobject *parent,
  298                             const char *fmt, va_list vargs)
  299 {
  300         int retval;
  301 
  302         retval = kobject_set_name_vargs(kobj, fmt, vargs);
  303         if (retval) {
  304                 printk(KERN_ERR "kobject: can not set name properly!\n");
  305                 return retval;
  306         }
  307         kobj->parent = parent;
  308         return kobject_add_internal(kobj);
  309 }
  310 
  311 /**
  312  * kobject_add - the main kobject add function
  313  * @kobj: the kobject to add
  314  * @parent: pointer to the parent of the kobject.
  315  * @fmt: format to name the kobject with.
  316  *
  317  * The kobject name is set and added to the kobject hierarchy in this
  318  * function.
  319  *
  320  * If @parent is set, then the parent of the @kobj will be set to it.
  321  * If @parent is NULL, then the parent of the @kobj will be set to the
  322  * kobject associted with the kset assigned to this kobject.  If no kset
  323  * is assigned to the kobject, then the kobject will be located in the
  324  * root of the sysfs tree.
  325  *
  326  * If this function returns an error, kobject_put() must be called to
  327  * properly clean up the memory associated with the object.
  328  * Under no instance should the kobject that is passed to this function
  329  * be directly freed with a call to kfree(), that can leak memory.
  330  *
  331  * Note, no "add" uevent will be created with this call, the caller should set
  332  * up all of the necessary sysfs files for the object and then call
  333  * kobject_uevent() with the UEVENT_ADD parameter to ensure that
  334  * userspace is properly notified of this kobject's creation.
  335  */
  336 int kobject_add(struct kobject *kobj, struct kobject *parent,
  337                 const char *fmt, ...)
  338 {
  339         va_list args;
  340         int retval;
  341 
  342         if (!kobj)
  343                 return -EINVAL;
  344 
  345         if (!kobj->state_initialized) {
  346                 printk(KERN_ERR "kobject '%s' (%p): tried to add an "
  347                        "uninitialized object, something is seriously wrong.\n",
  348                        kobject_name(kobj), kobj);
  349                 dump_stack();
  350                 return -EINVAL;
  351         }
  352         va_start(args, fmt);
  353         retval = kobject_add_varg(kobj, parent, fmt, args);
  354         va_end(args);
  355 
  356         return retval;
  357 }
  358 EXPORT_SYMBOL(kobject_add);
  359 
  360 /**
  361  * kobject_init_and_add - initialize a kobject structure and add it to the kobject hierarchy
  362  * @kobj: pointer to the kobject to initialize
  363  * @ktype: pointer to the ktype for this kobject.
  364  * @parent: pointer to the parent of this kobject.
  365  * @fmt: the name of the kobject.
  366  *
  367  * This function combines the call to kobject_init() and
  368  * kobject_add().  The same type of error handling after a call to
  369  * kobject_add() and kobject lifetime rules are the same here.
  370  */
  371 int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,
  372                          struct kobject *parent, const char *fmt, ...)
  373 {
  374         va_list args;
  375         int retval;
  376 
  377         kobject_init(kobj, ktype);
  378 
  379         va_start(args, fmt);
  380         retval = kobject_add_varg(kobj, parent, fmt, args);
  381         va_end(args);
  382 
  383         return retval;
  384 }
  385 EXPORT_SYMBOL_GPL(kobject_init_and_add);
  386 
  387 /**
  388  * kobject_rename - change the name of an object
  389  * @kobj: object in question.
  390  * @new_name: object's new name
  391  *
  392  * It is the responsibility of the caller to provide mutual
  393  * exclusion between two different calls of kobject_rename
  394  * on the same kobject and to ensure that new_name is valid and
  395  * won't conflict with other kobjects.
  396  */
  397 int kobject_rename(struct kobject *kobj, const char *new_name)
  398 {
  399         int error = 0;
  400         const char *devpath = NULL;
  401         const char *dup_name = NULL, *name;
  402         char *devpath_string = NULL;
  403         char *envp[2];
  404 
  405         kobj = kobject_get(kobj);
  406         if (!kobj)
  407                 return -EINVAL;
  408         if (!kobj->parent)
  409                 return -EINVAL;
  410 
  411         devpath = kobject_get_path(kobj, GFP_KERNEL);
  412         if (!devpath) {
  413                 error = -ENOMEM;
  414                 goto out;
  415         }
  416         devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL);
  417         if (!devpath_string) {
  418                 error = -ENOMEM;
  419                 goto out;
  420         }
  421         sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
  422         envp[0] = devpath_string;
  423         envp[1] = NULL;
  424 
  425         name = dup_name = kstrdup(new_name, GFP_KERNEL);
  426         if (!name) {
  427                 error = -ENOMEM;
  428                 goto out;
  429         }
  430 
  431         error = sysfs_rename_dir(kobj, new_name);
  432         if (error)
  433                 goto out;
  434 
  435         /* Install the new kobject name */
  436         dup_name = kobj->name;
  437         kobj->name = name;
  438 
  439         /* This function is mostly/only used for network interface.
  440          * Some hotplug package track interfaces by their name and
  441          * therefore want to know when the name is changed by the user. */
  442         kobject_uevent_env(kobj, KOBJ_MOVE, envp);
  443 
  444 out:
  445         kfree(dup_name);
  446         kfree(devpath_string);
  447         kfree(devpath);
  448         kobject_put(kobj);
  449 
  450         return error;
  451 }
  452 EXPORT_SYMBOL_GPL(kobject_rename);
  453 
  454 /**
  455  * kobject_move - move object to another parent
  456  * @kobj: object in question.
  457  * @new_parent: object's new parent (can be NULL)
  458  */
  459 int kobject_move(struct kobject *kobj, struct kobject *new_parent)
  460 {
  461         int error;
  462         struct kobject *old_parent;
  463         const char *devpath = NULL;
  464         char *devpath_string = NULL;
  465         char *envp[2];
  466 
  467         kobj = kobject_get(kobj);
  468         if (!kobj)
  469                 return -EINVAL;
  470         new_parent = kobject_get(new_parent);
  471         if (!new_parent) {
  472                 if (kobj->kset)
  473                         new_parent = kobject_get(&kobj->kset->kobj);
  474         }
  475         /* old object path */
  476         devpath = kobject_get_path(kobj, GFP_KERNEL);
  477         if (!devpath) {
  478                 error = -ENOMEM;
  479                 goto out;
  480         }
  481         devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL);
  482         if (!devpath_string) {
  483                 error = -ENOMEM;
  484                 goto out;
  485         }
  486         sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
  487         envp[0] = devpath_string;
  488         envp[1] = NULL;
  489         error = sysfs_move_dir(kobj, new_parent);
  490         if (error)
  491                 goto out;
  492         old_parent = kobj->parent;
  493         kobj->parent = new_parent;
  494         new_parent = NULL;
  495         kobject_put(old_parent);
  496         kobject_uevent_env(kobj, KOBJ_MOVE, envp);
  497 out:
  498         kobject_put(new_parent);
  499         kobject_put(kobj);
  500         kfree(devpath_string);
  501         kfree(devpath);
  502         return error;
  503 }
  504 
  505 /**
  506  * kobject_del - unlink kobject from hierarchy.
  507  * @kobj: object.
  508  */
  509 void kobject_del(struct kobject *kobj)
  510 {
  511         if (!kobj)
  512                 return;
  513 
  514         sysfs_remove_dir(kobj);
  515         kobj->state_in_sysfs = 0;
  516         kobj_kset_leave(kobj);
  517         kobject_put(kobj->parent);
  518         kobj->parent = NULL;
  519 }
  520 
  521 /**
  522  * kobject_get - increment refcount for object.
  523  * @kobj: object.
  524  */
  525 struct kobject *kobject_get(struct kobject *kobj)
  526 {
  527         if (kobj)
  528                 kref_get(&kobj->kref);
  529         return kobj;
  530 }
  531 
  532 /*
  533  * kobject_cleanup - free kobject resources.
  534  * @kobj: object to cleanup
  535  */
  536 static void kobject_cleanup(struct kobject *kobj)
  537 {
  538         struct kobj_type *t = get_ktype(kobj);
  539         const char *name = kobj->name;
  540 
  541         pr_debug("kobject: '%s' (%p): %s\n",
  542                  kobject_name(kobj), kobj, __func__);
  543 
  544         if (t && !t->release)
  545                 pr_debug("kobject: '%s' (%p): does not have a release() "
  546                          "function, it is broken and must be fixed.\n",
  547                          kobject_name(kobj), kobj);
  548 
  549         /* send "remove" if the caller did not do it but sent "add" */
  550         if (kobj->state_add_uevent_sent && !kobj->state_remove_uevent_sent) {
  551                 pr_debug("kobject: '%s' (%p): auto cleanup 'remove' event\n",
  552                          kobject_name(kobj), kobj);
  553                 kobject_uevent(kobj, KOBJ_REMOVE);
  554         }
  555 
  556         /* remove from sysfs if the caller did not do it */
  557         if (kobj->state_in_sysfs) {
  558                 pr_debug("kobject: '%s' (%p): auto cleanup kobject_del\n",
  559                          kobject_name(kobj), kobj);
  560                 kobject_del(kobj);
  561         }
  562 
  563         if (t && t->release) {
  564                 pr_debug("kobject: '%s' (%p): calling ktype release\n",
  565                          kobject_name(kobj), kobj);
  566                 t->release(kobj);
  567         }
  568 
  569         /* free name if we allocated it */
  570         if (name) {
  571                 pr_debug("kobject: '%s': free name\n", name);
  572                 kfree(name);
  573         }
  574 }
  575 
  576 static void kobject_release(struct kref *kref)
  577 {
  578         kobject_cleanup(container_of(kref, struct kobject, kref));
  579 }
  580 
  581 /**
  582  * kobject_put - decrement refcount for object.
  583  * @kobj: object.
  584  *
  585  * Decrement the refcount, and if 0, call kobject_cleanup().
  586  */
  587 void kobject_put(struct kobject *kobj)
  588 {
  589         if (kobj) {
  590                 if (!kobj->state_initialized)
  591                         WARN(1, KERN_WARNING "kobject: '%s' (%p): is not "
  592                                "initialized, yet kobject_put() is being "
  593                                "called.\n", kobject_name(kobj), kobj);
  594                 kref_put(&kobj->kref, kobject_release);
  595         }
  596 }
  597 
  598 static void dynamic_kobj_release(struct kobject *kobj)
  599 {
  600         pr_debug("kobject: (%p): %s\n", kobj, __func__);
  601         kfree(kobj);
  602 }
  603 
  604 static struct kobj_type dynamic_kobj_ktype = {
  605         .release        = dynamic_kobj_release,
  606         .sysfs_ops      = &kobj_sysfs_ops,
  607 };
  608 
  609 /**
  610  * kobject_create - create a struct kobject dynamically
  611  *
  612  * This function creates a kobject structure dynamically and sets it up
  613  * to be a "dynamic" kobject with a default release function set up.
  614  *
  615  * If the kobject was not able to be created, NULL will be returned.
  616  * The kobject structure returned from here must be cleaned up with a
  617  * call to kobject_put() and not kfree(), as kobject_init() has
  618  * already been called on this structure.
  619  */
  620 struct kobject *kobject_create(void)
  621 {
  622         struct kobject *kobj;
  623 
  624         kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
  625         if (!kobj)
  626                 return NULL;
  627 
  628         kobject_init(kobj, &dynamic_kobj_ktype);
  629         return kobj;
  630 }
  631 
  632 /**
  633  * kobject_create_and_add - create a struct kobject dynamically and register it with sysfs
  634  *
  635  * @name: the name for the kobject
  636  * @parent: the parent kobject of this kobject, if any.
  637  *
  638  * This function creates a kobject structure dynamically and registers it
  639  * with sysfs.  When you are finished with this structure, call
  640  * kobject_put() and the structure will be dynamically freed when
  641  * it is no longer being used.
  642  *
  643  * If the kobject was not able to be created, NULL will be returned.
  644  */
  645 struct kobject *kobject_create_and_add(const char *name, struct kobject *parent)
  646 {
  647         struct kobject *kobj;
  648         int retval;
  649 
  650         kobj = kobject_create();
  651         if (!kobj)
  652                 return NULL;
  653 
  654         retval = kobject_add(kobj, parent, "%s", name);
  655         if (retval) {
  656                 printk(KERN_WARNING "%s: kobject_add error: %d\n",
  657                        __func__, retval);
  658                 kobject_put(kobj);
  659                 kobj = NULL;
  660         }
  661         return kobj;
  662 }
  663 EXPORT_SYMBOL_GPL(kobject_create_and_add);
  664 
  665 /**
  666  * kset_init - initialize a kset for use
  667  * @k: kset
  668  */
  669 void kset_init(struct kset *k)
  670 {
  671         kobject_init_internal(&k->kobj);
  672         INIT_LIST_HEAD(&k->list);
  673         spin_lock_init(&k->list_lock);
  674 }
  675 
  676 /* default kobject attribute operations */
  677 static ssize_t kobj_attr_show(struct kobject *kobj, struct attribute *attr,
  678                               char *buf)
  679 {
  680         struct kobj_attribute *kattr;
  681         ssize_t ret = -EIO;
  682 
  683         kattr = container_of(attr, struct kobj_attribute, attr);
  684         if (kattr->show)
  685                 ret = kattr->show(kobj, kattr, buf);
  686         return ret;
  687 }
  688 
  689 static ssize_t kobj_attr_store(struct kobject *kobj, struct attribute *attr,
  690                                const char *buf, size_t count)
  691 {
  692         struct kobj_attribute *kattr;
  693         ssize_t ret = -EIO;
  694 
  695         kattr = container_of(attr, struct kobj_attribute, attr);
  696         if (kattr->store)
  697                 ret = kattr->store(kobj, kattr, buf, count);
  698         return ret;
  699 }
  700 
  701 const struct sysfs_ops kobj_sysfs_ops = {
  702         .show   = kobj_attr_show,
  703         .store  = kobj_attr_store,
  704 };
  705 
  706 /**
  707  * kset_register - initialize and add a kset.
  708  * @k: kset.
  709  */
  710 int kset_register(struct kset *k)
  711 {
  712         int err;
  713 
  714         if (!k)
  715                 return -EINVAL;
  716 
  717         kset_init(k);
  718         err = kobject_add_internal(&k->kobj);
  719         if (err)
  720                 return err;
  721         kobject_uevent(&k->kobj, KOBJ_ADD);
  722         return 0;
  723 }
  724 
  725 /**
  726  * kset_unregister - remove a kset.
  727  * @k: kset.
  728  */
  729 void kset_unregister(struct kset *k)
  730 {
  731         if (!k)
  732                 return;
  733         kobject_put(&k->kobj);
  734 }
  735 
  736 /**
  737  * kset_find_obj - search for object in kset.
  738  * @kset: kset we're looking in.
  739  * @name: object's name.
  740  *
  741  * Lock kset via @kset->subsys, and iterate over @kset->list,
  742  * looking for a matching kobject. If matching object is found
  743  * take a reference and return the object.
  744  */
  745 struct kobject *kset_find_obj(struct kset *kset, const char *name)
  746 {
  747         struct kobject *k;
  748         struct kobject *ret = NULL;
  749 
  750         spin_lock(&kset->list_lock);
  751 
  752         list_for_each_entry(k, &kset->list, entry) {
  753                 if (kobject_name(k) && !strcmp(kobject_name(k), name)) {
  754                         ret = kobject_get(k);
  755                         break;
  756                 }
  757         }
  758 
  759         spin_unlock(&kset->list_lock);
  760         return ret;
  761 }
  762 
  763 static void kset_release(struct kobject *kobj)
  764 {
  765         struct kset *kset = container_of(kobj, struct kset, kobj);
  766         pr_debug("kobject: '%s' (%p): %s\n",
  767                  kobject_name(kobj), kobj, __func__);
  768         kfree(kset);
  769 }
  770 
  771 static struct kobj_type kset_ktype = {
  772         .sysfs_ops      = &kobj_sysfs_ops,
  773         .release = kset_release,
  774 };
  775 
  776 /**
  777  * kset_create - create a struct kset dynamically
  778  *
  779  * @name: the name for the kset
  780  * @uevent_ops: a struct kset_uevent_ops for the kset
  781  * @parent_kobj: the parent kobject of this kset, if any.
  782  *
  783  * This function creates a kset structure dynamically.  This structure can
  784  * then be registered with the system and show up in sysfs with a call to
  785  * kset_register().  When you are finished with this structure, if
  786  * kset_register() has been called, call kset_unregister() and the
  787  * structure will be dynamically freed when it is no longer being used.
  788  *
  789  * If the kset was not able to be created, NULL will be returned.
  790  */
  791 static struct kset *kset_create(const char *name,
  792                                 const struct kset_uevent_ops *uevent_ops,
  793                                 struct kobject *parent_kobj)
  794 {
  795         struct kset *kset;
  796         int retval;
  797 
  798         kset = kzalloc(sizeof(*kset), GFP_KERNEL);
  799         if (!kset)
  800                 return NULL;
  801         retval = kobject_set_name(&kset->kobj, name);
  802         if (retval) {
  803                 kfree(kset);
  804                 return NULL;
  805         }
  806         kset->uevent_ops = uevent_ops;
  807         kset->kobj.parent = parent_kobj;
  808 
  809         /*
  810          * The kobject of this kset will have a type of kset_ktype and belong to
  811          * no kset itself.  That way we can properly free it when it is
  812          * finished being used.
  813          */
  814         kset->kobj.ktype = &kset_ktype;
  815         kset->kobj.kset = NULL;
  816 
  817         return kset;
  818 }
  819 
  820 /**
  821  * kset_create_and_add - create a struct kset dynamically and add it to sysfs
  822  *
  823  * @name: the name for the kset
  824  * @uevent_ops: a struct kset_uevent_ops for the kset
  825  * @parent_kobj: the parent kobject of this kset, if any.
  826  *
  827  * This function creates a kset structure dynamically and registers it
  828  * with sysfs.  When you are finished with this structure, call
  829  * kset_unregister() and the structure will be dynamically freed when it
  830  * is no longer being used.
  831  *
  832  * If the kset was not able to be created, NULL will be returned.
  833  */
  834 struct kset *kset_create_and_add(const char *name,
  835                                  const struct kset_uevent_ops *uevent_ops,
  836                                  struct kobject *parent_kobj)
  837 {
  838         struct kset *kset;
  839         int error;
  840 
  841         kset = kset_create(name, uevent_ops, parent_kobj);
  842         if (!kset)
  843                 return NULL;
  844         error = kset_register(kset);
  845         if (error) {
  846                 kfree(kset);
  847                 return NULL;
  848         }
  849         return kset;
  850 }
  851 EXPORT_SYMBOL_GPL(kset_create_and_add);
  852 
  853 
  854 static DEFINE_SPINLOCK(kobj_ns_type_lock);
  855 static const struct kobj_ns_type_operations *kobj_ns_ops_tbl[KOBJ_NS_TYPES];
  856 
  857 int kobj_ns_type_register(const struct kobj_ns_type_operations *ops)
  858 {
  859         enum kobj_ns_type type = ops->type;
  860         int error;
  861 
  862         spin_lock(&kobj_ns_type_lock);
  863 
  864         error = -EINVAL;
  865         if (type >= KOBJ_NS_TYPES)
  866                 goto out;
  867 
  868         error = -EINVAL;
  869         if (type <= KOBJ_NS_TYPE_NONE)
  870                 goto out;
  871 
  872         error = -EBUSY;
  873         if (kobj_ns_ops_tbl[type])
  874                 goto out;
  875 
  876         error = 0;
  877         kobj_ns_ops_tbl[type] = ops;
  878 
  879 out:
  880         spin_unlock(&kobj_ns_type_lock);
  881         return error;
  882 }
  883 
  884 int kobj_ns_type_registered(enum kobj_ns_type type)
  885 {
  886         int registered = 0;
  887 
  888         spin_lock(&kobj_ns_type_lock);
  889         if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES))
  890                 registered = kobj_ns_ops_tbl[type] != NULL;
  891         spin_unlock(&kobj_ns_type_lock);
  892 
  893         return registered;
  894 }
  895 
  896 const struct kobj_ns_type_operations *kobj_child_ns_ops(struct kobject *parent)
  897 {
  898         const struct kobj_ns_type_operations *ops = NULL;
  899 
  900         if (parent && parent->ktype->child_ns_type)
  901                 ops = parent->ktype->child_ns_type(parent);
  902 
  903         return ops;
  904 }
  905 
  906 const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj)
  907 {
  908         return kobj_child_ns_ops(kobj->parent);
  909 }
  910 
  911 
  912 void *kobj_ns_grab_current(enum kobj_ns_type type)
  913 {
  914         void *ns = NULL;
  915 
  916         spin_lock(&kobj_ns_type_lock);
  917         if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
  918             kobj_ns_ops_tbl[type])
  919                 ns = kobj_ns_ops_tbl[type]->grab_current_ns();
  920         spin_unlock(&kobj_ns_type_lock);
  921 
  922         return ns;
  923 }
  924 
  925 const void *kobj_ns_netlink(enum kobj_ns_type type, struct sock *sk)
  926 {
  927         const void *ns = NULL;
  928 
  929         spin_lock(&kobj_ns_type_lock);
  930         if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
  931             kobj_ns_ops_tbl[type])
  932                 ns = kobj_ns_ops_tbl[type]->netlink_ns(sk);
  933         spin_unlock(&kobj_ns_type_lock);
  934 
  935         return ns;
  936 }
  937 
  938 const void *kobj_ns_initial(enum kobj_ns_type type)
  939 {
  940         const void *ns = NULL;
  941 
  942         spin_lock(&kobj_ns_type_lock);
  943         if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
  944             kobj_ns_ops_tbl[type])
  945                 ns = kobj_ns_ops_tbl[type]->initial_ns();
  946         spin_unlock(&kobj_ns_type_lock);
  947 
  948         return ns;
  949 }
  950 
  951 void kobj_ns_drop(enum kobj_ns_type type, void *ns)
  952 {
  953         spin_lock(&kobj_ns_type_lock);
  954         if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
  955             kobj_ns_ops_tbl[type] && kobj_ns_ops_tbl[type]->drop_ns)
  956                 kobj_ns_ops_tbl[type]->drop_ns(ns);
  957         spin_unlock(&kobj_ns_type_lock);
  958 }
  959 
  960 EXPORT_SYMBOL(kobject_get);
  961 EXPORT_SYMBOL(kobject_put);
  962 EXPORT_SYMBOL(kobject_del);
  963 
  964 EXPORT_SYMBOL(kset_register);
  965 EXPORT_SYMBOL(kset_unregister);

Cache object: 655174a97c2a51471d9c4b4314c9d8f2


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.