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 199 return error; 200 } 201 202 203 /** 204 * kobject_register - initialize and add an object. 205 * @kobj: object in question. 206 */ 207 208 int kobject_register(struct kobject * kobj) 209 { 210 int error = 0; 211 if (kobj) { 212 kobject_init(kobj); 213 error = kobject_add(kobj); 214 if (error) { 215 printk("kobject_register failed for %s (%d)\n", 216 kobject_name(kobj),error); 217 dump_stack(); 218 } else 219 kobject_uevent(kobj, KOBJ_ADD); 220 } else 221 error = -EINVAL; 222 return error; 223 } 224 225 226 /** 227 * kobject_set_name - Set the name of an object 228 * @kobj: object. 229 * @fmt: format string used to build the name 230 * 231 * If strlen(name) >= KOBJ_NAME_LEN, then use a dynamically allocated 232 * string that @kobj->k_name points to. Otherwise, use the static 233 * @kobj->name array. 234 */ 235 int kobject_set_name(struct kobject * kobj, const char * fmt, ...) 236 { 237 int error = 0; 238 int limit = KOBJ_NAME_LEN; 239 int need; 240 va_list args; 241 char * name; 242 243 /* 244 * First, try the static array 245 */ 246 va_start(args,fmt); 247 need = vsnprintf(kobj->name,limit,fmt,args); 248 va_end(args); 249 if (need < limit) 250 name = kobj->name; 251 else { 252 /* 253 * Need more space? Allocate it and try again 254 */ 255 limit = need + 1; 256 name = kmalloc(limit,GFP_KERNEL); 257 if (!name) { 258 error = -ENOMEM; 259 goto Done; 260 } 261 va_start(args,fmt); 262 need = vsnprintf(name,limit,fmt,args); 263 va_end(args); 264 265 /* Still? Give up. */ 266 if (need >= limit) { 267 kfree(name); 268 error = -EFAULT; 269 goto Done; 270 } 271 } 272 273 /* Free the old name, if necessary. */ 274 if (kobj->k_name && kobj->k_name != kobj->name) 275 kfree(kobj->k_name); 276 277 /* Now, set the new name */ 278 kobj->k_name = name; 279 Done: 280 return error; 281 } 282 283 EXPORT_SYMBOL(kobject_set_name); 284 285 286 /** 287 * kobject_rename - change the name of an object 288 * @kobj: object in question. 289 * @new_name: object's new name 290 */ 291 292 int kobject_rename(struct kobject * kobj, const char *new_name) 293 { 294 int error = 0; 295 296 kobj = kobject_get(kobj); 297 if (!kobj) 298 return -EINVAL; 299 error = sysfs_rename_dir(kobj, new_name); 300 kobject_put(kobj); 301 302 return error; 303 } 304 305 /** 306 * kobject_del - unlink kobject from hierarchy. 307 * @kobj: object. 308 */ 309 310 void kobject_del(struct kobject * kobj) 311 { 312 sysfs_remove_dir(kobj); 313 unlink(kobj); 314 } 315 316 /** 317 * kobject_unregister - remove object from hierarchy and decrement refcount. 318 * @kobj: object going away. 319 */ 320 321 void kobject_unregister(struct kobject * kobj) 322 { 323 pr_debug("kobject %s: unregistering\n",kobject_name(kobj)); 324 kobject_uevent(kobj, KOBJ_REMOVE); 325 kobject_del(kobj); 326 kobject_put(kobj); 327 } 328 329 /** 330 * kobject_get - increment refcount for object. 331 * @kobj: object. 332 */ 333 334 struct kobject * kobject_get(struct kobject * kobj) 335 { 336 if (kobj) 337 kref_get(&kobj->kref); 338 return kobj; 339 } 340 341 /** 342 * kobject_cleanup - free kobject resources. 343 * @kobj: object. 344 */ 345 346 void kobject_cleanup(struct kobject * kobj) 347 { 348 struct kobj_type * t = get_ktype(kobj); 349 struct kset * s = kobj->kset; 350 struct kobject * parent = kobj->parent; 351 352 pr_debug("kobject %s: cleaning up\n",kobject_name(kobj)); 353 if (kobj->k_name != kobj->name) 354 kfree(kobj->k_name); 355 kobj->k_name = NULL; 356 if (t && t->release) 357 t->release(kobj); 358 if (s) 359 kset_put(s); 360 if (parent) 361 kobject_put(parent); 362 } 363 364 static void kobject_release(struct kref *kref) 365 { 366 kobject_cleanup(container_of(kref, struct kobject, kref)); 367 } 368 369 /** 370 * kobject_put - decrement refcount for object. 371 * @kobj: object. 372 * 373 * Decrement the refcount, and if 0, call kobject_cleanup(). 374 */ 375 void kobject_put(struct kobject * kobj) 376 { 377 if (kobj) 378 kref_put(&kobj->kref, kobject_release); 379 } 380 381 382 /** 383 * kset_init - initialize a kset for use 384 * @k: kset 385 */ 386 387 void kset_init(struct kset * k) 388 { 389 kobject_init(&k->kobj); 390 INIT_LIST_HEAD(&k->list); 391 spin_lock_init(&k->list_lock); 392 } 393 394 395 /** 396 * kset_add - add a kset object to the hierarchy. 397 * @k: kset. 398 * 399 * Simply, this adds the kset's embedded kobject to the 400 * hierarchy. 401 * We also try to make sure that the kset's embedded kobject 402 * has a parent before it is added. We only care if the embedded 403 * kobject is not part of a kset itself, since kobject_add() 404 * assigns a parent in that case. 405 * If that is the case, and the kset has a controlling subsystem, 406 * then we set the kset's parent to be said subsystem. 407 */ 408 409 int kset_add(struct kset * k) 410 { 411 if (!k->kobj.parent && !k->kobj.kset && k->subsys) 412 k->kobj.parent = &k->subsys->kset.kobj; 413 414 return kobject_add(&k->kobj); 415 } 416 417 418 /** 419 * kset_register - initialize and add a kset. 420 * @k: kset. 421 */ 422 423 int kset_register(struct kset * k) 424 { 425 kset_init(k); 426 return kset_add(k); 427 } 428 429 430 /** 431 * kset_unregister - remove a kset. 432 * @k: kset. 433 */ 434 435 void kset_unregister(struct kset * k) 436 { 437 kobject_unregister(&k->kobj); 438 } 439 440 441 /** 442 * kset_find_obj - search for object in kset. 443 * @kset: kset we're looking in. 444 * @name: object's name. 445 * 446 * Lock kset via @kset->subsys, and iterate over @kset->list, 447 * looking for a matching kobject. If matching object is found 448 * take a reference and return the object. 449 */ 450 451 struct kobject * kset_find_obj(struct kset * kset, const char * name) 452 { 453 struct list_head * entry; 454 struct kobject * ret = NULL; 455 456 spin_lock(&kset->list_lock); 457 list_for_each(entry,&kset->list) { 458 struct kobject * k = to_kobj(entry); 459 if (kobject_name(k) && !strcmp(kobject_name(k),name)) { 460 ret = kobject_get(k); 461 break; 462 } 463 } 464 spin_unlock(&kset->list_lock); 465 return ret; 466 } 467 468 469 void subsystem_init(struct subsystem * s) 470 { 471 init_rwsem(&s->rwsem); 472 kset_init(&s->kset); 473 } 474 475 /** 476 * subsystem_register - register a subsystem. 477 * @s: the subsystem we're registering. 478 * 479 * Once we register the subsystem, we want to make sure that 480 * the kset points back to this subsystem for correct usage of 481 * the rwsem. 482 */ 483 484 int subsystem_register(struct subsystem * s) 485 { 486 int error; 487 488 subsystem_init(s); 489 pr_debug("subsystem %s: registering\n",s->kset.kobj.name); 490 491 if (!(error = kset_add(&s->kset))) { 492 if (!s->kset.subsys) 493 s->kset.subsys = s; 494 } 495 return error; 496 } 497 498 void subsystem_unregister(struct subsystem * s) 499 { 500 pr_debug("subsystem %s: unregistering\n",s->kset.kobj.name); 501 kset_unregister(&s->kset); 502 } 503 504 505 /** 506 * subsystem_create_file - export sysfs attribute file. 507 * @s: subsystem. 508 * @a: subsystem attribute descriptor. 509 */ 510 511 int subsys_create_file(struct subsystem * s, struct subsys_attribute * a) 512 { 513 int error = 0; 514 if (subsys_get(s)) { 515 error = sysfs_create_file(&s->kset.kobj,&a->attr); 516 subsys_put(s); 517 } 518 return error; 519 } 520 521 522 /** 523 * subsystem_remove_file - remove sysfs attribute file. 524 * @s: subsystem. 525 * @a: attribute desciptor. 526 */ 527 528 void subsys_remove_file(struct subsystem * s, struct subsys_attribute * a) 529 { 530 if (subsys_get(s)) { 531 sysfs_remove_file(&s->kset.kobj,&a->attr); 532 subsys_put(s); 533 } 534 } 535 536 EXPORT_SYMBOL(kobject_init); 537 EXPORT_SYMBOL(kobject_register); 538 EXPORT_SYMBOL(kobject_unregister); 539 EXPORT_SYMBOL(kobject_get); 540 EXPORT_SYMBOL(kobject_put); 541 EXPORT_SYMBOL(kobject_add); 542 EXPORT_SYMBOL(kobject_del); 543 544 EXPORT_SYMBOL(kset_register); 545 EXPORT_SYMBOL(kset_unregister); 546 EXPORT_SYMBOL(kset_find_obj); 547 548 EXPORT_SYMBOL(subsystem_init); 549 EXPORT_SYMBOL(subsystem_register); 550 EXPORT_SYMBOL(subsystem_unregister); 551 EXPORT_SYMBOL(subsys_create_file); 552 EXPORT_SYMBOL(subsys_remove_file); 553