Commit a4a3ec32 authored by Jeff Layton's avatar Jeff Layton Committed by J. Bruce Fields

nfsd: break out hashtable search into separate function

Later, we'll need more than one call site for this, so break it out
into a new function.
Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent d1a0774d
...@@ -149,6 +149,35 @@ nfsd_cache_entry_expired(struct svc_cacherep *rp) ...@@ -149,6 +149,35 @@ nfsd_cache_entry_expired(struct svc_cacherep *rp)
time_after(jiffies, rp->c_timestamp + RC_EXPIRE); time_after(jiffies, rp->c_timestamp + RC_EXPIRE);
} }
/*
* Search the request hash for an entry that matches the given rqstp.
* Must be called with cache_lock held. Returns the found entry or
* NULL on failure.
*/
static struct svc_cacherep *
nfsd_cache_search(struct svc_rqst *rqstp)
{
struct svc_cacherep *rp;
struct hlist_node *hn;
struct hlist_head *rh;
__be32 xid = rqstp->rq_xid;
u32 proto = rqstp->rq_prot,
vers = rqstp->rq_vers,
proc = rqstp->rq_proc;
rh = &cache_hash[request_hash(xid)];
hlist_for_each_entry(rp, hn, rh, c_hash) {
if (rp->c_state != RC_UNUSED &&
xid == rp->c_xid && proc == rp->c_proc &&
proto == rp->c_prot && vers == rp->c_vers &&
!nfsd_cache_entry_expired(rp) &&
rpc_cmp_addr(svc_addr(rqstp), (struct sockaddr *)&rp->c_addr) &&
rpc_get_port(svc_addr(rqstp)) == rpc_get_port((struct sockaddr *)&rp->c_addr))
return rp;
}
return NULL;
}
/* /*
* Try to find an entry matching the current call in the cache. When none * Try to find an entry matching the current call in the cache. When none
* is found, we grab the oldest unlocked entry off the LRU list. * is found, we grab the oldest unlocked entry off the LRU list.
...@@ -157,8 +186,6 @@ nfsd_cache_entry_expired(struct svc_cacherep *rp) ...@@ -157,8 +186,6 @@ nfsd_cache_entry_expired(struct svc_cacherep *rp)
int int
nfsd_cache_lookup(struct svc_rqst *rqstp) nfsd_cache_lookup(struct svc_rqst *rqstp)
{ {
struct hlist_node *hn;
struct hlist_head *rh;
struct svc_cacherep *rp; struct svc_cacherep *rp;
__be32 xid = rqstp->rq_xid; __be32 xid = rqstp->rq_xid;
u32 proto = rqstp->rq_prot, u32 proto = rqstp->rq_prot,
...@@ -177,18 +204,11 @@ nfsd_cache_lookup(struct svc_rqst *rqstp) ...@@ -177,18 +204,11 @@ nfsd_cache_lookup(struct svc_rqst *rqstp)
spin_lock(&cache_lock); spin_lock(&cache_lock);
rtn = RC_DOIT; rtn = RC_DOIT;
rh = &cache_hash[request_hash(xid)]; rp = nfsd_cache_search(rqstp);
hlist_for_each_entry(rp, hn, rh, c_hash) { if (rp) {
if (rp->c_state != RC_UNUSED &&
xid == rp->c_xid && proc == rp->c_proc &&
proto == rp->c_prot && vers == rp->c_vers &&
!nfsd_cache_entry_expired(rp) &&
rpc_cmp_addr(svc_addr(rqstp), (struct sockaddr *)&rp->c_addr) &&
rpc_get_port(svc_addr(rqstp)) == rpc_get_port((struct sockaddr *)&rp->c_addr)) {
nfsdstats.rchits++; nfsdstats.rchits++;
goto found_entry; goto found_entry;
} }
}
nfsdstats.rcmisses++; nfsdstats.rcmisses++;
/* This loop shouldn't take more than a few iterations normally */ /* This loop shouldn't take more than a few iterations normally */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment