at v2.6.26 21 kB view raw
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/module.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 */ 30static 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 47static 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 61static 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 79static 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 */ 104char *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} 119EXPORT_SYMBOL_GPL(kobject_get_path); 120 121/* add the kobject to its kset's list */ 122static 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 */ 134static 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 145static 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 158static 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 pr_debug("kobject: (%p): attempted to be registered with empty " 168 "name!\n", kobj); 169 WARN_ON(1); 170 return -EINVAL; 171 } 172 173 parent = kobject_get(kobj->parent); 174 175 /* join kset if set, use it as parent if we do not already have one */ 176 if (kobj->kset) { 177 if (!parent) 178 parent = kobject_get(&kobj->kset->kobj); 179 kobj_kset_join(kobj); 180 kobj->parent = parent; 181 } 182 183 pr_debug("kobject: '%s' (%p): %s: parent: '%s', set: '%s'\n", 184 kobject_name(kobj), kobj, __func__, 185 parent ? kobject_name(parent) : "<NULL>", 186 kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>"); 187 188 error = create_dir(kobj); 189 if (error) { 190 kobj_kset_leave(kobj); 191 kobject_put(parent); 192 kobj->parent = NULL; 193 194 /* be noisy on error issues */ 195 if (error == -EEXIST) 196 printk(KERN_ERR "%s failed for %s with " 197 "-EEXIST, don't try to register things with " 198 "the same name in the same directory.\n", 199 __func__, kobject_name(kobj)); 200 else 201 printk(KERN_ERR "%s failed for %s (%d)\n", 202 __func__, kobject_name(kobj), error); 203 dump_stack(); 204 } else 205 kobj->state_in_sysfs = 1; 206 207 return error; 208} 209 210/** 211 * kobject_set_name_vargs - Set the name of an kobject 212 * @kobj: struct kobject to set the name of 213 * @fmt: format string used to build the name 214 * @vargs: vargs to format the string. 215 */ 216static int kobject_set_name_vargs(struct kobject *kobj, const char *fmt, 217 va_list vargs) 218{ 219 /* Free the old name, if necessary. */ 220 kfree(kobj->name); 221 222 kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs); 223 if (!kobj->name) 224 return -ENOMEM; 225 226 return 0; 227} 228 229/** 230 * kobject_set_name - Set the name of a kobject 231 * @kobj: struct kobject to set the name of 232 * @fmt: format string used to build the name 233 * 234 * This sets the name of the kobject. If you have already added the 235 * kobject to the system, you must call kobject_rename() in order to 236 * change the name of the kobject. 237 */ 238int kobject_set_name(struct kobject *kobj, const char *fmt, ...) 239{ 240 va_list vargs; 241 int retval; 242 243 va_start(vargs, fmt); 244 retval = kobject_set_name_vargs(kobj, fmt, vargs); 245 va_end(vargs); 246 247 return retval; 248} 249EXPORT_SYMBOL(kobject_set_name); 250 251/** 252 * kobject_init - initialize a kobject structure 253 * @kobj: pointer to the kobject to initialize 254 * @ktype: pointer to the ktype for this kobject. 255 * 256 * This function will properly initialize a kobject such that it can then 257 * be passed to the kobject_add() call. 258 * 259 * After this function is called, the kobject MUST be cleaned up by a call 260 * to kobject_put(), not by a call to kfree directly to ensure that all of 261 * the memory is cleaned up properly. 262 */ 263void kobject_init(struct kobject *kobj, struct kobj_type *ktype) 264{ 265 char *err_str; 266 267 if (!kobj) { 268 err_str = "invalid kobject pointer!"; 269 goto error; 270 } 271 if (!ktype) { 272 err_str = "must have a ktype to be initialized properly!\n"; 273 goto error; 274 } 275 if (kobj->state_initialized) { 276 /* do not error out as sometimes we can recover */ 277 printk(KERN_ERR "kobject (%p): tried to init an initialized " 278 "object, something is seriously wrong.\n", kobj); 279 dump_stack(); 280 } 281 282 kobject_init_internal(kobj); 283 kobj->ktype = ktype; 284 return; 285 286error: 287 printk(KERN_ERR "kobject (%p): %s\n", kobj, err_str); 288 dump_stack(); 289} 290EXPORT_SYMBOL(kobject_init); 291 292static int kobject_add_varg(struct kobject *kobj, struct kobject *parent, 293 const char *fmt, va_list vargs) 294{ 295 int retval; 296 297 retval = kobject_set_name_vargs(kobj, fmt, vargs); 298 if (retval) { 299 printk(KERN_ERR "kobject: can not set name properly!\n"); 300 return retval; 301 } 302 kobj->parent = parent; 303 return kobject_add_internal(kobj); 304} 305 306/** 307 * kobject_add - the main kobject add function 308 * @kobj: the kobject to add 309 * @parent: pointer to the parent of the kobject. 310 * @fmt: format to name the kobject with. 311 * 312 * The kobject name is set and added to the kobject hierarchy in this 313 * function. 314 * 315 * If @parent is set, then the parent of the @kobj will be set to it. 316 * If @parent is NULL, then the parent of the @kobj will be set to the 317 * kobject associted with the kset assigned to this kobject. If no kset 318 * is assigned to the kobject, then the kobject will be located in the 319 * root of the sysfs tree. 320 * 321 * If this function returns an error, kobject_put() must be called to 322 * properly clean up the memory associated with the object. 323 * Under no instance should the kobject that is passed to this function 324 * be directly freed with a call to kfree(), that can leak memory. 325 * 326 * Note, no "add" uevent will be created with this call, the caller should set 327 * up all of the necessary sysfs files for the object and then call 328 * kobject_uevent() with the UEVENT_ADD parameter to ensure that 329 * userspace is properly notified of this kobject's creation. 330 */ 331int kobject_add(struct kobject *kobj, struct kobject *parent, 332 const char *fmt, ...) 333{ 334 va_list args; 335 int retval; 336 337 if (!kobj) 338 return -EINVAL; 339 340 if (!kobj->state_initialized) { 341 printk(KERN_ERR "kobject '%s' (%p): tried to add an " 342 "uninitialized object, something is seriously wrong.\n", 343 kobject_name(kobj), kobj); 344 dump_stack(); 345 return -EINVAL; 346 } 347 va_start(args, fmt); 348 retval = kobject_add_varg(kobj, parent, fmt, args); 349 va_end(args); 350 351 return retval; 352} 353EXPORT_SYMBOL(kobject_add); 354 355/** 356 * kobject_init_and_add - initialize a kobject structure and add it to the kobject hierarchy 357 * @kobj: pointer to the kobject to initialize 358 * @ktype: pointer to the ktype for this kobject. 359 * @parent: pointer to the parent of this kobject. 360 * @fmt: the name of the kobject. 361 * 362 * This function combines the call to kobject_init() and 363 * kobject_add(). The same type of error handling after a call to 364 * kobject_add() and kobject lifetime rules are the same here. 365 */ 366int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype, 367 struct kobject *parent, const char *fmt, ...) 368{ 369 va_list args; 370 int retval; 371 372 kobject_init(kobj, ktype); 373 374 va_start(args, fmt); 375 retval = kobject_add_varg(kobj, parent, fmt, args); 376 va_end(args); 377 378 return retval; 379} 380EXPORT_SYMBOL_GPL(kobject_init_and_add); 381 382/** 383 * kobject_rename - change the name of an object 384 * @kobj: object in question. 385 * @new_name: object's new name 386 */ 387int kobject_rename(struct kobject *kobj, const char *new_name) 388{ 389 int error = 0; 390 const char *devpath = NULL; 391 char *devpath_string = NULL; 392 char *envp[2]; 393 394 kobj = kobject_get(kobj); 395 if (!kobj) 396 return -EINVAL; 397 if (!kobj->parent) 398 return -EINVAL; 399 400 /* see if this name is already in use */ 401 if (kobj->kset) { 402 struct kobject *temp_kobj; 403 temp_kobj = kset_find_obj(kobj->kset, new_name); 404 if (temp_kobj) { 405 printk(KERN_WARNING "kobject '%s' cannot be renamed " 406 "to '%s' as '%s' is already in existence.\n", 407 kobject_name(kobj), new_name, new_name); 408 kobject_put(temp_kobj); 409 return -EINVAL; 410 } 411 } 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 error = sysfs_rename_dir(kobj, new_name); 428 429 /* This function is mostly/only used for network interface. 430 * Some hotplug package track interfaces by their name and 431 * therefore want to know when the name is changed by the user. */ 432 if (!error) 433 kobject_uevent_env(kobj, KOBJ_MOVE, envp); 434 435out: 436 kfree(devpath_string); 437 kfree(devpath); 438 kobject_put(kobj); 439 440 return error; 441} 442 443/** 444 * kobject_move - move object to another parent 445 * @kobj: object in question. 446 * @new_parent: object's new parent (can be NULL) 447 */ 448int kobject_move(struct kobject *kobj, struct kobject *new_parent) 449{ 450 int error; 451 struct kobject *old_parent; 452 const char *devpath = NULL; 453 char *devpath_string = NULL; 454 char *envp[2]; 455 456 kobj = kobject_get(kobj); 457 if (!kobj) 458 return -EINVAL; 459 new_parent = kobject_get(new_parent); 460 if (!new_parent) { 461 if (kobj->kset) 462 new_parent = kobject_get(&kobj->kset->kobj); 463 } 464 /* old object path */ 465 devpath = kobject_get_path(kobj, GFP_KERNEL); 466 if (!devpath) { 467 error = -ENOMEM; 468 goto out; 469 } 470 devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL); 471 if (!devpath_string) { 472 error = -ENOMEM; 473 goto out; 474 } 475 sprintf(devpath_string, "DEVPATH_OLD=%s", devpath); 476 envp[0] = devpath_string; 477 envp[1] = NULL; 478 error = sysfs_move_dir(kobj, new_parent); 479 if (error) 480 goto out; 481 old_parent = kobj->parent; 482 kobj->parent = new_parent; 483 new_parent = NULL; 484 kobject_put(old_parent); 485 kobject_uevent_env(kobj, KOBJ_MOVE, envp); 486out: 487 kobject_put(new_parent); 488 kobject_put(kobj); 489 kfree(devpath_string); 490 kfree(devpath); 491 return error; 492} 493 494/** 495 * kobject_del - unlink kobject from hierarchy. 496 * @kobj: object. 497 */ 498void kobject_del(struct kobject *kobj) 499{ 500 if (!kobj) 501 return; 502 503 sysfs_remove_dir(kobj); 504 kobj->state_in_sysfs = 0; 505 kobj_kset_leave(kobj); 506 kobject_put(kobj->parent); 507 kobj->parent = NULL; 508} 509 510/** 511 * kobject_get - increment refcount for object. 512 * @kobj: object. 513 */ 514struct kobject *kobject_get(struct kobject *kobj) 515{ 516 if (kobj) 517 kref_get(&kobj->kref); 518 return kobj; 519} 520 521/* 522 * kobject_cleanup - free kobject resources. 523 * @kobj: object to cleanup 524 */ 525static void kobject_cleanup(struct kobject *kobj) 526{ 527 struct kobj_type *t = get_ktype(kobj); 528 const char *name = kobj->name; 529 530 pr_debug("kobject: '%s' (%p): %s\n", 531 kobject_name(kobj), kobj, __func__); 532 533 if (t && !t->release) 534 pr_debug("kobject: '%s' (%p): does not have a release() " 535 "function, it is broken and must be fixed.\n", 536 kobject_name(kobj), kobj); 537 538 /* send "remove" if the caller did not do it but sent "add" */ 539 if (kobj->state_add_uevent_sent && !kobj->state_remove_uevent_sent) { 540 pr_debug("kobject: '%s' (%p): auto cleanup 'remove' event\n", 541 kobject_name(kobj), kobj); 542 kobject_uevent(kobj, KOBJ_REMOVE); 543 } 544 545 /* remove from sysfs if the caller did not do it */ 546 if (kobj->state_in_sysfs) { 547 pr_debug("kobject: '%s' (%p): auto cleanup kobject_del\n", 548 kobject_name(kobj), kobj); 549 kobject_del(kobj); 550 } 551 552 if (t && t->release) { 553 pr_debug("kobject: '%s' (%p): calling ktype release\n", 554 kobject_name(kobj), kobj); 555 t->release(kobj); 556 } 557 558 /* free name if we allocated it */ 559 if (name) { 560 pr_debug("kobject: '%s': free name\n", name); 561 kfree(name); 562 } 563} 564 565static void kobject_release(struct kref *kref) 566{ 567 kobject_cleanup(container_of(kref, struct kobject, kref)); 568} 569 570/** 571 * kobject_put - decrement refcount for object. 572 * @kobj: object. 573 * 574 * Decrement the refcount, and if 0, call kobject_cleanup(). 575 */ 576void kobject_put(struct kobject *kobj) 577{ 578 if (kobj) { 579 if (!kobj->state_initialized) { 580 printk(KERN_WARNING "kobject: '%s' (%p): is not " 581 "initialized, yet kobject_put() is being " 582 "called.\n", kobject_name(kobj), kobj); 583 WARN_ON(1); 584 } 585 kref_put(&kobj->kref, kobject_release); 586 } 587} 588 589static void dynamic_kobj_release(struct kobject *kobj) 590{ 591 pr_debug("kobject: (%p): %s\n", kobj, __func__); 592 kfree(kobj); 593} 594 595static struct kobj_type dynamic_kobj_ktype = { 596 .release = dynamic_kobj_release, 597 .sysfs_ops = &kobj_sysfs_ops, 598}; 599 600/** 601 * kobject_create - create a struct kobject dynamically 602 * 603 * This function creates a kobject structure dynamically and sets it up 604 * to be a "dynamic" kobject with a default release function set up. 605 * 606 * If the kobject was not able to be created, NULL will be returned. 607 * The kobject structure returned from here must be cleaned up with a 608 * call to kobject_put() and not kfree(), as kobject_init() has 609 * already been called on this structure. 610 */ 611struct kobject *kobject_create(void) 612{ 613 struct kobject *kobj; 614 615 kobj = kzalloc(sizeof(*kobj), GFP_KERNEL); 616 if (!kobj) 617 return NULL; 618 619 kobject_init(kobj, &dynamic_kobj_ktype); 620 return kobj; 621} 622 623/** 624 * kobject_create_and_add - create a struct kobject dynamically and register it with sysfs 625 * 626 * @name: the name for the kset 627 * @parent: the parent kobject of this kobject, if any. 628 * 629 * This function creates a kobject structure dynamically and registers it 630 * with sysfs. When you are finished with this structure, call 631 * kobject_put() and the structure will be dynamically freed when 632 * it is no longer being used. 633 * 634 * If the kobject was not able to be created, NULL will be returned. 635 */ 636struct kobject *kobject_create_and_add(const char *name, struct kobject *parent) 637{ 638 struct kobject *kobj; 639 int retval; 640 641 kobj = kobject_create(); 642 if (!kobj) 643 return NULL; 644 645 retval = kobject_add(kobj, parent, "%s", name); 646 if (retval) { 647 printk(KERN_WARNING "%s: kobject_add error: %d\n", 648 __func__, retval); 649 kobject_put(kobj); 650 kobj = NULL; 651 } 652 return kobj; 653} 654EXPORT_SYMBOL_GPL(kobject_create_and_add); 655 656/** 657 * kset_init - initialize a kset for use 658 * @k: kset 659 */ 660void kset_init(struct kset *k) 661{ 662 kobject_init_internal(&k->kobj); 663 INIT_LIST_HEAD(&k->list); 664 spin_lock_init(&k->list_lock); 665} 666 667/* default kobject attribute operations */ 668static ssize_t kobj_attr_show(struct kobject *kobj, struct attribute *attr, 669 char *buf) 670{ 671 struct kobj_attribute *kattr; 672 ssize_t ret = -EIO; 673 674 kattr = container_of(attr, struct kobj_attribute, attr); 675 if (kattr->show) 676 ret = kattr->show(kobj, kattr, buf); 677 return ret; 678} 679 680static ssize_t kobj_attr_store(struct kobject *kobj, struct attribute *attr, 681 const char *buf, size_t count) 682{ 683 struct kobj_attribute *kattr; 684 ssize_t ret = -EIO; 685 686 kattr = container_of(attr, struct kobj_attribute, attr); 687 if (kattr->store) 688 ret = kattr->store(kobj, kattr, buf, count); 689 return ret; 690} 691 692struct sysfs_ops kobj_sysfs_ops = { 693 .show = kobj_attr_show, 694 .store = kobj_attr_store, 695}; 696 697/** 698 * kset_register - initialize and add a kset. 699 * @k: kset. 700 */ 701int kset_register(struct kset *k) 702{ 703 int err; 704 705 if (!k) 706 return -EINVAL; 707 708 kset_init(k); 709 err = kobject_add_internal(&k->kobj); 710 if (err) 711 return err; 712 kobject_uevent(&k->kobj, KOBJ_ADD); 713 return 0; 714} 715 716/** 717 * kset_unregister - remove a kset. 718 * @k: kset. 719 */ 720void kset_unregister(struct kset *k) 721{ 722 if (!k) 723 return; 724 kobject_put(&k->kobj); 725} 726 727/** 728 * kset_find_obj - search for object in kset. 729 * @kset: kset we're looking in. 730 * @name: object's name. 731 * 732 * Lock kset via @kset->subsys, and iterate over @kset->list, 733 * looking for a matching kobject. If matching object is found 734 * take a reference and return the object. 735 */ 736struct kobject *kset_find_obj(struct kset *kset, const char *name) 737{ 738 struct kobject *k; 739 struct kobject *ret = NULL; 740 741 spin_lock(&kset->list_lock); 742 list_for_each_entry(k, &kset->list, entry) { 743 if (kobject_name(k) && !strcmp(kobject_name(k), name)) { 744 ret = kobject_get(k); 745 break; 746 } 747 } 748 spin_unlock(&kset->list_lock); 749 return ret; 750} 751 752static void kset_release(struct kobject *kobj) 753{ 754 struct kset *kset = container_of(kobj, struct kset, kobj); 755 pr_debug("kobject: '%s' (%p): %s\n", 756 kobject_name(kobj), kobj, __func__); 757 kfree(kset); 758} 759 760static struct kobj_type kset_ktype = { 761 .sysfs_ops = &kobj_sysfs_ops, 762 .release = kset_release, 763}; 764 765/** 766 * kset_create - create a struct kset dynamically 767 * 768 * @name: the name for the kset 769 * @uevent_ops: a struct kset_uevent_ops for the kset 770 * @parent_kobj: the parent kobject of this kset, if any. 771 * 772 * This function creates a kset structure dynamically. This structure can 773 * then be registered with the system and show up in sysfs with a call to 774 * kset_register(). When you are finished with this structure, if 775 * kset_register() has been called, call kset_unregister() and the 776 * structure will be dynamically freed when it is no longer being used. 777 * 778 * If the kset was not able to be created, NULL will be returned. 779 */ 780static struct kset *kset_create(const char *name, 781 struct kset_uevent_ops *uevent_ops, 782 struct kobject *parent_kobj) 783{ 784 struct kset *kset; 785 786 kset = kzalloc(sizeof(*kset), GFP_KERNEL); 787 if (!kset) 788 return NULL; 789 kobject_set_name(&kset->kobj, name); 790 kset->uevent_ops = uevent_ops; 791 kset->kobj.parent = parent_kobj; 792 793 /* 794 * The kobject of this kset will have a type of kset_ktype and belong to 795 * no kset itself. That way we can properly free it when it is 796 * finished being used. 797 */ 798 kset->kobj.ktype = &kset_ktype; 799 kset->kobj.kset = NULL; 800 801 return kset; 802} 803 804/** 805 * kset_create_and_add - create a struct kset dynamically and add it to sysfs 806 * 807 * @name: the name for the kset 808 * @uevent_ops: a struct kset_uevent_ops for the kset 809 * @parent_kobj: the parent kobject of this kset, if any. 810 * 811 * This function creates a kset structure dynamically and registers it 812 * with sysfs. When you are finished with this structure, call 813 * kset_unregister() and the structure will be dynamically freed when it 814 * is no longer being used. 815 * 816 * If the kset was not able to be created, NULL will be returned. 817 */ 818struct kset *kset_create_and_add(const char *name, 819 struct kset_uevent_ops *uevent_ops, 820 struct kobject *parent_kobj) 821{ 822 struct kset *kset; 823 int error; 824 825 kset = kset_create(name, uevent_ops, parent_kobj); 826 if (!kset) 827 return NULL; 828 error = kset_register(kset); 829 if (error) { 830 kfree(kset); 831 return NULL; 832 } 833 return kset; 834} 835EXPORT_SYMBOL_GPL(kset_create_and_add); 836 837EXPORT_SYMBOL(kobject_get); 838EXPORT_SYMBOL(kobject_put); 839EXPORT_SYMBOL(kobject_del); 840 841EXPORT_SYMBOL(kset_register); 842EXPORT_SYMBOL(kset_unregister);