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