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