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 = kmalloc(len, gfp_mask); 115 if (!path) 116 return NULL; 117 memset(path, 0x00, len); 118 fill_kobj_path(kobj, path, len); 119 120 return path; 121 } 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_del - unlink kobject from hierarchy. 314 * @kobj: object. 315 */ 316 317 void kobject_del(struct kobject * kobj) 318 { 319 sysfs_remove_dir(kobj); 320 unlink(kobj); 321 } 322 323 /** 324 * kobject_unregister - remove object from hierarchy and decrement refcount. 325 * @kobj: object going away. 326 */ 327 328 void kobject_unregister(struct kobject * kobj) 329 { 330 pr_debug("kobject %s: unregistering\n",kobject_name(kobj)); 331 kobject_uevent(kobj, KOBJ_REMOVE); 332 kobject_del(kobj); 333 kobject_put(kobj); 334 } 335 336 /** 337 * kobject_get - increment refcount for object. 338 * @kobj: object. 339 */ 340 341 struct kobject * kobject_get(struct kobject * kobj) 342 { 343 if (kobj) 344 kref_get(&kobj->kref); 345 return kobj; 346 } 347 348 /** 349 * kobject_cleanup - free kobject resources. 350 * @kobj: object. 351 */ 352 353 void kobject_cleanup(struct kobject * kobj) 354 { 355 struct kobj_type * t = get_ktype(kobj); 356 struct kset * s = kobj->kset; 357 struct kobject * parent = kobj->parent; 358 359 pr_debug("kobject %s: cleaning up\n",kobject_name(kobj)); 360 if (kobj->k_name != kobj->name) 361 kfree(kobj->k_name); 362 kobj->k_name = NULL; 363 if (t && t->release) 364 t->release(kobj); 365 if (s) 366 kset_put(s); 367 if (parent) 368 kobject_put(parent); 369 } 370 371 static void kobject_release(struct kref *kref) 372 { 373 kobject_cleanup(container_of(kref, struct kobject, kref)); 374 } 375 376 /** 377 * kobject_put - decrement refcount for object. 378 * @kobj: object. 379 * 380 * Decrement the refcount, and if 0, call kobject_cleanup(). 381 */ 382 void kobject_put(struct kobject * kobj) 383 { 384 if (kobj) 385 kref_put(&kobj->kref, kobject_release); 386 } 387 388 389 static void dir_release(struct kobject *kobj) 390 { 391 kfree(kobj); 392 } 393 394 static struct kobj_type dir_ktype = { 395 .release = dir_release, 396 .sysfs_ops = NULL, 397 .default_attrs = NULL, 398 }; 399 400 /** 401 * kobject_add_dir - add sub directory of object. 402 * @parent: object in which a directory is created. 403 * @name: directory name. 404 * 405 * Add a plain directory object as child of given object. 406 */ 407 struct kobject *kobject_add_dir(struct kobject *parent, const char *name) 408 { 409 struct kobject *k; 410 int ret; 411 412 if (!parent) 413 return NULL; 414 415 k = kzalloc(sizeof(*k), GFP_KERNEL); 416 if (!k) 417 return NULL; 418 419 k->parent = parent; 420 k->ktype = &dir_ktype; 421 kobject_set_name(k, name); 422 ret = kobject_register(k); 423 if (ret < 0) { 424 printk(KERN_WARNING "kobject_add_dir: " 425 "kobject_register error: %d\n", ret); 426 kobject_del(k); 427 return NULL; 428 } 429 430 return k; 431 } 432 433 /** 434 * kset_init - initialize a kset for use 435 * @k: kset 436 */ 437 438 void kset_init(struct kset * k) 439 { 440 kobject_init(&k->kobj); 441 INIT_LIST_HEAD(&k->list); 442 spin_lock_init(&k->list_lock); 443 } 444 445 446 /** 447 * kset_add - add a kset object to the hierarchy. 448 * @k: kset. 449 * 450 * Simply, this adds the kset's embedded kobject to the 451 * hierarchy. 452 * We also try to make sure that the kset's embedded kobject 453 * has a parent before it is added. We only care if the embedded 454 * kobject is not part of a kset itself, since kobject_add() 455 * assigns a parent in that case. 456 * If that is the case, and the kset has a controlling subsystem, 457 * then we set the kset's parent to be said subsystem. 458 */ 459 460 int kset_add(struct kset * k) 461 { 462 if (!k->kobj.parent && !k->kobj.kset && k->subsys) 463 k->kobj.parent = &k->subsys->kset.kobj; 464 465 return kobject_add(&k->kobj); 466 } 467 468 469 /** 470 * kset_register - initialize and add a kset. 471 * @k: kset. 472 */ 473 474 int kset_register(struct kset * k) 475 { 476 kset_init(k); 477 return kset_add(k); 478 } 479 480 481 /** 482 * kset_unregister - remove a kset. 483 * @k: kset. 484 */ 485 486 void kset_unregister(struct kset * k) 487 { 488 kobject_unregister(&k->kobj); 489 } 490 491 492 /** 493 * kset_find_obj - search for object in kset. 494 * @kset: kset we're looking in. 495 * @name: object's name. 496 * 497 * Lock kset via @kset->subsys, and iterate over @kset->list, 498 * looking for a matching kobject. If matching object is found 499 * take a reference and return the object. 500 */ 501 502 struct kobject * kset_find_obj(struct kset * kset, const char * name) 503 { 504 struct list_head * entry; 505 struct kobject * ret = NULL; 506 507 spin_lock(&kset->list_lock); 508 list_for_each(entry,&kset->list) { 509 struct kobject * k = to_kobj(entry); 510 if (kobject_name(k) && !strcmp(kobject_name(k),name)) { 511 ret = kobject_get(k); 512 break; 513 } 514 } 515 spin_unlock(&kset->list_lock); 516 return ret; 517 } 518 519 520 void subsystem_init(struct subsystem * s) 521 { 522 init_rwsem(&s->rwsem); 523 kset_init(&s->kset); 524 } 525 526 /** 527 * subsystem_register - register a subsystem. 528 * @s: the subsystem we're registering. 529 * 530 * Once we register the subsystem, we want to make sure that 531 * the kset points back to this subsystem for correct usage of 532 * the rwsem. 533 */ 534 535 int subsystem_register(struct subsystem * s) 536 { 537 int error; 538 539 subsystem_init(s); 540 pr_debug("subsystem %s: registering\n",s->kset.kobj.name); 541 542 if (!(error = kset_add(&s->kset))) { 543 if (!s->kset.subsys) 544 s->kset.subsys = s; 545 } 546 return error; 547 } 548 549 void subsystem_unregister(struct subsystem * s) 550 { 551 pr_debug("subsystem %s: unregistering\n",s->kset.kobj.name); 552 kset_unregister(&s->kset); 553 } 554 555 556 /** 557 * subsystem_create_file - export sysfs attribute file. 558 * @s: subsystem. 559 * @a: subsystem attribute descriptor. 560 */ 561 562 int subsys_create_file(struct subsystem * s, struct subsys_attribute * a) 563 { 564 int error = 0; 565 if (subsys_get(s)) { 566 error = sysfs_create_file(&s->kset.kobj,&a->attr); 567 subsys_put(s); 568 } 569 return error; 570 } 571 572 573 /** 574 * subsystem_remove_file - remove sysfs attribute file. 575 * @s: subsystem. 576 * @a: attribute desciptor. 577 */ 578 #if 0 579 void subsys_remove_file(struct subsystem * s, struct subsys_attribute * a) 580 { 581 if (subsys_get(s)) { 582 sysfs_remove_file(&s->kset.kobj,&a->attr); 583 subsys_put(s); 584 } 585 } 586 #endif /* 0 */ 587 588 EXPORT_SYMBOL(kobject_init); 589 EXPORT_SYMBOL(kobject_register); 590 EXPORT_SYMBOL(kobject_unregister); 591 EXPORT_SYMBOL(kobject_get); 592 EXPORT_SYMBOL(kobject_put); 593 EXPORT_SYMBOL(kobject_add); 594 EXPORT_SYMBOL(kobject_del); 595 596 EXPORT_SYMBOL(kset_register); 597 EXPORT_SYMBOL(kset_unregister); 598 599 EXPORT_SYMBOL(subsystem_register); 600 EXPORT_SYMBOL(subsystem_unregister); 601 EXPORT_SYMBOL(subsys_create_file); 602