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 sysfs_dirent *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_shadow_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 sysfs_dirent *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 kobject_put(kobj); 178 return -EINVAL; 179 } 180 parent = kobject_get(kobj->parent); 181 182 pr_debug("kobject %s: registering. parent: %s, set: %s\n", 183 kobject_name(kobj), parent ? kobject_name(parent) : "<NULL>", 184 kobj->kset ? kobj->kset->kobj.name : "<NULL>" ); 185 186 if (kobj->kset) { 187 spin_lock(&kobj->kset->list_lock); 188 189 if (!parent) 190 parent = kobject_get(&kobj->kset->kobj); 191 192 list_add_tail(&kobj->entry,&kobj->kset->list); 193 spin_unlock(&kobj->kset->list_lock); 194 kobj->parent = parent; 195 } 196 197 error = create_dir(kobj, shadow_parent); 198 if (error) { 199 /* unlink does the kobject_put() for us */ 200 unlink(kobj); 201 kobject_put(parent); 202 203 /* be noisy on error issues */ 204 if (error == -EEXIST) 205 printk(KERN_ERR "kobject_add failed for %s with " 206 "-EEXIST, don't try to register things with " 207 "the same name in the same directory.\n", 208 kobject_name(kobj)); 209 else 210 printk(KERN_ERR "kobject_add failed for %s (%d)\n", 211 kobject_name(kobj), error); 212 dump_stack(); 213 } 214 215 return error; 216 } 217 218 /** 219 * kobject_add - add an object to the hierarchy. 220 * @kobj: object. 221 */ 222 int kobject_add(struct kobject * kobj) 223 { 224 return kobject_shadow_add(kobj, NULL); 225 } 226 227 228 /** 229 * kobject_register - initialize and add an object. 230 * @kobj: object in question. 231 */ 232 233 int kobject_register(struct kobject * kobj) 234 { 235 int error = -EINVAL; 236 if (kobj) { 237 kobject_init(kobj); 238 error = kobject_add(kobj); 239 if (!error) 240 kobject_uevent(kobj, KOBJ_ADD); 241 } 242 return error; 243 } 244 245 246 /** 247 * kobject_set_name - Set the name of an object 248 * @kobj: object. 249 * @fmt: format string used to build the name 250 * 251 * If strlen(name) >= KOBJ_NAME_LEN, then use a dynamically allocated 252 * string that @kobj->k_name points to. Otherwise, use the static 253 * @kobj->name array. 254 */ 255 int kobject_set_name(struct kobject * kobj, const char * fmt, ...) 256 { 257 int error = 0; 258 int limit = KOBJ_NAME_LEN; 259 int need; 260 va_list args; 261 char * name; 262 263 /* 264 * First, try the static array 265 */ 266 va_start(args,fmt); 267 need = vsnprintf(kobj->name,limit,fmt,args); 268 va_end(args); 269 if (need < limit) 270 name = kobj->name; 271 else { 272 /* 273 * Need more space? Allocate it and try again 274 */ 275 limit = need + 1; 276 name = kmalloc(limit,GFP_KERNEL); 277 if (!name) { 278 error = -ENOMEM; 279 goto Done; 280 } 281 va_start(args,fmt); 282 need = vsnprintf(name,limit,fmt,args); 283 va_end(args); 284 285 /* Still? Give up. */ 286 if (need >= limit) { 287 kfree(name); 288 error = -EFAULT; 289 goto Done; 290 } 291 } 292 293 /* Free the old name, if necessary. */ 294 if (kobj->k_name && kobj->k_name != kobj->name) 295 kfree(kobj->k_name); 296 297 /* Now, set the new name */ 298 kobj->k_name = name; 299 Done: 300 return error; 301 } 302 303 EXPORT_SYMBOL(kobject_set_name); 304 305 306 /** 307 * kobject_rename - change the name of an object 308 * @kobj: object in question. 309 * @new_name: object's new name 310 */ 311 312 int kobject_rename(struct kobject * kobj, const char *new_name) 313 { 314 int error = 0; 315 const char *devpath = NULL; 316 char *devpath_string = NULL; 317 char *envp[2]; 318 319 kobj = kobject_get(kobj); 320 if (!kobj) 321 return -EINVAL; 322 if (!kobj->parent) 323 return -EINVAL; 324 325 devpath = kobject_get_path(kobj, GFP_KERNEL); 326 if (!devpath) { 327 error = -ENOMEM; 328 goto out; 329 } 330 devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL); 331 if (!devpath_string) { 332 error = -ENOMEM; 333 goto out; 334 } 335 sprintf(devpath_string, "DEVPATH_OLD=%s", devpath); 336 envp[0] = devpath_string; 337 envp[1] = NULL; 338 /* Note : if we want to send the new name alone, not the full path, 339 * we could probably use kobject_name(kobj); */ 340 341 error = sysfs_rename_dir(kobj, kobj->parent->sd, new_name); 342 343 /* This function is mostly/only used for network interface. 344 * Some hotplug package track interfaces by their name and 345 * therefore want to know when the name is changed by the user. */ 346 if (!error) 347 kobject_uevent_env(kobj, KOBJ_MOVE, envp); 348 349 out: 350 kfree(devpath_string); 351 kfree(devpath); 352 kobject_put(kobj); 353 354 return error; 355 } 356 357 /** 358 * kobject_rename - change the name of an object 359 * @kobj: object in question. 360 * @new_parent: object's new parent 361 * @new_name: object's new name 362 */ 363 364 int kobject_shadow_rename(struct kobject *kobj, 365 struct sysfs_dirent *new_parent, const char *new_name) 366 { 367 int error = 0; 368 369 kobj = kobject_get(kobj); 370 if (!kobj) 371 return -EINVAL; 372 error = sysfs_rename_dir(kobj, new_parent, new_name); 373 kobject_put(kobj); 374 375 return error; 376 } 377 378 /** 379 * kobject_move - move object to another parent 380 * @kobj: object in question. 381 * @new_parent: object's new parent (can be NULL) 382 */ 383 384 int kobject_move(struct kobject *kobj, struct kobject *new_parent) 385 { 386 int error; 387 struct kobject *old_parent; 388 const char *devpath = NULL; 389 char *devpath_string = NULL; 390 char *envp[2]; 391 392 kobj = kobject_get(kobj); 393 if (!kobj) 394 return -EINVAL; 395 new_parent = kobject_get(new_parent); 396 if (!new_parent) { 397 if (kobj->kset) 398 new_parent = kobject_get(&kobj->kset->kobj); 399 } 400 /* old object path */ 401 devpath = kobject_get_path(kobj, GFP_KERNEL); 402 if (!devpath) { 403 error = -ENOMEM; 404 goto out; 405 } 406 devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL); 407 if (!devpath_string) { 408 error = -ENOMEM; 409 goto out; 410 } 411 sprintf(devpath_string, "DEVPATH_OLD=%s", devpath); 412 envp[0] = devpath_string; 413 envp[1] = NULL; 414 error = sysfs_move_dir(kobj, new_parent); 415 if (error) 416 goto out; 417 old_parent = kobj->parent; 418 kobj->parent = new_parent; 419 new_parent = NULL; 420 kobject_put(old_parent); 421 kobject_uevent_env(kobj, KOBJ_MOVE, envp); 422 out: 423 kobject_put(new_parent); 424 kobject_put(kobj); 425 kfree(devpath_string); 426 kfree(devpath); 427 return error; 428 } 429 430 /** 431 * kobject_del - unlink kobject from hierarchy. 432 * @kobj: object. 433 */ 434 435 void kobject_del(struct kobject * kobj) 436 { 437 if (!kobj) 438 return; 439 sysfs_remove_dir(kobj); 440 unlink(kobj); 441 } 442 443 /** 444 * kobject_unregister - remove object from hierarchy and decrement refcount. 445 * @kobj: object going away. 446 */ 447 448 void kobject_unregister(struct kobject * kobj) 449 { 450 if (!kobj) 451 return; 452 pr_debug("kobject %s: unregistering\n",kobject_name(kobj)); 453 kobject_uevent(kobj, KOBJ_REMOVE); 454 kobject_del(kobj); 455 kobject_put(kobj); 456 } 457 458 /** 459 * kobject_get - increment refcount for object. 460 * @kobj: object. 461 */ 462 463 struct kobject * kobject_get(struct kobject * kobj) 464 { 465 if (kobj) 466 kref_get(&kobj->kref); 467 return kobj; 468 } 469 470 /** 471 * kobject_cleanup - free kobject resources. 472 * @kobj: object. 473 */ 474 475 void kobject_cleanup(struct kobject * kobj) 476 { 477 struct kobj_type * t = get_ktype(kobj); 478 struct kset * s = kobj->kset; 479 struct kobject * parent = kobj->parent; 480 481 pr_debug("kobject %s: cleaning up\n",kobject_name(kobj)); 482 if (kobj->k_name != kobj->name) 483 kfree(kobj->k_name); 484 kobj->k_name = NULL; 485 if (t && t->release) 486 t->release(kobj); 487 if (s) 488 kset_put(s); 489 kobject_put(parent); 490 } 491 492 static void kobject_release(struct kref *kref) 493 { 494 kobject_cleanup(container_of(kref, struct kobject, kref)); 495 } 496 497 /** 498 * kobject_put - decrement refcount for object. 499 * @kobj: object. 500 * 501 * Decrement the refcount, and if 0, call kobject_cleanup(). 502 */ 503 void kobject_put(struct kobject * kobj) 504 { 505 if (kobj) 506 kref_put(&kobj->kref, kobject_release); 507 } 508 509 510 static void dir_release(struct kobject *kobj) 511 { 512 kfree(kobj); 513 } 514 515 static struct kobj_type dir_ktype = { 516 .release = dir_release, 517 .sysfs_ops = NULL, 518 .default_attrs = NULL, 519 }; 520 521 /** 522 * kobject_kset_add_dir - add sub directory of object. 523 * @kset: kset the directory is belongs to. 524 * @parent: object in which a directory is created. 525 * @name: directory name. 526 * 527 * Add a plain directory object as child of given object. 528 */ 529 struct kobject *kobject_kset_add_dir(struct kset *kset, 530 struct kobject *parent, const char *name) 531 { 532 struct kobject *k; 533 int ret; 534 535 if (!parent) 536 return NULL; 537 538 k = kzalloc(sizeof(*k), GFP_KERNEL); 539 if (!k) 540 return NULL; 541 542 k->kset = kset; 543 k->parent = parent; 544 k->ktype = &dir_ktype; 545 kobject_set_name(k, name); 546 ret = kobject_register(k); 547 if (ret < 0) { 548 printk(KERN_WARNING "%s: kobject_register error: %d\n", 549 __func__, ret); 550 kobject_del(k); 551 return NULL; 552 } 553 554 return k; 555 } 556 557 /** 558 * kobject_add_dir - add sub directory of object. 559 * @parent: object in which a directory is created. 560 * @name: directory name. 561 * 562 * Add a plain directory object as child of given object. 563 */ 564 struct kobject *kobject_add_dir(struct kobject *parent, const char *name) 565 { 566 return kobject_kset_add_dir(NULL, parent, name); 567 } 568 569 /** 570 * kset_init - initialize a kset for use 571 * @k: kset 572 */ 573 574 void kset_init(struct kset * k) 575 { 576 kobject_init(&k->kobj); 577 INIT_LIST_HEAD(&k->list); 578 spin_lock_init(&k->list_lock); 579 } 580 581 582 /** 583 * kset_add - add a kset object to the hierarchy. 584 * @k: kset. 585 */ 586 587 int kset_add(struct kset * k) 588 { 589 return kobject_add(&k->kobj); 590 } 591 592 593 /** 594 * kset_register - initialize and add a kset. 595 * @k: kset. 596 */ 597 598 int kset_register(struct kset * k) 599 { 600 int err; 601 602 if (!k) 603 return -EINVAL; 604 605 kset_init(k); 606 err = kset_add(k); 607 if (err) 608 return err; 609 kobject_uevent(&k->kobj, KOBJ_ADD); 610 return 0; 611 } 612 613 614 /** 615 * kset_unregister - remove a kset. 616 * @k: kset. 617 */ 618 619 void kset_unregister(struct kset * k) 620 { 621 if (!k) 622 return; 623 kobject_unregister(&k->kobj); 624 } 625 626 627 /** 628 * kset_find_obj - search for object in kset. 629 * @kset: kset we're looking in. 630 * @name: object's name. 631 * 632 * Lock kset via @kset->subsys, and iterate over @kset->list, 633 * looking for a matching kobject. If matching object is found 634 * take a reference and return the object. 635 */ 636 637 struct kobject * kset_find_obj(struct kset * kset, const char * name) 638 { 639 struct list_head * entry; 640 struct kobject * ret = NULL; 641 642 spin_lock(&kset->list_lock); 643 list_for_each(entry,&kset->list) { 644 struct kobject * k = to_kobj(entry); 645 if (kobject_name(k) && !strcmp(kobject_name(k),name)) { 646 ret = kobject_get(k); 647 break; 648 } 649 } 650 spin_unlock(&kset->list_lock); 651 return ret; 652 } 653 654 void subsystem_init(struct kset *s) 655 { 656 kset_init(s); 657 } 658 659 int subsystem_register(struct kset *s) 660 { 661 return kset_register(s); 662 } 663 664 void subsystem_unregister(struct kset *s) 665 { 666 kset_unregister(s); 667 } 668 669 /** 670 * subsystem_create_file - export sysfs attribute file. 671 * @s: subsystem. 672 * @a: subsystem attribute descriptor. 673 */ 674 675 int subsys_create_file(struct kset *s, struct subsys_attribute *a) 676 { 677 int error = 0; 678 679 if (!s || !a) 680 return -EINVAL; 681 682 if (subsys_get(s)) { 683 error = sysfs_create_file(&s->kobj, &a->attr); 684 subsys_put(s); 685 } 686 return error; 687 } 688 689 EXPORT_SYMBOL(kobject_init); 690 EXPORT_SYMBOL(kobject_register); 691 EXPORT_SYMBOL(kobject_unregister); 692 EXPORT_SYMBOL(kobject_get); 693 EXPORT_SYMBOL(kobject_put); 694 EXPORT_SYMBOL(kobject_add); 695 EXPORT_SYMBOL(kobject_del); 696 697 EXPORT_SYMBOL(kset_register); 698 EXPORT_SYMBOL(kset_unregister); 699 700 EXPORT_SYMBOL(subsystem_register); 701 EXPORT_SYMBOL(subsystem_unregister); 702 EXPORT_SYMBOL(subsys_create_file); 703