]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
NFS: Enable client side NFSv4.1 backchannel to use other transports
authorChuck Lever <chuck.lever@oracle.com>
Tue, 21 Apr 2015 15:36:37 +0000 (11:36 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 31 Aug 2015 20:46:02 +0000 (14:46 -0600)
[ Proposed for v4.4 ]

Pass the correct backchannel transport class to svc_create_xprt()
when setting up an NFSv4.1 backchannel transport.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfs/callback.c
include/linux/sunrpc/xprt.h
net/sunrpc/xprtrdma/transport.c
net/sunrpc/xprtsock.c

index 8d129bb7355afbb2ca7f1904ff0263f604e86dd6..df57bdcb4d5057b273b8f3387b8e391154fb6420 100644 (file)
@@ -99,15 +99,22 @@ nfs4_callback_up(struct svc_serv *serv)
 }
 
 #if defined(CONFIG_NFS_V4_1)
-static int nfs41_callback_up_net(struct svc_serv *serv, struct net *net)
+/*
+ * Create an svc_sock for the back channel service that shares the
+ * fore channel connection.
+ * Returns the input port (0) and sets the svc_serv bc_xprt on success
+ */
+static int nfs41_callback_up_net(struct svc_serv *serv, struct net *net,
+                                struct rpc_xprt *xprt)
 {
-       /*
-        * Create an svc_sock for the back channel service that shares the
-        * fore channel connection.
-        * Returns the input port (0) and sets the svc_serv bc_xprt on success
-        */
-       return svc_create_xprt(serv, "tcp-bc", net, PF_INET, 0,
-                             SVC_SOCK_ANONYMOUS);
+       int ret = -EPROTONOSUPPORT;
+
+       if (xprt->bc_name)
+               ret = svc_create_xprt(serv, xprt->bc_name, net, PF_INET, 0,
+                                     SVC_SOCK_ANONYMOUS);
+       dprintk("NFS: svc_create_xprt(%s) returned %d\n",
+               xprt->bc_name, ret);
+       return ret;
 }
 
 /*
@@ -188,7 +195,8 @@ static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt,
                xprt->bc_serv = serv;
 }
 #else
-static int nfs41_callback_up_net(struct svc_serv *serv, struct net *net)
+static int nfs41_callback_up_net(struct svc_serv *serv, struct net *net,
+                                struct rpc_xprt *xprt)
 {
        return 0;
 }
@@ -263,7 +271,8 @@ static void nfs_callback_down_net(u32 minorversion, struct svc_serv *serv, struc
        svc_shutdown_net(serv, net);
 }
 
-static int nfs_callback_up_net(int minorversion, struct svc_serv *serv, struct net *net)
+static int nfs_callback_up_net(int minorversion, struct svc_serv *serv,
+                              struct net *net, struct rpc_xprt *xprt)
 {
        struct nfs_net *nn = net_generic(net, nfs_net_id);
        int ret;
@@ -285,7 +294,7 @@ static int nfs_callback_up_net(int minorversion, struct svc_serv *serv, struct n
                        break;
                case 1:
                case 2:
-                       ret = nfs41_callback_up_net(serv, net);
+                       ret = nfs41_callback_up_net(serv, net, xprt);
                        break;
                default:
                        printk(KERN_ERR "NFS: unknown callback version: %d\n",
@@ -364,7 +373,7 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
                goto err_create;
        }
 
-       ret = nfs_callback_up_net(minorversion, serv, net);
+       ret = nfs_callback_up_net(minorversion, serv, net, xprt);
        if (ret < 0)
                goto err_net;
 
index 025198d8bdfba416d5a03c362e3407997ce880c3..61564919f747ac2065af562c29775de9ebcb3c35 100644 (file)
@@ -168,6 +168,7 @@ struct rpc_xprt {
        struct sockaddr_storage addr;           /* server address */
        size_t                  addrlen;        /* size of server address */
        int                     prot;           /* IP protocol */
+       char                    *bc_name;       /* backchannel transport */
 
        unsigned long           cong;           /* current congestion */
        unsigned long           cwnd;           /* congestion window */
index 73c09a0561c2137efa817212d7c5e3069db18af1..76277a2926a130c041f2f84697ddec069ec7b882 100644 (file)
@@ -337,6 +337,7 @@ xprt_setup_rdma(struct xprt_create *args)
        /* Ensure xprt->addr holds valid server TCP (not RDMA)
         * address, for any side protocols which peek at it */
        xprt->prot = IPPROTO_TCP;
+       xprt->bc_name = "rdma-bc";
        xprt->addrlen = args->addrlen;
        memcpy(&xprt->addr, sap, xprt->addrlen);
 
index dbd14bf00d19b3439fca3164ffe999f824bb01e8..fdb975737f80f61a1ba244d932486f8afd991aa6 100644 (file)
@@ -2835,6 +2835,7 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args)
        transport = container_of(xprt, struct sock_xprt, xprt);
 
        xprt->prot = IPPROTO_TCP;
+       xprt->bc_name = "tcp-bc";
        xprt->tsh_size = sizeof(rpc_fraghdr) / sizeof(u32);
        xprt->max_payload = RPC_MAX_FRAGMENT_SIZE;