sunrpc: Make xprt auth cache release work with the xprt
authorPavel Emelyanov <xemul@parallels.com>
Mon, 27 Sep 2010 09:58:42 +0000 (13:58 +0400)
committerJ. Bruce Fields <bfields@redhat.com>
Mon, 27 Sep 2010 14:16:11 +0000 (10:16 -0400)
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>
include/linux/sunrpc/svcauth.h
net/sunrpc/svc_xprt.c
net/sunrpc/svcauth_unix.c

index 1126693..18bce95 100644 (file)
@@ -116,6 +116,7 @@ struct auth_ops {
 #define        SVC_PENDING     9
 #define        SVC_COMPLETE    10
 
+struct svc_xprt;
 
 extern int     svc_authenticate(struct svc_rqst *rqstp, __be32 *authp);
 extern int     svc_authorise(struct svc_rqst *rqstp);
@@ -131,7 +132,7 @@ extern struct auth_domain *auth_domain_find(char *name);
 extern struct auth_domain *auth_unix_lookup(struct in6_addr *addr);
 extern int auth_unix_forget_old(struct auth_domain *dom);
 extern void svcauth_unix_purge(void);
-extern void svcauth_unix_info_release(void *);
+extern void svcauth_unix_info_release(struct svc_xprt *xpt);
 extern int svcauth_unix_set_client(struct svc_rqst *rqstp);
 
 static inline unsigned long hash_str(char *name, int bits)
index 95fc3e8..385d822 100644 (file)
@@ -128,9 +128,8 @@ static void svc_xprt_free(struct kref *kref)
        struct svc_xprt *xprt =
                container_of(kref, struct svc_xprt, xpt_ref);
        struct module *owner = xprt->xpt_class->xcl_owner;
-       if (test_bit(XPT_CACHE_AUTH, &xprt->xpt_flags) &&
-           xprt->xpt_auth_cache != NULL)
-               svcauth_unix_info_release(xprt->xpt_auth_cache);
+       if (test_bit(XPT_CACHE_AUTH, &xprt->xpt_flags))
+               svcauth_unix_info_release(xprt);
        xprt->xpt_ops->xpo_free(xprt);
        module_put(owner);
 }
index 31b99c5..49e39ff 100644 (file)
@@ -472,10 +472,13 @@ ip_map_cached_put(struct svc_rqst *rqstp, struct ip_map *ipm)
 }
 
 void
-svcauth_unix_info_release(void *info)
+svcauth_unix_info_release(struct svc_xprt *xpt)
 {
-       struct ip_map *ipm = info;
-       cache_put(&ipm->h, &ip_map_cache);
+       struct ip_map *ipm;
+
+       ipm = xpt->xpt_auth_cache;
+       if (ipm != NULL)
+               cache_put(&ipm->h, &ip_map_cache);
 }
 
 /****************************************************************************