X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=lib%2Fkref.c;h=6d19f690380b8e3020b3a74e8fac3d2713055d0e;hb=01bf0b64579ead8a82e7cfc32ae44bc667e7ad0f;hp=0d07cc31c818108a5d9e3bc26444957108bad721;hpb=f334b60b43a0927f4ab1187cbdb4582f5227c3b1;p=safe%2Fjmp%2Flinux-2.6 diff --git a/lib/kref.c b/lib/kref.c index 0d07cc3..6d19f69 100644 --- a/lib/kref.c +++ b/lib/kref.c @@ -13,6 +13,18 @@ #include #include +#include + +/** + * kref_set - initialize object and set refcount to requested number. + * @kref: object in question. + * @num: initial reference counter + */ +void kref_set(struct kref *kref, int num) +{ + atomic_set(&kref->refcount, num); + smp_mb(); +} /** * kref_init - initialize object. @@ -20,7 +32,7 @@ */ void kref_init(struct kref *kref) { - atomic_set(&kref->refcount,1); + kref_set(kref, 1); } /** @@ -31,6 +43,7 @@ void kref_get(struct kref *kref) { WARN_ON(!atomic_read(&kref->refcount)); atomic_inc(&kref->refcount); + smp_mb__after_atomic_inc(); } /** @@ -59,6 +72,7 @@ int kref_put(struct kref *kref, void (*release)(struct kref *kref)) return 0; } +EXPORT_SYMBOL(kref_set); EXPORT_SYMBOL(kref_init); EXPORT_SYMBOL(kref_get); EXPORT_SYMBOL(kref_put);