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: Jeff Layton <jlayton@redhat.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
d1a0774de6
commit
a4a3ec3291
1 changed files with 33 additions and 13 deletions
|
@ -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)
|
||||||
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,17 +204,10 @@ 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 &&
|
nfsdstats.rchits++;
|
||||||
xid == rp->c_xid && proc == rp->c_proc &&
|
goto found_entry;
|
||||||
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++;
|
|
||||||
goto found_entry;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
nfsdstats.rcmisses++;
|
nfsdstats.rcmisses++;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue