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