}
 EXPORT_SYMBOL_GPL(xprt_unregister_transport);
 
+static void
+xprt_class_release(const struct xprt_class *t)
+{
+       module_put(t->owner);
+}
+
+static const struct xprt_class *
+xprt_class_find_by_netid_locked(const char *netid)
+{
+       const struct xprt_class *t;
+       unsigned int i;
+
+       list_for_each_entry(t, &xprt_list, list) {
+               for (i = 0; t->netid[i][0] != '\0'; i++) {
+                       if (strcmp(t->netid[i], netid) != 0)
+                               continue;
+                       if (!try_module_get(t->owner))
+                               continue;
+                       return t;
+               }
+       }
+       return NULL;
+}
+
+static const struct xprt_class *
+xprt_class_find_by_netid(const char *netid)
+{
+       const struct xprt_class *t;
+
+       spin_lock(&xprt_list_lock);
+       t = xprt_class_find_by_netid_locked(netid);
+       if (!t) {
+               spin_unlock(&xprt_list_lock);
+               request_module("rpc%s", netid);
+               spin_lock(&xprt_list_lock);
+               t = xprt_class_find_by_netid_locked(netid);
+       }
+       spin_unlock(&xprt_list_lock);
+       return t;
+}
+
 /**
  * xprt_load_transport - load a transport implementation
- * @transport_name: transport to load
+ * @netid: transport to load
  *
  * Returns:
  * 0:          transport successfully loaded
  * -ENOENT:    transport module not available
  */
-int xprt_load_transport(const char *transport_name)
+int xprt_load_transport(const char *netid)
 {
-       struct xprt_class *t;
-       int result;
+       const struct xprt_class *t;
 
-       result = 0;
-       spin_lock(&xprt_list_lock);
-       list_for_each_entry(t, &xprt_list, list) {
-               if (strcmp(t->name, transport_name) == 0) {
-                       spin_unlock(&xprt_list_lock);
-                       goto out;
-               }
-       }
-       spin_unlock(&xprt_list_lock);
-       result = request_module("xprt%s", transport_name);
-out:
-       return result;
+       t = xprt_class_find_by_netid(netid);
+       if (!t)
+               return -ENOENT;
+       xprt_class_release(t);
+       return 0;
 }
 EXPORT_SYMBOL_GPL(xprt_load_transport);
 
 
        .owner          = THIS_MODULE,
        .ident          = XPRT_TRANSPORT_LOCAL,
        .setup          = xs_setup_local,
+       .netid          = { "" },
 };
 
 static struct xprt_class       xs_udp_transport = {
        .owner          = THIS_MODULE,
        .ident          = XPRT_TRANSPORT_UDP,
        .setup          = xs_setup_udp,
+       .netid          = { "udp", "udp6", "" },
 };
 
 static struct xprt_class       xs_tcp_transport = {
        .owner          = THIS_MODULE,
        .ident          = XPRT_TRANSPORT_TCP,
        .setup          = xs_setup_tcp,
+       .netid          = { "tcp", "tcp6", "" },
 };
 
 static struct xprt_class       xs_bc_tcp_transport = {
        .owner          = THIS_MODULE,
        .ident          = XPRT_TRANSPORT_BC_TCP,
        .setup          = xs_setup_bc_tcp,
+       .netid          = { "" },
 };
 
 /**