aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/svc_xprt.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sunrpc/svc_xprt.c')
-rw-r--r--net/sunrpc/svc_xprt.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
index 023aeb0ecfa9..eb650af50c49 100644
--- a/net/sunrpc/svc_xprt.c
+++ b/net/sunrpc/svc_xprt.c
@@ -125,7 +125,6 @@ int svc_create_xprt(struct svc_serv *serv, char *xprt_name, unsigned short port,
125 spin_unlock(&svc_xprt_class_lock); 125 spin_unlock(&svc_xprt_class_lock);
126 if (try_module_get(xcl->xcl_owner)) { 126 if (try_module_get(xcl->xcl_owner)) {
127 struct svc_xprt *newxprt; 127 struct svc_xprt *newxprt;
128 ret = 0;
129 newxprt = xcl->xcl_ops->xpo_create 128 newxprt = xcl->xcl_ops->xpo_create
130 (serv, 129 (serv,
131 (struct sockaddr *)&sin, sizeof(sin), 130 (struct sockaddr *)&sin, sizeof(sin),
@@ -133,7 +132,8 @@ int svc_create_xprt(struct svc_serv *serv, char *xprt_name, unsigned short port,
133 if (IS_ERR(newxprt)) { 132 if (IS_ERR(newxprt)) {
134 module_put(xcl->xcl_owner); 133 module_put(xcl->xcl_owner);
135 ret = PTR_ERR(newxprt); 134 ret = PTR_ERR(newxprt);
136 } 135 } else
136 ret = svc_xprt_local_port(newxprt);
137 } 137 }
138 goto out; 138 goto out;
139 } 139 }
@@ -144,3 +144,30 @@ int svc_create_xprt(struct svc_serv *serv, char *xprt_name, unsigned short port,
144 return ret; 144 return ret;
145} 145}
146EXPORT_SYMBOL_GPL(svc_create_xprt); 146EXPORT_SYMBOL_GPL(svc_create_xprt);
147
148/*
149 * Copy the local and remote xprt addresses to the rqstp structure
150 */
151void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt)
152{
153 struct sockaddr *sin;
154
155 memcpy(&rqstp->rq_addr, &xprt->xpt_remote, xprt->xpt_remotelen);
156 rqstp->rq_addrlen = xprt->xpt_remotelen;
157
158 /*
159 * Destination address in request is needed for binding the
160 * source address in RPC replies/callbacks later.
161 */
162 sin = (struct sockaddr *)&xprt->xpt_local;
163 switch (sin->sa_family) {
164 case AF_INET:
165 rqstp->rq_daddr.addr = ((struct sockaddr_in *)sin)->sin_addr;
166 break;
167 case AF_INET6:
168 rqstp->rq_daddr.addr6 = ((struct sockaddr_in6 *)sin)->sin6_addr;
169 break;
170 }
171}
172EXPORT_SYMBOL_GPL(svc_xprt_copy_addrs);
173