diff options
| author | Paul Mundt <lethal@linux-sh.org> | 2011-01-12 00:37:42 -0500 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2011-01-12 00:37:42 -0500 |
| commit | 83eb95b852902f952ba594447a796ad8146b9462 (patch) | |
| tree | 33c199aeeae58b69ad8d6d2a33c2d96ba2b98ddf /lib | |
| parent | efb3e34b6176d30c4fe8635fa8e1beb6280cc2cd (diff) | |
| parent | 9bbe7b984096ac45586da2adf26c14069ecb79b2 (diff) | |
Merge branch 'sh/sdio' into sh-latest
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/dynamic_debug.c | 9 | ||||
| -rw-r--r-- | lib/kref.c | 30 |
2 files changed, 34 insertions, 5 deletions
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 3094318bfea7..b335acb43be2 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c | |||
| @@ -141,11 +141,10 @@ static void ddebug_change(const struct ddebug_query *query, | |||
| 141 | else if (!dp->flags) | 141 | else if (!dp->flags) |
| 142 | dt->num_enabled++; | 142 | dt->num_enabled++; |
| 143 | dp->flags = newflags; | 143 | dp->flags = newflags; |
| 144 | if (newflags) { | 144 | if (newflags) |
| 145 | jump_label_enable(&dp->enabled); | 145 | dp->enabled = 1; |
| 146 | } else { | 146 | else |
| 147 | jump_label_disable(&dp->enabled); | 147 | dp->enabled = 0; |
| 148 | } | ||
| 149 | if (verbose) | 148 | if (verbose) |
| 150 | printk(KERN_INFO | 149 | printk(KERN_INFO |
| 151 | "ddebug: changed %s:%d [%s]%s %s\n", | 150 | "ddebug: changed %s:%d [%s]%s %s\n", |
diff --git a/lib/kref.c b/lib/kref.c index d3d227a08a4b..3efb882b11db 100644 --- a/lib/kref.c +++ b/lib/kref.c | |||
| @@ -62,6 +62,36 @@ int kref_put(struct kref *kref, void (*release)(struct kref *kref)) | |||
| 62 | return 0; | 62 | return 0; |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | |||
| 66 | /** | ||
| 67 | * kref_sub - subtract a number of refcounts for object. | ||
| 68 | * @kref: object. | ||
| 69 | * @count: Number of recounts to subtract. | ||
| 70 | * @release: pointer to the function that will clean up the object when the | ||
| 71 | * last reference to the object is released. | ||
| 72 | * This pointer is required, and it is not acceptable to pass kfree | ||
| 73 | * in as this function. | ||
| 74 | * | ||
| 75 | * Subtract @count from the refcount, and if 0, call release(). | ||
| 76 | * Return 1 if the object was removed, otherwise return 0. Beware, if this | ||
| 77 | * function returns 0, you still can not count on the kref from remaining in | ||
| 78 | * memory. Only use the return value if you want to see if the kref is now | ||
| 79 | * gone, not present. | ||
| 80 | */ | ||
| 81 | int kref_sub(struct kref *kref, unsigned int count, | ||
| 82 | void (*release)(struct kref *kref)) | ||
| 83 | { | ||
| 84 | WARN_ON(release == NULL); | ||
| 85 | WARN_ON(release == (void (*)(struct kref *))kfree); | ||
| 86 | |||
| 87 | if (atomic_sub_and_test((int) count, &kref->refcount)) { | ||
| 88 | release(kref); | ||
| 89 | return 1; | ||
| 90 | } | ||
| 91 | return 0; | ||
| 92 | } | ||
| 93 | |||
| 65 | EXPORT_SYMBOL(kref_init); | 94 | EXPORT_SYMBOL(kref_init); |
| 66 | EXPORT_SYMBOL(kref_get); | 95 | EXPORT_SYMBOL(kref_get); |
| 67 | EXPORT_SYMBOL(kref_put); | 96 | EXPORT_SYMBOL(kref_put); |
| 97 | EXPORT_SYMBOL(kref_sub); | ||
