diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-21 12:25:15 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-21 12:25:15 -0500 |
commit | 08a4ecee986dd98e86090ff5faac4782b6765aed (patch) | |
tree | 74df5de49f38c432a6a18303b0c6d834fd09028f /lib/kref.c | |
parent | ba93c6297b9cfad5a70b5e5ed13c9dbead6601d3 (diff) | |
parent | b3229087c5e08589cea4f5040dab56f7dc11332a (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6: (23 commits)
[PATCH] sysfs: fix a kobject leak in sysfs_add_link on the error path
[PATCH] sysfs: don't export dir symbols
[PATCH] get_cpu_sysdev() signedness fix
[PATCH] kobject_add_dir
[PATCH] debugfs: Add debugfs_create_blob() helper for exporting binary data
[PATCH] sysfs: fix problem with duplicate sysfs directories and files
[PATCH] Kobject: kobject.h: fix a typo
[PATCH] Kobject: provide better warning messages when people do stupid things
[PATCH] Driver core: add macros notice(), dev_notice()
[PATCH] firmware: fix BUG: in fw_realloc_buffer
[PATCH] sysfs: kzalloc conversion
[PATCH] fix module sysfs files reference counting
[PATCH] add EXPORT_SYMBOL_GPL_FUTURE() to USB subsystem
[PATCH] add EXPORT_SYMBOL_GPL_FUTURE() to RCU subsystem
[PATCH] add EXPORT_SYMBOL_GPL_FUTURE()
[PATCH] Clean up module.c symbol searching logic
[PATCH] kobj_map semaphore to mutex conversion
[PATCH] kref: avoid an atomic operation in kref_put()
[PATCH] handle errors returned by platform_get_irq*()
[PATCH] driver core: platform_get_irq*(): return -ENXIO on error
...
Diffstat (limited to 'lib/kref.c')
-rw-r--r-- | lib/kref.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/kref.c b/lib/kref.c index 0d07cc31c818..4a467faf1367 100644 --- a/lib/kref.c +++ b/lib/kref.c | |||
@@ -52,7 +52,12 @@ int kref_put(struct kref *kref, void (*release)(struct kref *kref)) | |||
52 | WARN_ON(release == NULL); | 52 | WARN_ON(release == NULL); |
53 | WARN_ON(release == (void (*)(struct kref *))kfree); | 53 | WARN_ON(release == (void (*)(struct kref *))kfree); |
54 | 54 | ||
55 | if (atomic_dec_and_test(&kref->refcount)) { | 55 | /* |
56 | * if current count is one, we are the last user and can release object | ||
57 | * right now, avoiding an atomic operation on 'refcount' | ||
58 | */ | ||
59 | if ((atomic_read(&kref->refcount) == 1) || | ||
60 | (atomic_dec_and_test(&kref->refcount))) { | ||
56 | release(kref); | 61 | release(kref); |
57 | return 1; | 62 | return 1; |
58 | } | 63 | } |