[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:

committed by
Linus Torvalds

orang tua
ebd0cb1af3
melakukan
baab935ff3
@@ -89,13 +89,11 @@ static void rsi_free(struct rsi *rsii)
|
||||
kfree(rsii->out_token.data);
|
||||
}
|
||||
|
||||
static void rsi_put(struct cache_head *item, struct cache_detail *cd)
|
||||
static void rsi_put(struct kref *ref)
|
||||
{
|
||||
struct rsi *rsii = container_of(item, struct rsi, h);
|
||||
if (cache_put(item, cd)) {
|
||||
rsi_free(rsii);
|
||||
kfree(rsii);
|
||||
}
|
||||
struct rsi *rsii = container_of(ref, struct rsi, h.ref);
|
||||
rsi_free(rsii);
|
||||
kfree(rsii);
|
||||
}
|
||||
|
||||
static inline int rsi_hash(struct rsi *item)
|
||||
@@ -267,7 +265,7 @@ static int rsi_parse(struct cache_detail *cd,
|
||||
out:
|
||||
rsi_free(&rsii);
|
||||
if (rsip)
|
||||
rsi_put(&rsip->h, &rsi_cache);
|
||||
cache_put(&rsip->h, &rsi_cache);
|
||||
else
|
||||
status = -ENOMEM;
|
||||
return status;
|
||||
@@ -357,14 +355,12 @@ static void rsc_free(struct rsc *rsci)
|
||||
put_group_info(rsci->cred.cr_group_info);
|
||||
}
|
||||
|
||||
static void rsc_put(struct cache_head *item, struct cache_detail *cd)
|
||||
static void rsc_put(struct kref *ref)
|
||||
{
|
||||
struct rsc *rsci = container_of(item, struct rsc, h);
|
||||
struct rsc *rsci = container_of(ref, struct rsc, h.ref);
|
||||
|
||||
if (cache_put(item, cd)) {
|
||||
rsc_free(rsci);
|
||||
kfree(rsci);
|
||||
}
|
||||
rsc_free(rsci);
|
||||
kfree(rsci);
|
||||
}
|
||||
|
||||
static inline int
|
||||
@@ -509,7 +505,7 @@ static int rsc_parse(struct cache_detail *cd,
|
||||
out:
|
||||
rsc_free(&rsci);
|
||||
if (rscp)
|
||||
rsc_put(&rscp->h, &rsc_cache);
|
||||
cache_put(&rscp->h, &rsc_cache);
|
||||
else
|
||||
status = -ENOMEM;
|
||||
return status;
|
||||
@@ -1076,7 +1072,7 @@ drop:
|
||||
ret = SVC_DROP;
|
||||
out:
|
||||
if (rsci)
|
||||
rsc_put(&rsci->h, &rsc_cache);
|
||||
cache_put(&rsci->h, &rsc_cache);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1168,7 +1164,7 @@ out_err:
|
||||
put_group_info(rqstp->rq_cred.cr_group_info);
|
||||
rqstp->rq_cred.cr_group_info = NULL;
|
||||
if (gsd->rsci)
|
||||
rsc_put(&gsd->rsci->h, &rsc_cache);
|
||||
cache_put(&gsd->rsci->h, &rsc_cache);
|
||||
gsd->rsci = NULL;
|
||||
|
||||
return stat;
|
||||
|
@@ -42,7 +42,7 @@ void cache_init(struct cache_head *h)
|
||||
time_t now = get_seconds();
|
||||
h->next = NULL;
|
||||
h->flags = 0;
|
||||
atomic_set(&h->refcnt, 1);
|
||||
kref_init(&h->ref);
|
||||
h->expiry_time = now + CACHE_NEW_EXPIRY;
|
||||
h->last_refresh = now;
|
||||
}
|
||||
@@ -81,7 +81,7 @@ struct cache_head *sunrpc_cache_lookup(struct cache_detail *detail,
|
||||
if (detail->match(tmp, key)) {
|
||||
cache_get(tmp);
|
||||
write_unlock(&detail->hash_lock);
|
||||
detail->cache_put(new, detail);
|
||||
cache_put(new, detail);
|
||||
return tmp;
|
||||
}
|
||||
}
|
||||
@@ -145,7 +145,7 @@ struct cache_head *sunrpc_cache_update(struct cache_detail *detail,
|
||||
/* We need to insert a new entry */
|
||||
tmp = detail->alloc();
|
||||
if (!tmp) {
|
||||
detail->cache_put(old, detail);
|
||||
cache_put(old, detail);
|
||||
return NULL;
|
||||
}
|
||||
cache_init(tmp);
|
||||
@@ -165,7 +165,7 @@ struct cache_head *sunrpc_cache_update(struct cache_detail *detail,
|
||||
write_unlock(&detail->hash_lock);
|
||||
cache_fresh_unlocked(tmp, detail, is_new);
|
||||
cache_fresh_unlocked(old, detail, 0);
|
||||
detail->cache_put(old, detail);
|
||||
cache_put(old, detail);
|
||||
return tmp;
|
||||
}
|
||||
EXPORT_SYMBOL(sunrpc_cache_update);
|
||||
@@ -234,7 +234,7 @@ int cache_check(struct cache_detail *detail,
|
||||
cache_defer_req(rqstp, h);
|
||||
|
||||
if (rv)
|
||||
detail->cache_put(h, detail);
|
||||
cache_put(h, detail);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -431,7 +431,7 @@ static int cache_clean(void)
|
||||
if (test_and_clear_bit(CACHE_PENDING, &ch->flags))
|
||||
queue_loose(current_detail, ch);
|
||||
|
||||
if (atomic_read(&ch->refcnt) == 1)
|
||||
if (atomic_read(&ch->ref.refcount) == 1)
|
||||
break;
|
||||
}
|
||||
if (ch) {
|
||||
@@ -446,7 +446,7 @@ static int cache_clean(void)
|
||||
current_index ++;
|
||||
spin_unlock(&cache_list_lock);
|
||||
if (ch)
|
||||
d->cache_put(ch, d);
|
||||
cache_put(ch, d);
|
||||
} else
|
||||
spin_unlock(&cache_list_lock);
|
||||
|
||||
@@ -723,7 +723,7 @@ cache_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
|
||||
!test_bit(CACHE_PENDING, &rq->item->flags)) {
|
||||
list_del(&rq->q.list);
|
||||
spin_unlock(&queue_lock);
|
||||
cd->cache_put(rq->item, cd);
|
||||
cache_put(rq->item, cd);
|
||||
kfree(rq->buf);
|
||||
kfree(rq);
|
||||
} else
|
||||
@@ -906,7 +906,7 @@ static void queue_loose(struct cache_detail *detail, struct cache_head *ch)
|
||||
continue;
|
||||
list_del(&cr->q.list);
|
||||
spin_unlock(&queue_lock);
|
||||
detail->cache_put(cr->item, detail);
|
||||
cache_put(cr->item, detail);
|
||||
kfree(cr->buf);
|
||||
kfree(cr);
|
||||
return;
|
||||
@@ -1192,7 +1192,7 @@ static int c_show(struct seq_file *m, void *p)
|
||||
|
||||
ifdebug(CACHE)
|
||||
seq_printf(m, "# expiry=%ld refcnt=%d flags=%lx\n",
|
||||
cp->expiry_time, atomic_read(&cp->refcnt), cp->flags);
|
||||
cp->expiry_time, atomic_read(&cp->ref.refcount), cp->flags);
|
||||
cache_get(cp);
|
||||
if (cache_check(cd, cp, NULL))
|
||||
/* cache_check does a cache_put on failure */
|
||||
|
@@ -84,15 +84,15 @@ struct ip_map {
|
||||
};
|
||||
static struct cache_head *ip_table[IP_HASHMAX];
|
||||
|
||||
static void ip_map_put(struct cache_head *item, struct cache_detail *cd)
|
||||
static void ip_map_put(struct kref *kref)
|
||||
{
|
||||
struct cache_head *item = container_of(kref, struct cache_head, ref);
|
||||
struct ip_map *im = container_of(item, struct ip_map,h);
|
||||
if (cache_put(item, cd)) {
|
||||
if (test_bit(CACHE_VALID, &item->flags) &&
|
||||
!test_bit(CACHE_NEGATIVE, &item->flags))
|
||||
auth_domain_put(&im->m_client->h);
|
||||
kfree(im);
|
||||
}
|
||||
|
||||
if (test_bit(CACHE_VALID, &item->flags) &&
|
||||
!test_bit(CACHE_NEGATIVE, &item->flags))
|
||||
auth_domain_put(&im->m_client->h);
|
||||
kfree(im);
|
||||
}
|
||||
|
||||
#if IP_HASHBITS == 8
|
||||
@@ -315,7 +315,7 @@ static int ip_map_update(struct ip_map *ipm, struct unix_domain *udom, time_t ex
|
||||
hash_ip((unsigned long)ipm->m_addr.s_addr));
|
||||
if (!ch)
|
||||
return -ENOMEM;
|
||||
ip_map_put(ch, &ip_map_cache);
|
||||
cache_put(ch, &ip_map_cache);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -369,7 +369,7 @@ struct auth_domain *auth_unix_lookup(struct in_addr addr)
|
||||
rv = &ipm->m_client->h;
|
||||
kref_get(&rv->ref);
|
||||
}
|
||||
ip_map_put(&ipm->h, &ip_map_cache);
|
||||
cache_put(&ipm->h, &ip_map_cache);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -403,7 +403,7 @@ svcauth_unix_set_client(struct svc_rqst *rqstp)
|
||||
case 0:
|
||||
rqstp->rq_client = &ipm->m_client->h;
|
||||
kref_get(&rqstp->rq_client->ref);
|
||||
ip_map_put(&ipm->h, &ip_map_cache);
|
||||
cache_put(&ipm->h, &ip_map_cache);
|
||||
break;
|
||||
}
|
||||
return SVC_OK;
|
||||
|
Reference in New Issue
Block a user