pnfs/NFSv4.1: Add multipath capabilities to pNFS flexfiles servers over NFSv3
authorTrond Myklebust <trond.myklebust@primarydata.com>
Sun, 31 Jan 2016 19:53:08 +0000 (14:53 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Fri, 5 Feb 2016 23:48:57 +0000 (18:48 -0500)
This adds multipathing to pNFS over NFSv3 as described in the flexfiles
draft spec.
Ideally, we'd like to do the same for pNFS files, but the NFSv4.1 protocol
requires a call to EXCHANGE_ID in order to test that the connection can do
session trunking.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/pnfs_nfs.c

index 81ac648..4aaed89 100644 (file)
@@ -606,12 +606,22 @@ static int _nfs4_pnfs_v3_ds_connect(struct nfs_server *mds_srv,
                dprintk("%s: DS %s: trying address %s\n",
                        __func__, ds->ds_remotestr, da->da_remotestr);
 
-               clp = get_v3_ds_connect(mds_srv->nfs_client,
+               if (!IS_ERR(clp)) {
+                       struct xprt_create xprt_args = {
+                               .ident = XPRT_TRANSPORT_TCP,
+                               .net = clp->cl_net,
+                               .dstaddr = (struct sockaddr *)&da->da_addr,
+                               .addrlen = da->da_addrlen,
+                               .servername = clp->cl_hostname,
+                       };
+                       /* Add this address as an alias */
+                       rpc_clnt_add_xprt(clp->cl_rpcclient, &xprt_args,
+                                       rpc_clnt_test_and_add_xprt, NULL);
+               } else
+                       clp = get_v3_ds_connect(mds_srv->nfs_client,
                                        (struct sockaddr *)&da->da_addr,
                                        da->da_addrlen, IPPROTO_TCP,
                                        timeo, retrans, au_flavor);
-               if (!IS_ERR(clp))
-                       break;
        }
 
        if (IS_ERR(clp)) {