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