}
 
 static struct svc_xprt_ops svc_udp_ops = {
+       .xpo_recvfrom = svc_udp_recvfrom,
+       .xpo_sendto = svc_udp_sendto,
 };
 
 static struct svc_xprt_class svc_udp_class = {
        svc_xprt_init(&svc_udp_class, &svsk->sk_xprt);
        svsk->sk_sk->sk_data_ready = svc_udp_data_ready;
        svsk->sk_sk->sk_write_space = svc_write_space;
-       svsk->sk_recvfrom = svc_udp_recvfrom;
-       svsk->sk_sendto = svc_udp_sendto;
 
        /* initialise setting must have enough space to
         * receive and respond to one request.
 }
 
 static struct svc_xprt_ops svc_tcp_ops = {
+       .xpo_recvfrom = svc_tcp_recvfrom,
+       .xpo_sendto = svc_tcp_sendto,
 };
 
 static struct svc_xprt_class svc_tcp_class = {
        struct tcp_sock *tp = tcp_sk(sk);
 
        svc_xprt_init(&svc_tcp_class, &svsk->sk_xprt);
-       svsk->sk_recvfrom = svc_tcp_recvfrom;
-       svsk->sk_sendto = svc_tcp_sendto;
 
        if (sk->sk_state == TCP_LISTEN) {
                dprintk("setting up TCP socket for listening\n");
 
        dprintk("svc: server %p, pool %u, socket %p, inuse=%d\n",
                 rqstp, pool->sp_id, svsk, atomic_read(&svsk->sk_inuse));
-       len = svsk->sk_recvfrom(rqstp);
+       len = svsk->sk_xprt.xpt_ops->xpo_recvfrom(rqstp);
        dprintk("svc: got len=%d\n", len);
 
        /* No data, incomplete (TCP) read, or accept() */
        if (test_bit(SK_DEAD, &svsk->sk_flags))
                len = -ENOTCONN;
        else
-               len = svsk->sk_sendto(rqstp);
+               len = svsk->sk_xprt.xpt_ops->xpo_sendto(rqstp);
        mutex_unlock(&svsk->sk_mutex);
        svc_sock_release(rqstp);