xprtrdma: Support IPv6 in xprt_rdma_set_port
authorChuck Lever <chuck.lever@oracle.com>
Fri, 15 Dec 2017 01:57:06 +0000 (20:57 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 16 Jan 2018 16:19:46 +0000 (11:19 -0500)
Clean up a harmless oversight. xprtrdma's ->set_port method has
never properly supported IPv6.

This issue has never been a problem because NFS/RDMA mounts have
always required "port=20049", thus so far, rpcbind is not invoked
for these mounts.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/transport.c

index 8ba0aa8c566f98b845beb9c4150e1bde93324bca..cebcd027d085bab1bda9dbda1c45e4c0f9c30d6b 100644 (file)
@@ -474,14 +474,34 @@ xprt_rdma_close(struct rpc_xprt *xprt)
        rpcrdma_ep_disconnect(ep, ia);
 }
 
+/**
+ * xprt_rdma_set_port - update server port with rpcbind result
+ * @xprt: controlling RPC transport
+ * @port: new port value
+ *
+ * Transport connect status is unchanged.
+ */
 static void
 xprt_rdma_set_port(struct rpc_xprt *xprt, u16 port)
 {
-       struct sockaddr_in *sap;
+       struct sockaddr *sap = (struct sockaddr *)&xprt->addr;
+       char buf[8];
+
+       dprintk("RPC:       %s: setting port for xprt %p (%s:%s) to %u\n",
+               __func__, xprt,
+               xprt->address_strings[RPC_DISPLAY_ADDR],
+               xprt->address_strings[RPC_DISPLAY_PORT],
+               port);
+
+       rpc_set_port(sap, port);
 
-       sap = (struct sockaddr_in *)&xprt->addr;
-       sap->sin_port = htons(port);
-       dprintk("RPC:       %s: %u\n", __func__, port);
+       kfree(xprt->address_strings[RPC_DISPLAY_PORT]);
+       snprintf(buf, sizeof(buf), "%u", port);
+       xprt->address_strings[RPC_DISPLAY_PORT] = kstrdup(buf, GFP_KERNEL);
+
+       kfree(xprt->address_strings[RPC_DISPLAY_HEX_PORT]);
+       snprintf(buf, sizeof(buf), "%4hx", port);
+       xprt->address_strings[RPC_DISPLAY_HEX_PORT] = kstrdup(buf, GFP_KERNEL);
 }
 
 /**