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