summaryrefslogtreecommitdiffstats
path: root/lib/kref.c
diff options
context:
space:
mode:
authorAnton Altaparmakov <aia21@cantab.net>2006-03-23 14:50:51 +0000
committerAnton Altaparmakov <aia21@cantab.net>2006-03-23 14:50:51 +0000
commitb4d8d1a93c6ea042b29bb66fbb1cf6bc556c18f7 (patch)
tree030ef62361042d1a034087ad9a726db3b57bba72 /lib/kref.c
parentbb8047d3540affd6b8c2adac3fe792e07143be0f (diff)
parent2e6e33bab6e1996a5dec9108fb467b52b841e7a8 (diff)
downloadkernel-crypto-b4d8d1a93c6ea042b29bb66fbb1cf6bc556c18f7.tar.gz
kernel-crypto-b4d8d1a93c6ea042b29bb66fbb1cf6bc556c18f7.tar.xz
kernel-crypto-b4d8d1a93c6ea042b29bb66fbb1cf6bc556c18f7.zip
Merge branch 'master' of /usr/src/ntfs-2.6/
Diffstat (limited to 'lib/kref.c')
-rw-r--r--lib/kref.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/kref.c b/lib/kref.c
index 0d07cc31c81..4a467faf136 100644
--- a/lib/kref.c
+++ b/lib/kref.c
@@ -52,7 +52,12 @@ int kref_put(struct kref *kref, void (*release)(struct kref *kref))
WARN_ON(release == NULL);
WARN_ON(release == (void (*)(struct kref *))kfree);
- if (atomic_dec_and_test(&kref->refcount)) {
+ /*
+ * if current count is one, we are the last user and can release object
+ * right now, avoiding an atomic operation on 'refcount'
+ */
+ if ((atomic_read(&kref->refcount) == 1) ||
+ (atomic_dec_and_test(&kref->refcount))) {
release(kref);
return 1;
}