diff options
Diffstat (limited to 'net/sunrpc/svc_xprt.c')
-rw-r--r-- | net/sunrpc/svc_xprt.c | 31 |
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 | } |
146 | EXPORT_SYMBOL_GPL(svc_create_xprt); | 146 | EXPORT_SYMBOL_GPL(svc_create_xprt); |
147 | |||
148 | /* | ||
149 | * Copy the local and remote xprt addresses to the rqstp structure | ||
150 | */ | ||
151 | void 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 | } | ||
172 | EXPORT_SYMBOL_GPL(svc_xprt_copy_addrs); | ||
173 | |||