]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - net/sunrpc/svc_xprt.c
Merge tag 'usb-4.7-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
[mirror_ubuntu-bionic-kernel.git] / net / sunrpc / svc_xprt.c
index 7422f28818b24de5e7b36eca01ac2e91f9a7cd4f..4f01f63102ee5d1ce936f54fa8feb3cedfc15607 100644 (file)
@@ -136,6 +136,8 @@ static void svc_xprt_free(struct kref *kref)
        /* See comment on corresponding get in xs_setup_bc_tcp(): */
        if (xprt->xpt_bc_xprt)
                xprt_put(xprt->xpt_bc_xprt);
+       if (xprt->xpt_bc_xps)
+               xprt_switch_put(xprt->xpt_bc_xps);
        xprt->xpt_ops->xpo_free(xprt);
        module_put(owner);
 }
@@ -244,13 +246,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 +275,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);
 
 /*