aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2015-08-03 13:02:41 -0400
committerAnna Schumaker <Anna.Schumaker@Netapp.com>2015-08-05 16:21:26 -0400
commit5231eb9773c61a2a17590eabcadf4aecf44100bd (patch)
tree824c396307b3b3b87102195b5c0ff52f67767dbe
parent74d33293e467df61de1b1d8b2fbe29e550dec33b (diff)
xprtrdma: Make xprt_setup_rdma() agnostic to family of server address
In particular, recognize when an IPv6 connection is bound. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Tested-by: Devesh Sharma <devesh.sharma@avagotech.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
-rw-r--r--net/sunrpc/xprtrdma/transport.c28
1 files changed, 11 insertions, 17 deletions
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c
index 680f888a9ddd..d737300ebc42 100644
--- a/net/sunrpc/xprtrdma/transport.c
+++ b/net/sunrpc/xprtrdma/transport.c
@@ -175,10 +175,8 @@ xprt_rdma_format_addresses6(struct rpc_xprt *xprt, struct sockaddr *sap)
175} 175}
176 176
177static void 177static void
178xprt_rdma_format_addresses(struct rpc_xprt *xprt) 178xprt_rdma_format_addresses(struct rpc_xprt *xprt, struct sockaddr *sap)
179{ 179{
180 struct sockaddr *sap = (struct sockaddr *)
181 &rpcx_to_rdmad(xprt).addr;
182 char buf[128]; 180 char buf[128];
183 181
184 switch (sap->sa_family) { 182 switch (sap->sa_family) {
@@ -302,7 +300,7 @@ xprt_setup_rdma(struct xprt_create *args)
302 struct rpc_xprt *xprt; 300 struct rpc_xprt *xprt;
303 struct rpcrdma_xprt *new_xprt; 301 struct rpcrdma_xprt *new_xprt;
304 struct rpcrdma_ep *new_ep; 302 struct rpcrdma_ep *new_ep;
305 struct sockaddr_in *sin; 303 struct sockaddr *sap;
306 int rc; 304 int rc;
307 305
308 if (args->addrlen > sizeof(xprt->addr)) { 306 if (args->addrlen > sizeof(xprt->addr)) {
@@ -333,26 +331,20 @@ xprt_setup_rdma(struct xprt_create *args)
333 * Set up RDMA-specific connect data. 331 * Set up RDMA-specific connect data.
334 */ 332 */
335 333
336 /* Put server RDMA address in local cdata */ 334 sap = (struct sockaddr *)&cdata.addr;
337 memcpy(&cdata.addr, args->dstaddr, args->addrlen); 335 memcpy(sap, args->dstaddr, args->addrlen);
338 336
339 /* Ensure xprt->addr holds valid server TCP (not RDMA) 337 /* Ensure xprt->addr holds valid server TCP (not RDMA)
340 * address, for any side protocols which peek at it */ 338 * address, for any side protocols which peek at it */
341 xprt->prot = IPPROTO_TCP; 339 xprt->prot = IPPROTO_TCP;
342 xprt->addrlen = args->addrlen; 340 xprt->addrlen = args->addrlen;
343 memcpy(&xprt->addr, &cdata.addr, xprt->addrlen); 341 memcpy(&xprt->addr, sap, xprt->addrlen);
344 342
345 sin = (struct sockaddr_in *)&cdata.addr; 343 if (rpc_get_port(sap))
346 if (ntohs(sin->sin_port) != 0)
347 xprt_set_bound(xprt); 344 xprt_set_bound(xprt);
348 345
349 dprintk("RPC: %s: %pI4:%u\n",
350 __func__, &sin->sin_addr.s_addr, ntohs(sin->sin_port));
351
352 /* Set max requests */
353 cdata.max_requests = xprt->max_reqs; 346 cdata.max_requests = xprt->max_reqs;
354 347
355 /* Set some length limits */
356 cdata.rsize = RPCRDMA_MAX_SEGS * PAGE_SIZE; /* RDMA write max */ 348 cdata.rsize = RPCRDMA_MAX_SEGS * PAGE_SIZE; /* RDMA write max */
357 cdata.wsize = RPCRDMA_MAX_SEGS * PAGE_SIZE; /* RDMA read max */ 349 cdata.wsize = RPCRDMA_MAX_SEGS * PAGE_SIZE; /* RDMA read max */
358 350
@@ -375,8 +367,7 @@ xprt_setup_rdma(struct xprt_create *args)
375 367
376 new_xprt = rpcx_to_rdmax(xprt); 368 new_xprt = rpcx_to_rdmax(xprt);
377 369
378 rc = rpcrdma_ia_open(new_xprt, (struct sockaddr *) &cdata.addr, 370 rc = rpcrdma_ia_open(new_xprt, sap, xprt_rdma_memreg_strategy);
379 xprt_rdma_memreg_strategy);
380 if (rc) 371 if (rc)
381 goto out1; 372 goto out1;
382 373
@@ -409,7 +400,7 @@ xprt_setup_rdma(struct xprt_create *args)
409 INIT_DELAYED_WORK(&new_xprt->rx_connect_worker, 400 INIT_DELAYED_WORK(&new_xprt->rx_connect_worker,
410 xprt_rdma_connect_worker); 401 xprt_rdma_connect_worker);
411 402
412 xprt_rdma_format_addresses(xprt); 403 xprt_rdma_format_addresses(xprt, sap);
413 xprt->max_payload = new_xprt->rx_ia.ri_ops->ro_maxpages(new_xprt); 404 xprt->max_payload = new_xprt->rx_ia.ri_ops->ro_maxpages(new_xprt);
414 if (xprt->max_payload == 0) 405 if (xprt->max_payload == 0)
415 goto out4; 406 goto out4;
@@ -420,6 +411,9 @@ xprt_setup_rdma(struct xprt_create *args)
420 if (!try_module_get(THIS_MODULE)) 411 if (!try_module_get(THIS_MODULE))
421 goto out4; 412 goto out4;
422 413
414 dprintk("RPC: %s: %s:%s\n", __func__,
415 xprt->address_strings[RPC_DISPLAY_ADDR],
416 xprt->address_strings[RPC_DISPLAY_PORT]);
423 return xprt; 417 return xprt;
424 418
425out4: 419out4: