[PATCH] knfsd: Convert sunrpc_cache to use krefs

.. it makes some of the code nicer.

Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
NeilBrown
2006-03-27 01:15:09 -08:00
committed by Linus Torvalds
parent ebd0cb1af3
commit baab935ff3
8 changed files with 72 additions and 84 deletions

View File

@ -102,13 +102,11 @@ int exp_rootfh(struct auth_domain *,
int exp_pseudoroot(struct auth_domain *, struct svc_fh *fhp, struct cache_req *creq);
int nfserrno(int errno);
extern void expkey_put(struct cache_head *item, struct cache_detail *cd);
extern void svc_export_put(struct cache_head *item, struct cache_detail *cd);
extern struct cache_detail svc_export_cache, svc_expkey_cache;
static inline void exp_put(struct svc_export *exp)
{
svc_export_put(&exp->h, &svc_export_cache);
cache_put(&exp->h, &svc_export_cache);
}
static inline void exp_get(struct svc_export *exp)

View File

@ -50,7 +50,7 @@ struct cache_head {
time_t last_refresh; /* If CACHE_PENDING, this is when upcall
* was sent, else this is when update was received
*/
atomic_t refcnt;
struct kref ref;
unsigned long flags;
};
#define CACHE_VALID 0 /* Entry contains valid data */
@ -68,8 +68,7 @@ struct cache_detail {
atomic_t inuse; /* active user-space update or lookup */
char *name;
void (*cache_put)(struct cache_head *,
struct cache_detail*);
void (*cache_put)(struct kref *);
void (*cache_request)(struct cache_detail *cd,
struct cache_head *h,
@ -151,17 +150,17 @@ extern void cache_clean_deferred(void *owner);
static inline struct cache_head *cache_get(struct cache_head *h)
{
atomic_inc(&h->refcnt);
kref_get(&h->ref);
return h;
}
static inline int cache_put(struct cache_head *h, struct cache_detail *cd)
static inline void cache_put(struct cache_head *h, struct cache_detail *cd)
{
if (atomic_read(&h->refcnt) <= 2 &&
if (atomic_read(&h->ref.refcount) <= 2 &&
h->expiry_time < cd->nextcheck)
cd->nextcheck = h->expiry_time;
return atomic_dec_and_test(&h->refcnt);
kref_put(&h->ref, cd->cache_put);
}
extern void cache_init(struct cache_head *h);