1 /* 2 * kobject.c - library routines for handling generic kernel objects 3 * 4 * Copyright (c) 2002-2003 Patrick Mochel <mochel@osdl.org> 5 * 6 * This file is released under the GPLv2. 7 * 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/module.h> 16 #include <linux/stat.h> 17 #include <linux/slab.h> 18 19 /** 20 * populate_dir - populate directory with attributes. 21 * @kobj: object we're working on. 22 * 23 * Most subsystems have a set of default attributes that 24 * are associated with an object that registers with them. 25 * This is a helper called during object registration that 26 * loops through the default attributes of the subsystem 27 * and creates attributes files for them in sysfs. 28 * 29 */ 30 31 static int populate_dir(struct kobject * kobj) 32 { 33 struct kobj_type * t = get_ktype(kobj); 34 struct attribute * attr; 35 int error = 0; 36 int i; 37 38 if (t && t->default_attrs) { 39 for (i = 0; (attr = t->default_attrs[i]) != NULL; i++) { 40 if ((error = sysfs_create_file(kobj,attr))) 41 break; 42 } 43 } 44 return error; 45 } 46 47 static int create_dir(struct kobject * kobj, struct dentry *shadow_parent) 48 { 49 int error = 0; 50 if (kobject_name(kobj)) { 51 error = sysfs_create_dir(kobj, shadow_parent); 52 if (!error) { 53 if ((error = populate_dir(kobj))) 54 sysfs_remove_dir(kobj); 55 } 56 } 57 return error; 58 } 59 60 static inline struct kobject * to_kobj(struct list_head * entry) 61 { 62 return container_of(entry,struct kobject,entry); 63 } 64 65 static int get_kobj_path_length(struct kobject *kobj) 66 { 67 int length = 1; 68 struct kobject * parent = kobj; 69 70 /* walk up the ancestors until we hit the one pointing to the 71 * root. 72 * Add 1 to strlen for leading '/' of each level. 73 */ 74 do { 75 if (kobject_name(parent) == NULL) 76 return 0; 77 length += strlen(kobject_name(parent)) + 1; 78 parent = parent->parent; 79 } while (parent); 80 return length; 81 } 82 83 static void fill_kobj_path(struct kobject *kobj, char *path, int length) 84 { 85 struct kobject * parent; 86 87 --length; 88 for (parent = kobj; parent; parent = parent->parent) { 89 int cur = strlen(kobject_name(parent)); 90 /* back up enough to print this name with '/' */ 91 length -= cur; 92 strncpy (path + length, kobject_name(parent), cur); 93 *(path + --length) = '/'; 94 } 95 96 pr_debug("%s: path = '%s'\n",__FUNCTION__,path); 97 } 98 99 /** 100 * kobject_get_path - generate and return the path associated with a given kobj and kset pair. 101 * 102 * @kobj: kobject in question, with which to build the path 103 * @gfp_mask: the allocation type used to allocate the path 104 * 105 * The result must be freed by the caller with kfree(). 106 */ 107 char *kobject_get_path(struct kobject *kobj, gfp_t gfp_mask) 108 { 109 char *path; 110 int len; 111 112 len = get_kobj_path_length(kobj); 113 if (len == 0) 114 return NULL; 115 path = kzalloc(len, gfp_mask); 116 if (!path) 117 return NULL; 118 fill_kobj_path(kobj, path, len); 119 120 return path; 121 } 122 EXPORT_SYMBOL_GPL(kobject_get_path); 123 124 /** 125 * kobject_init - initialize object. 126 * @kobj: object in question. 127 */ 128 void kobject_init(struct kobject * kobj) 129 { 130 if (!kobj) 131 return; 132 kref_init(&kobj->kref); 133 INIT_LIST_HEAD(&kobj->entry); 134 init_waitqueue_head(&kobj->poll); 135 kobj->kset = kset_get(kobj->kset); 136 } 137 138 139 /** 140 * unlink - remove kobject from kset list. 141 * @kobj: kobject. 142 * 143 * Remove the kobject from the kset list and decrement 144 * its parent's refcount. 145 * This is separated out, so we can use it in both 146 * kobject_del() and kobject_add() on error. 147 */ 148 149 static void unlink(struct kobject * kobj) 150 { 151 if (kobj->kset) { 152 spin_lock(&kobj->kset->list_lock); 153 list_del_init(&kobj->entry); 154 spin_unlock(&kobj->kset->list_lock); 155 } 156 kobject_put(kobj); 157 } 158 159 /** 160 * kobject_add - add an object to the hierarchy. 161 * @kobj: object. 162 * @shadow_parent: sysfs directory to add to. 163 */ 164 165 int kobject_shadow_add(struct kobject * kobj, struct dentry *shadow_parent) 166 { 167 int error = 0; 168 struct kobject * parent; 169 170 if (!(kobj = kobject_get(kobj))) 171 return -ENOENT; 172 if (!kobj->k_name) 173 kobj->k_name = kobj->name; 174 if (!*kobj->k_name) { 175 pr_debug("kobject attempted to be registered with no name!\n"); 176 WARN_ON(1); 177 return -EINVAL; 178 } 179 parent = kobject_get(kobj->parent); 180 181 pr_debug("kobject %s: registering. parent: %s, set: %s\n", 182 kobject_name(kobj), parent ? kobject_name(parent) : "<NULL>", 183 kobj->kset ? kobj->kset->kobj.name : "<NULL>" ); 184 185 if (kobj->kset) { 186 spin_lock(&kobj->kset->list_lock); 187 188 if (!parent) 189 parent = kobject_get(&kobj->kset->kobj); 190 191 list_add_tail(&kobj->entry,&kobj->kset->list); 192 spin_unlock(&kobj->kset->list_lock); 193 } 194 kobj->parent = parent; 195 196 error = create_dir(kobj, shadow_parent); 197 if (error) { 198 /* unlink does the kobject_put() for us */ 199 unlink(kobj); 200 kobject_put(parent); 201 202 /* be noisy on error issues */ 203 if (error == -EEXIST) 204 printk("kobject_add failed for %s with -EEXIST, " 205 "don't try to register things with the " 206 "same name in the same directory.\n", 207 kobject_name(kobj)); 208 else 209 printk("kobject_add failed for %s (%d)\n", 210 kobject_name(kobj), error); 211 dump_stack(); 212 } 213 214 return error; 215 } 216 217 /** 218 * kobject_add - add an object to the hierarchy. 219 * @kobj: object. 220 */ 221 int kobject_add(struct kobject * kobj) 222 { 223 return kobject_shadow_add(kobj, NULL); 224 } 225 226 227 /** 228 * kobject_register - initialize and add an object. 229 * @kobj: object in question. 230 */ 231 232 int kobject_register(struct kobject * kobj) 233 { 234 int error = -EINVAL; 235 if (kobj) { 236 kobject_init(kobj); 237 error = kobject_add(kobj); 238 if (!error) 239 kobject_uevent(kobj, KOBJ_ADD); 240 } 241 return error; 242 } 243 244 245 /** 246 * kobject_set_name - Set the name of an object 247 * @kobj: object. 248 * @fmt: format string used to build the name 249 * 250 * If strlen(name) >= KOBJ_NAME_LEN, then use a dynamically allocated 251 * string that @kobj->k_name points to. Otherwise, use the static 252 * @kobj->name array. 253 */ 254 int kobject_set_name(struct kobject * kobj, const char * fmt, ...) 255 { 256 int error = 0; 257 int limit = KOBJ_NAME_LEN; 258 int need; 259 va_list args; 260 char * name; 261 262 /* 263 * First, try the static array 264 */ 265 va_start(args,fmt); 266 need = vsnprintf(kobj->name,limit,fmt,args); 267 va_end(args); 268 if (need < limit) 269 name = kobj->name; 270 else { 271 /* 272 * Need more space? Allocate it and try again 273 */ 274 limit = need + 1; 275 name = kmalloc(limit,GFP_KERNEL); 276 if (!name) { 277 error = -ENOMEM; 278 goto Done; 279 } 280 va_start(args,fmt); 281 need = vsnprintf(name,limit,fmt,args); 282 va_end(args); 283 284 /* Still? Give up. */ 285 if (need >= limit) { 286 kfree(name); 287 error = -EFAULT; 288 goto Done; 289 } 290 } 291 292 /* Free the old name, if necessary. */ 293 if (kobj->k_name && kobj->k_name != kobj->name) 294 kfree(kobj->k_name); 295 296 /* Now, set the new name */ 297 kobj->k_name = name; 298 Done: 299 return error; 300 } 301 302 EXPORT_SYMBOL(kobject_set_name); 303 304 305 /** 306 * kobject_rename - change the name of an object 307 * @kobj: object in question. 308 * @new_name: object's new name 309 */ 310 311 int kobject_rename(struct kobject * kobj, const char *new_name) 312 { 313 int error = 0; 314 315 kobj = kobject_get(kobj); 316 if (!kobj) 317 return -EINVAL; 318 if (!kobj->parent) 319 return -EINVAL; 320 error = sysfs_rename_dir(kobj, kobj->parent->dentry, new_name); 321 kobject_put(kobj); 322 323 return error; 324 } 325 326 /** 327 * kobject_rename - change the name of an object 328 * @kobj: object in question. 329 * @new_parent: object's new parent 330 * @new_name: object's new name 331 */ 332 333 int kobject_shadow_rename(struct kobject * kobj, struct dentry *new_parent, 334 const char *new_name) 335 { 336 int error = 0; 337 338 kobj = kobject_get(kobj); 339 if (!kobj) 340 return -EINVAL; 341 error = sysfs_rename_dir(kobj, new_parent, new_name); 342 kobject_put(kobj); 343 344 return error; 345 } 346 347 /** 348 * kobject_move - move object to another parent 349 * @kobj: object in question. 350 * @new_parent: object's new parent (can be NULL) 351 */ 352 353 int kobject_move(struct kobject *kobj, struct kobject *new_parent) 354 { 355 int error; 356 struct kobject *old_parent; 357 const char *devpath = NULL; 358 char *devpath_string = NULL; 359 char *envp[2]; 360 361 kobj = kobject_get(kobj); 362 if (!kobj) 363 return -EINVAL; 364 new_parent = kobject_get(new_parent); 365 if (!new_parent) { 366 if (kobj->kset) 367 new_parent = kobject_get(&kobj->kset->kobj); 368 } 369 /* old object path */ 370 devpath = kobject_get_path(kobj, GFP_KERNEL); 371 if (!devpath) { 372 error = -ENOMEM; 373 goto out; 374 } 375 devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL); 376 if (!devpath_string) { 377 error = -ENOMEM; 378 goto out; 379 } 380 sprintf(devpath_string, "DEVPATH_OLD=%s", devpath); 381 envp[0] = devpath_string; 382 envp[1] = NULL; 383 error = sysfs_move_dir(kobj, new_parent); 384 if (error) 385 goto out; 386 old_parent = kobj->parent; 387 kobj->parent = new_parent; 388 new_parent = NULL; 389 kobject_put(old_parent); 390 kobject_uevent_env(kobj, KOBJ_MOVE, envp); 391 out: 392 kobject_put(new_parent); 393 kobject_put(kobj); 394 kfree(devpath_string); 395 kfree(devpath); 396 return error; 397 } 398 399 /** 400 * kobject_del - unlink kobject from hierarchy. 401 * @kobj: object. 402 */ 403 404 void kobject_del(struct kobject * kobj) 405 { 406 if (!kobj) 407 return; 408 sysfs_remove_dir(kobj); 409 unlink(kobj); 410 } 411 412 /** 413 * kobject_unregister - remove object from hierarchy and decrement refcount. 414 * @kobj: object going away. 415 */ 416 417 void kobject_unregister(struct kobject * kobj) 418 { 419 if (!kobj) 420 return; 421 pr_debug("kobject %s: unregistering\n",kobject_name(kobj)); 422 kobject_uevent(kobj, KOBJ_REMOVE); 423 kobject_del(kobj); 424 kobject_put(kobj); 425 } 426 427 /** 428 * kobject_get - increment refcount for object. 429 * @kobj: object. 430 */ 431 432 struct kobject * kobject_get(struct kobject * kobj) 433 { 434 if (kobj) 435 kref_get(&kobj->kref); 436 return kobj; 437 } 438 439 /** 440 * kobject_cleanup - free kobject resources. 441 * @kobj: object. 442 */ 443 444 void kobject_cleanup(struct kobject * kobj) 445 { 446 struct kobj_type * t = get_ktype(kobj); 447 struct kset * s = kobj->kset; 448 struct kobject * parent = kobj->parent; 449 450 pr_debug("kobject %s: cleaning up\n",kobject_name(kobj)); 451 if (kobj->k_name != kobj->name) 452 kfree(kobj->k_name); 453 kobj->k_name = NULL; 454 if (t && t->release) 455 t->release(kobj); 456 if (s) 457 kset_put(s); 458 kobject_put(parent); 459 } 460 461 static void kobject_release(struct kref *kref) 462 { 463 kobject_cleanup(container_of(kref, struct kobject, kref)); 464 } 465 466 /** 467 * kobject_put - decrement refcount for object. 468 * @kobj: object. 469 * 470 * Decrement the refcount, and if 0, call kobject_cleanup(). 471 */ 472 void kobject_put(struct kobject * kobj) 473 { 474 if (kobj) 475 kref_put(&kobj->kref, kobject_release); 476 } 477 478 479 static void dir_release(struct kobject *kobj) 480 { 481 kfree(kobj); 482 } 483 484 static struct kobj_type dir_ktype = { 485 .release = dir_release, 486 .sysfs_ops = NULL, 487 .default_attrs = NULL, 488 }; 489 490 /** 491 * kobject_add_dir - add sub directory of object. 492 * @parent: object in which a directory is created. 493 * @name: directory name. 494 * 495 * Add a plain directory object as child of given object. 496 */ 497 struct kobject *kobject_add_dir(struct kobject *parent, const char *name) 498 { 499 struct kobject *k; 500 int ret; 501 502 if (!parent) 503 return NULL; 504 505 k = kzalloc(sizeof(*k), GFP_KERNEL); 506 if (!k) 507 return NULL; 508 509 k->parent = parent; 510 k->ktype = &dir_ktype; 511 kobject_set_name(k, name); 512 ret = kobject_register(k); 513 if (ret < 0) { 514 printk(KERN_WARNING "kobject_add_dir: " 515 "kobject_register error: %d\n", ret); 516 kobject_del(k); 517 return NULL; 518 } 519 520 return k; 521 } 522 523 /** 524 * kset_init - initialize a kset for use 525 * @k: kset 526 */ 527 528 void kset_init(struct kset * k) 529 { 530 kobject_init(&k->kobj); 531 INIT_LIST_HEAD(&k->list); 532 spin_lock_init(&k->list_lock); 533 } 534 535 536 /** 537 * kset_add - add a kset object to the hierarchy. 538 * @k: kset. 539 * 540 * Simply, this adds the kset's embedded kobject to the 541 * hierarchy. 542 * We also try to make sure that the kset's embedded kobject 543 * has a parent before it is added. We only care if the embedded 544 * kobject is not part of a kset itself, since kobject_add() 545 * assigns a parent in that case. 546 * If that is the case, and the kset has a controlling subsystem, 547 * then we set the kset's parent to be said subsystem. 548 */ 549 550 int kset_add(struct kset * k) 551 { 552 if (!k->kobj.parent && !k->kobj.kset && k->subsys) 553 k->kobj.parent = &k->subsys->kset.kobj; 554 555 return kobject_add(&k->kobj); 556 } 557 558 559 /** 560 * kset_register - initialize and add a kset. 561 * @k: kset. 562 */ 563 564 int kset_register(struct kset * k) 565 { 566 if (!k) 567 return -EINVAL; 568 kset_init(k); 569 return kset_add(k); 570 } 571 572 573 /** 574 * kset_unregister - remove a kset. 575 * @k: kset. 576 */ 577 578 void kset_unregister(struct kset * k) 579 { 580 if (!k) 581 return; 582 kobject_unregister(&k->kobj); 583 } 584 585 586 /** 587 * kset_find_obj - search for object in kset. 588 * @kset: kset we're looking in. 589 * @name: object's name. 590 * 591 * Lock kset via @kset->subsys, and iterate over @kset->list, 592 * looking for a matching kobject. If matching object is found 593 * take a reference and return the object. 594 */ 595 596 struct kobject * kset_find_obj(struct kset * kset, const char * name) 597 { 598 struct list_head * entry; 599 struct kobject * ret = NULL; 600 601 spin_lock(&kset->list_lock); 602 list_for_each(entry,&kset->list) { 603 struct kobject * k = to_kobj(entry); 604 if (kobject_name(k) && !strcmp(kobject_name(k),name)) { 605 ret = kobject_get(k); 606 break; 607 } 608 } 609 spin_unlock(&kset->list_lock); 610 return ret; 611 } 612 613 614 void subsystem_init(struct subsystem * s) 615 { 616 init_rwsem(&s->rwsem); 617 kset_init(&s->kset); 618 } 619 620 /** 621 * subsystem_register - register a subsystem. 622 * @s: the subsystem we're registering. 623 * 624 * Once we register the subsystem, we want to make sure that 625 * the kset points back to this subsystem for correct usage of 626 * the rwsem. 627 */ 628 629 int subsystem_register(struct subsystem * s) 630 { 631 int error; 632 633 if (!s) 634 return -EINVAL; 635 636 subsystem_init(s); 637 pr_debug("subsystem %s: registering\n",s->kset.kobj.name); 638 639 if (!(error = kset_add(&s->kset))) { 640 if (!s->kset.subsys) 641 s->kset.subsys = s; 642 } 643 return error; 644 } 645 646 void subsystem_unregister(struct subsystem * s) 647 { 648 if (!s) 649 return; 650 pr_debug("subsystem %s: unregistering\n",s->kset.kobj.name); 651 kset_unregister(&s->kset); 652 } 653 654 655 /** 656 * subsystem_create_file - export sysfs attribute file. 657 * @s: subsystem. 658 * @a: subsystem attribute descriptor. 659 */ 660 661 int subsys_create_file(struct subsystem * s, struct subsys_attribute * a) 662 { 663 int error = 0; 664 665 if (!s || !a) 666 return -EINVAL; 667 668 if (subsys_get(s)) { 669 error = sysfs_create_file(&s->kset.kobj,&a->attr); 670 subsys_put(s); 671 } 672 return error; 673 } 674 675 676 /** 677 * subsystem_remove_file - remove sysfs attribute file. 678 * @s: subsystem. 679 * @a: attribute desciptor. 680 */ 681 #if 0 682 void subsys_remove_file(struct subsystem * s, struct subsys_attribute * a) 683 { 684 if (subsys_get(s)) { 685 sysfs_remove_file(&s->kset.kobj,&a->attr); 686 subsys_put(s); 687 } 688 } 689 #endif /* 0 */ 690 691 EXPORT_SYMBOL(kobject_init); 692 EXPORT_SYMBOL(kobject_register); 693 EXPORT_SYMBOL(kobject_unregister); 694 EXPORT_SYMBOL(kobject_get); 695 EXPORT_SYMBOL(kobject_put); 696 EXPORT_SYMBOL(kobject_add); 697 EXPORT_SYMBOL(kobject_del); 698 699 EXPORT_SYMBOL(kset_register); 700 EXPORT_SYMBOL(kset_unregister); 701 702 EXPORT_SYMBOL(subsystem_register); 703 EXPORT_SYMBOL(subsystem_unregister); 704 EXPORT_SYMBOL(subsys_create_file); 705