diff options
Diffstat (limited to 'lib/kobject.c')
| -rw-r--r-- | lib/kobject.c | 63 |
1 files changed, 26 insertions, 37 deletions
diff --git a/lib/kobject.c b/lib/kobject.c index 0d03252f87a8..718e5101c263 100644 --- a/lib/kobject.c +++ b/lib/kobject.c | |||
| @@ -58,11 +58,6 @@ static int create_dir(struct kobject *kobj) | |||
| 58 | return error; | 58 | return error; |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | static inline struct kobject *to_kobj(struct list_head *entry) | ||
| 62 | { | ||
| 63 | return container_of(entry, struct kobject, entry); | ||
| 64 | } | ||
| 65 | |||
| 66 | static int get_kobj_path_length(struct kobject *kobj) | 61 | static int get_kobj_path_length(struct kobject *kobj) |
| 67 | { | 62 | { |
| 68 | int length = 1; | 63 | int length = 1; |
| @@ -95,7 +90,7 @@ static void fill_kobj_path(struct kobject *kobj, char *path, int length) | |||
| 95 | } | 90 | } |
| 96 | 91 | ||
| 97 | pr_debug("kobject: '%s' (%p): %s: path = '%s'\n", kobject_name(kobj), | 92 | pr_debug("kobject: '%s' (%p): %s: path = '%s'\n", kobject_name(kobj), |
| 98 | kobj, __FUNCTION__, path); | 93 | kobj, __func__, path); |
| 99 | } | 94 | } |
| 100 | 95 | ||
| 101 | /** | 96 | /** |
| @@ -186,7 +181,7 @@ static int kobject_add_internal(struct kobject *kobj) | |||
| 186 | } | 181 | } |
| 187 | 182 | ||
| 188 | pr_debug("kobject: '%s' (%p): %s: parent: '%s', set: '%s'\n", | 183 | pr_debug("kobject: '%s' (%p): %s: parent: '%s', set: '%s'\n", |
| 189 | kobject_name(kobj), kobj, __FUNCTION__, | 184 | kobject_name(kobj), kobj, __func__, |
| 190 | parent ? kobject_name(parent) : "<NULL>", | 185 | parent ? kobject_name(parent) : "<NULL>", |
| 191 | kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>"); | 186 | kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>"); |
| 192 | 187 | ||
| @@ -201,10 +196,10 @@ static int kobject_add_internal(struct kobject *kobj) | |||
| 201 | printk(KERN_ERR "%s failed for %s with " | 196 | printk(KERN_ERR "%s failed for %s with " |
| 202 | "-EEXIST, don't try to register things with " | 197 | "-EEXIST, don't try to register things with " |
| 203 | "the same name in the same directory.\n", | 198 | "the same name in the same directory.\n", |
| 204 | __FUNCTION__, kobject_name(kobj)); | 199 | __func__, kobject_name(kobj)); |
| 205 | else | 200 | else |
| 206 | printk(KERN_ERR "%s failed for %s (%d)\n", | 201 | printk(KERN_ERR "%s failed for %s (%d)\n", |
| 207 | __FUNCTION__, kobject_name(kobj), error); | 202 | __func__, kobject_name(kobj), error); |
| 208 | dump_stack(); | 203 | dump_stack(); |
| 209 | } else | 204 | } else |
| 210 | kobj->state_in_sysfs = 1; | 205 | kobj->state_in_sysfs = 1; |
| @@ -221,21 +216,12 @@ static int kobject_add_internal(struct kobject *kobj) | |||
| 221 | static int kobject_set_name_vargs(struct kobject *kobj, const char *fmt, | 216 | static int kobject_set_name_vargs(struct kobject *kobj, const char *fmt, |
| 222 | va_list vargs) | 217 | va_list vargs) |
| 223 | { | 218 | { |
| 224 | va_list aq; | ||
| 225 | char *name; | ||
| 226 | |||
| 227 | va_copy(aq, vargs); | ||
| 228 | name = kvasprintf(GFP_KERNEL, fmt, vargs); | ||
| 229 | va_end(aq); | ||
| 230 | |||
| 231 | if (!name) | ||
| 232 | return -ENOMEM; | ||
| 233 | |||
| 234 | /* Free the old name, if necessary. */ | 219 | /* Free the old name, if necessary. */ |
| 235 | kfree(kobj->name); | 220 | kfree(kobj->name); |
| 236 | 221 | ||
| 237 | /* Now, set the new name */ | 222 | kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs); |
| 238 | kobj->name = name; | 223 | if (!kobj->name) |
| 224 | return -ENOMEM; | ||
| 239 | 225 | ||
| 240 | return 0; | 226 | return 0; |
| 241 | } | 227 | } |
| @@ -251,12 +237,12 @@ static int kobject_set_name_vargs(struct kobject *kobj, const char *fmt, | |||
| 251 | */ | 237 | */ |
| 252 | int kobject_set_name(struct kobject *kobj, const char *fmt, ...) | 238 | int kobject_set_name(struct kobject *kobj, const char *fmt, ...) |
| 253 | { | 239 | { |
| 254 | va_list args; | 240 | va_list vargs; |
| 255 | int retval; | 241 | int retval; |
| 256 | 242 | ||
| 257 | va_start(args, fmt); | 243 | va_start(vargs, fmt); |
| 258 | retval = kobject_set_name_vargs(kobj, fmt, args); | 244 | retval = kobject_set_name_vargs(kobj, fmt, vargs); |
| 259 | va_end(args); | 245 | va_end(vargs); |
| 260 | 246 | ||
| 261 | return retval; | 247 | return retval; |
| 262 | } | 248 | } |
| @@ -306,12 +292,9 @@ EXPORT_SYMBOL(kobject_init); | |||
| 306 | static int kobject_add_varg(struct kobject *kobj, struct kobject *parent, | 292 | static int kobject_add_varg(struct kobject *kobj, struct kobject *parent, |
| 307 | const char *fmt, va_list vargs) | 293 | const char *fmt, va_list vargs) |
| 308 | { | 294 | { |
| 309 | va_list aq; | ||
| 310 | int retval; | 295 | int retval; |
| 311 | 296 | ||
| 312 | va_copy(aq, vargs); | 297 | retval = kobject_set_name_vargs(kobj, fmt, vargs); |
| 313 | retval = kobject_set_name_vargs(kobj, fmt, aq); | ||
| 314 | va_end(aq); | ||
| 315 | if (retval) { | 298 | if (retval) { |
| 316 | printk(KERN_ERR "kobject: can not set name properly!\n"); | 299 | printk(KERN_ERR "kobject: can not set name properly!\n"); |
| 317 | return retval; | 300 | return retval; |
| @@ -545,7 +528,7 @@ static void kobject_cleanup(struct kobject *kobj) | |||
| 545 | const char *name = kobj->name; | 528 | const char *name = kobj->name; |
| 546 | 529 | ||
| 547 | pr_debug("kobject: '%s' (%p): %s\n", | 530 | pr_debug("kobject: '%s' (%p): %s\n", |
| 548 | kobject_name(kobj), kobj, __FUNCTION__); | 531 | kobject_name(kobj), kobj, __func__); |
| 549 | 532 | ||
| 550 | if (t && !t->release) | 533 | if (t && !t->release) |
| 551 | pr_debug("kobject: '%s' (%p): does not have a release() " | 534 | pr_debug("kobject: '%s' (%p): does not have a release() " |
| @@ -592,13 +575,20 @@ static void kobject_release(struct kref *kref) | |||
| 592 | */ | 575 | */ |
| 593 | void kobject_put(struct kobject *kobj) | 576 | void kobject_put(struct kobject *kobj) |
| 594 | { | 577 | { |
| 595 | if (kobj) | 578 | if (kobj) { |
| 579 | if (!kobj->state_initialized) { | ||
| 580 | printk(KERN_WARNING "kobject: '%s' (%p): is not " | ||
| 581 | "initialized, yet kobject_put() is being " | ||
| 582 | "called.\n", kobject_name(kobj), kobj); | ||
| 583 | WARN_ON(1); | ||
| 584 | } | ||
| 596 | kref_put(&kobj->kref, kobject_release); | 585 | kref_put(&kobj->kref, kobject_release); |
| 586 | } | ||
| 597 | } | 587 | } |
| 598 | 588 | ||
| 599 | static void dynamic_kobj_release(struct kobject *kobj) | 589 | static void dynamic_kobj_release(struct kobject *kobj) |
| 600 | { | 590 | { |
| 601 | pr_debug("kobject: (%p): %s\n", kobj, __FUNCTION__); | 591 | pr_debug("kobject: (%p): %s\n", kobj, __func__); |
| 602 | kfree(kobj); | 592 | kfree(kobj); |
| 603 | } | 593 | } |
| 604 | 594 | ||
| @@ -655,7 +645,7 @@ struct kobject *kobject_create_and_add(const char *name, struct kobject *parent) | |||
| 655 | retval = kobject_add(kobj, parent, "%s", name); | 645 | retval = kobject_add(kobj, parent, "%s", name); |
| 656 | if (retval) { | 646 | if (retval) { |
| 657 | printk(KERN_WARNING "%s: kobject_add error: %d\n", | 647 | printk(KERN_WARNING "%s: kobject_add error: %d\n", |
| 658 | __FUNCTION__, retval); | 648 | __func__, retval); |
| 659 | kobject_put(kobj); | 649 | kobject_put(kobj); |
| 660 | kobj = NULL; | 650 | kobj = NULL; |
| 661 | } | 651 | } |
| @@ -745,12 +735,11 @@ void kset_unregister(struct kset *k) | |||
| 745 | */ | 735 | */ |
| 746 | struct kobject *kset_find_obj(struct kset *kset, const char *name) | 736 | struct kobject *kset_find_obj(struct kset *kset, const char *name) |
| 747 | { | 737 | { |
| 748 | struct list_head *entry; | 738 | struct kobject *k; |
| 749 | struct kobject *ret = NULL; | 739 | struct kobject *ret = NULL; |
| 750 | 740 | ||
| 751 | spin_lock(&kset->list_lock); | 741 | spin_lock(&kset->list_lock); |
| 752 | list_for_each(entry, &kset->list) { | 742 | list_for_each_entry(k, &kset->list, entry) { |
| 753 | struct kobject *k = to_kobj(entry); | ||
| 754 | if (kobject_name(k) && !strcmp(kobject_name(k), name)) { | 743 | if (kobject_name(k) && !strcmp(kobject_name(k), name)) { |
| 755 | ret = kobject_get(k); | 744 | ret = kobject_get(k); |
| 756 | break; | 745 | break; |
| @@ -764,7 +753,7 @@ static void kset_release(struct kobject *kobj) | |||
| 764 | { | 753 | { |
| 765 | struct kset *kset = container_of(kobj, struct kset, kobj); | 754 | struct kset *kset = container_of(kobj, struct kset, kobj); |
| 766 | pr_debug("kobject: '%s' (%p): %s\n", | 755 | pr_debug("kobject: '%s' (%p): %s\n", |
| 767 | kobject_name(kobj), kobj, __FUNCTION__); | 756 | kobject_name(kobj), kobj, __func__); |
| 768 | kfree(kset); | 757 | kfree(kset); |
| 769 | } | 758 | } |
| 770 | 759 | ||
