mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-19 21:21:09 +00:00
svc: Move the authinfo cache to svc_xprt.
Move the authinfo cache to svc_xprt. This allows both the TCP and RDMA transports to share this logic. A flag bit is used to determine if auth information is to be cached or not. Previously, this code looked at the transport protocol. I've also changed the spin_lock/unlock logic so that a lock is not taken for transports that are not caching auth info. Signed-off-by: Tom Tucker <tom@opengridcomputing.com> Acked-by: Neil Brown <neilb@suse.de> Reviewed-by: Chuck Lever <chuck.lever@oracle.com> Reviewed-by: Greg Banks <gnb@sgi.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
parent
4bc6c497b2
commit
def13d7401
5 changed files with 49 additions and 40 deletions
|
@ -384,41 +384,45 @@ void svcauth_unix_purge(void)
|
|||
static inline struct ip_map *
|
||||
ip_map_cached_get(struct svc_rqst *rqstp)
|
||||
{
|
||||
struct ip_map *ipm;
|
||||
struct svc_sock *svsk = rqstp->rq_sock;
|
||||
spin_lock(&svsk->sk_lock);
|
||||
ipm = svsk->sk_info_authunix;
|
||||
if (ipm != NULL) {
|
||||
if (!cache_valid(&ipm->h)) {
|
||||
/*
|
||||
* The entry has been invalidated since it was
|
||||
* remembered, e.g. by a second mount from the
|
||||
* same IP address.
|
||||
*/
|
||||
svsk->sk_info_authunix = NULL;
|
||||
spin_unlock(&svsk->sk_lock);
|
||||
cache_put(&ipm->h, &ip_map_cache);
|
||||
return NULL;
|
||||
struct ip_map *ipm = NULL;
|
||||
struct svc_xprt *xprt = rqstp->rq_xprt;
|
||||
|
||||
if (test_bit(XPT_CACHE_AUTH, &xprt->xpt_flags)) {
|
||||
spin_lock(&xprt->xpt_lock);
|
||||
ipm = xprt->xpt_auth_cache;
|
||||
if (ipm != NULL) {
|
||||
if (!cache_valid(&ipm->h)) {
|
||||
/*
|
||||
* The entry has been invalidated since it was
|
||||
* remembered, e.g. by a second mount from the
|
||||
* same IP address.
|
||||
*/
|
||||
xprt->xpt_auth_cache = NULL;
|
||||
spin_unlock(&xprt->xpt_lock);
|
||||
cache_put(&ipm->h, &ip_map_cache);
|
||||
return NULL;
|
||||
}
|
||||
cache_get(&ipm->h);
|
||||
}
|
||||
cache_get(&ipm->h);
|
||||
spin_unlock(&xprt->xpt_lock);
|
||||
}
|
||||
spin_unlock(&svsk->sk_lock);
|
||||
return ipm;
|
||||
}
|
||||
|
||||
static inline void
|
||||
ip_map_cached_put(struct svc_rqst *rqstp, struct ip_map *ipm)
|
||||
{
|
||||
struct svc_sock *svsk = rqstp->rq_sock;
|
||||
struct svc_xprt *xprt = rqstp->rq_xprt;
|
||||
|
||||
spin_lock(&svsk->sk_lock);
|
||||
if (svsk->sk_sock->type == SOCK_STREAM &&
|
||||
svsk->sk_info_authunix == NULL) {
|
||||
/* newly cached, keep the reference */
|
||||
svsk->sk_info_authunix = ipm;
|
||||
ipm = NULL;
|
||||
if (test_bit(XPT_CACHE_AUTH, &xprt->xpt_flags)) {
|
||||
spin_lock(&xprt->xpt_lock);
|
||||
if (xprt->xpt_auth_cache == NULL) {
|
||||
/* newly cached, keep the reference */
|
||||
xprt->xpt_auth_cache = ipm;
|
||||
ipm = NULL;
|
||||
}
|
||||
spin_unlock(&xprt->xpt_lock);
|
||||
}
|
||||
spin_unlock(&svsk->sk_lock);
|
||||
if (ipm)
|
||||
cache_put(&ipm->h, &ip_map_cache);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue