static void nfs4_pnfs_ds_addr_free(struct nfs4_pnfs_ds_addr *da)
 {
        kfree(da->da_remotestr);
+       kfree(da->da_netid);
        kfree(da);
 }
 
 
                if (!IS_ERR(clp)) {
                        struct xprt_create xprt_args = {
-                               .ident = XPRT_TRANSPORT_TCP,
+                               .ident = da->da_transport,
                                .net = clp->cl_net,
                                .dstaddr = (struct sockaddr *)&da->da_addr,
                                .addrlen = da->da_addrlen,
                                .servername = clp->cl_hostname,
                        };
 
+                       if (da->da_transport != clp->cl_proto)
+                               continue;
                        if (da->da_addr.ss_family != clp->cl_addr.ss_family)
                                continue;
                        /* Add this address as an alias */
                }
                clp = get_v3_ds_connect(mds_srv,
                                (struct sockaddr *)&da->da_addr,
-                               da->da_addrlen, IPPROTO_TCP,
+                               da->da_addrlen, da->da_transport,
                                timeo, retrans);
                if (IS_ERR(clp))
                        continue;
 
                if (!IS_ERR(clp) && clp->cl_mvops->session_trunk) {
                        struct xprt_create xprt_args = {
-                               .ident = XPRT_TRANSPORT_TCP,
+                               .ident = da->da_transport,
                                .net = clp->cl_net,
                                .dstaddr = (struct sockaddr *)&da->da_addr,
                                .addrlen = da->da_addrlen,
                                .data = &xprtdata,
                        };
 
+                       if (da->da_transport != clp->cl_proto)
+                               continue;
                        if (da->da_addr.ss_family != clp->cl_addr.ss_family)
                                continue;
                        /**
                } else {
                        clp = nfs4_set_ds_client(mds_srv,
                                                (struct sockaddr *)&da->da_addr,
-                                               da->da_addrlen, IPPROTO_TCP,
-                                               timeo, retrans, minor_version);
+                                               da->da_addrlen,
+                                               da->da_transport, timeo,
+                                               retrans, minor_version);
                        if (IS_ERR(clp))
                                continue;
 
        int nlen, rlen;
        int tmp[2];
        __be32 *p;
-       char *netid, *match_netid;
-       size_t len, match_netid_len;
+       char *netid;
+       size_t len;
        char *startsep = "";
        char *endsep = "";
 
        case AF_INET:
                ((struct sockaddr_in *)&da->da_addr)->sin_port = port;
                da->da_addrlen = sizeof(struct sockaddr_in);
-               match_netid = "tcp";
-               match_netid_len = 3;
                break;
 
        case AF_INET6:
                ((struct sockaddr_in6 *)&da->da_addr)->sin6_port = port;
                da->da_addrlen = sizeof(struct sockaddr_in6);
-               match_netid = "tcp6";
-               match_netid_len = 4;
                startsep = "[";
                endsep = "]";
                break;
                goto out_free_da;
        }
 
-       if (nlen != match_netid_len || strncmp(netid, match_netid, nlen)) {
-               dprintk("%s: ERROR: r_netid \"%s\" != \"%s\"\n",
-                       __func__, netid, match_netid);
+       da->da_transport = xprt_find_transport_ident(netid);
+       if (da->da_transport < 0) {
+               dprintk("%s: ERROR: unknown r_netid \"%s\"\n",
+                       __func__, netid);
                goto out_free_da;
        }
 
+       da->da_netid = netid;
+
        /* save human readable address */
        len = strlen(startsep) + strlen(buf) + strlen(endsep) + 7;
        da->da_remotestr = kzalloc(len, gfp_flags);
 
        dprintk("%s: Parsed DS addr %s\n", __func__, da->da_remotestr);
        kfree(buf);
-       kfree(netid);
        return da;
 
 out_free_da: