svcrpc: autoload rdma module
authorJ. Bruce Fields <bfields@redhat.com>
Wed, 18 May 2016 18:50:14 +0000 (14:50 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Mon, 23 May 2016 14:55:24 +0000 (10:55 -0400)
This should fix failures like:

# rpc.nfsd --rdma
rpc.nfsd: Unable to request RDMA services: Protocol not supported

Reported-by: Steve Dickson <steved@redhat.com>
Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
net/sunrpc/svc_xprt.c

index 7422f28818b24de5e7b36eca01ac2e91f9a7cd4f..f5572e31d518f85b2afbbb9ec1b8e89d36448803 100644 (file)
@@ -244,13 +244,12 @@ void svc_add_new_perm_xprt(struct svc_serv *serv, struct svc_xprt *new)
        svc_xprt_received(new);
 }
 
-int svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
+int _svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
                    struct net *net, const int family,
                    const unsigned short port, int flags)
 {
        struct svc_xprt_class *xcl;
 
-       dprintk("svc: creating transport %s[%d]\n", xprt_name, port);
        spin_lock(&svc_xprt_class_lock);
        list_for_each_entry(xcl, &svc_xprt_class_list, xcl_list) {
                struct svc_xprt *newxprt;
@@ -274,12 +273,28 @@ int svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
        }
  err:
        spin_unlock(&svc_xprt_class_lock);
-       dprintk("svc: transport %s not found\n", xprt_name);
-
        /* This errno is exposed to user space.  Provide a reasonable
         * perror msg for a bad transport. */
        return -EPROTONOSUPPORT;
 }
+
+int svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
+                   struct net *net, const int family,
+                   const unsigned short port, int flags)
+{
+       int err;
+
+       dprintk("svc: creating transport %s[%d]\n", xprt_name, port);
+       err = _svc_create_xprt(serv, xprt_name, net, family, port, flags);
+       if (err == -EPROTONOSUPPORT) {
+               request_module("svc%s", xprt_name);
+               err = _svc_create_xprt(serv, xprt_name, net, family, port, flags);
+       }
+       if (err)
+               dprintk("svc: transport %s not found, err %d\n",
+                       xprt_name, err);
+       return err;
+}
 EXPORT_SYMBOL_GPL(svc_create_xprt);
 
 /*