diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2015-08-03 13:02:41 -0400 |
---|---|---|
committer | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2015-08-05 16:21:26 -0400 |
commit | 5231eb9773c61a2a17590eabcadf4aecf44100bd (patch) | |
tree | 824c396307b3b3b87102195b5c0ff52f67767dbe | |
parent | 74d33293e467df61de1b1d8b2fbe29e550dec33b (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.c | 28 |
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 | ||
177 | static void | 177 | static void |
178 | xprt_rdma_format_addresses(struct rpc_xprt *xprt) | 178 | xprt_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 | ||
425 | out4: | 419 | out4: |