aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@parallels.com>2010-09-27 05:58:42 -0400
committerJ. Bruce Fields <bfields@redhat.com>2010-09-27 10:16:11 -0400
commite3bfca01c1ad378deaee598292bcc7ee19024563 (patch)
treebc4a89934cfb309f3d835917257e17e5d5236c6c
parentbf18ab32ff2a50a3d13d559f26f94ecfba131f24 (diff)
sunrpc: Make xprt auth cache release work with the xprt
This is done in order to facilitate getting the ip_map_cache from which to put the ip_map. Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
-rw-r--r--include/linux/sunrpc/svcauth.h3
-rw-r--r--net/sunrpc/svc_xprt.c5
-rw-r--r--net/sunrpc/svcauth_unix.c9
3 files changed, 10 insertions, 7 deletions
diff --git a/include/linux/sunrpc/svcauth.h b/include/linux/sunrpc/svcauth.h
index 11266935e2d6..18bce95255a4 100644
--- a/include/linux/sunrpc/svcauth.h
+++ b/include/linux/sunrpc/svcauth.h
@@ -116,6 +116,7 @@ struct auth_ops {
116#define SVC_PENDING 9 116#define SVC_PENDING 9
117#define SVC_COMPLETE 10 117#define SVC_COMPLETE 10
118 118
119struct svc_xprt;
119 120
120extern int svc_authenticate(struct svc_rqst *rqstp, __be32 *authp); 121extern int svc_authenticate(struct svc_rqst *rqstp, __be32 *authp);
121extern int svc_authorise(struct svc_rqst *rqstp); 122extern int svc_authorise(struct svc_rqst *rqstp);
@@ -131,7 +132,7 @@ extern struct auth_domain *auth_domain_find(char *name);
131extern struct auth_domain *auth_unix_lookup(struct in6_addr *addr); 132extern struct auth_domain *auth_unix_lookup(struct in6_addr *addr);
132extern int auth_unix_forget_old(struct auth_domain *dom); 133extern int auth_unix_forget_old(struct auth_domain *dom);
133extern void svcauth_unix_purge(void); 134extern void svcauth_unix_purge(void);
134extern void svcauth_unix_info_release(void *); 135extern void svcauth_unix_info_release(struct svc_xprt *xpt);
135extern int svcauth_unix_set_client(struct svc_rqst *rqstp); 136extern int svcauth_unix_set_client(struct svc_rqst *rqstp);
136 137
137static inline unsigned long hash_str(char *name, int bits) 138static inline unsigned long hash_str(char *name, int bits)
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
index 95fc3e8c51d6..385d822419ca 100644
--- a/net/sunrpc/svc_xprt.c
+++ b/net/sunrpc/svc_xprt.c
@@ -128,9 +128,8 @@ static void svc_xprt_free(struct kref *kref)
128 struct svc_xprt *xprt = 128 struct svc_xprt *xprt =
129 container_of(kref, struct svc_xprt, xpt_ref); 129 container_of(kref, struct svc_xprt, xpt_ref);
130 struct module *owner = xprt->xpt_class->xcl_owner; 130 struct module *owner = xprt->xpt_class->xcl_owner;
131 if (test_bit(XPT_CACHE_AUTH, &xprt->xpt_flags) && 131 if (test_bit(XPT_CACHE_AUTH, &xprt->xpt_flags))
132 xprt->xpt_auth_cache != NULL) 132 svcauth_unix_info_release(xprt);
133 svcauth_unix_info_release(xprt->xpt_auth_cache);
134 xprt->xpt_ops->xpo_free(xprt); 133 xprt->xpt_ops->xpo_free(xprt);
135 module_put(owner); 134 module_put(owner);
136} 135}
diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c
index 31b99c599e7e..49e39ff22910 100644
--- a/net/sunrpc/svcauth_unix.c
+++ b/net/sunrpc/svcauth_unix.c
@@ -472,10 +472,13 @@ ip_map_cached_put(struct svc_rqst *rqstp, struct ip_map *ipm)
472} 472}
473 473
474void 474void
475svcauth_unix_info_release(void *info) 475svcauth_unix_info_release(struct svc_xprt *xpt)
476{ 476{
477 struct ip_map *ipm = info; 477 struct ip_map *ipm;
478 cache_put(&ipm->h, &ip_map_cache); 478
479 ipm = xpt->xpt_auth_cache;
480 if (ipm != NULL)
481 cache_put(&ipm->h, &ip_map_cache);
479} 482}
480 483
481/**************************************************************************** 484/****************************************************************************