SUNRPC: Convert svc_udp_sendto() to use the per-socket bio_vec array
[sfrench/cifs-2.6.git] / net / sunrpc / svcsock.c
index d4d816036c040920785fa27072d55f39087c00a1..2ff730335a56c8ac49270117600a0bee1c6f2c2f 100644 (file)
@@ -693,9 +693,10 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
                .msg_name       = &rqstp->rq_addr,
                .msg_namelen    = rqstp->rq_addrlen,
                .msg_control    = cmh,
+               .msg_flags      = MSG_SPLICE_PAGES,
                .msg_controllen = sizeof(buffer),
        };
-       unsigned int sent;
+       unsigned int count;
        int err;
 
        svc_udp_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
@@ -708,22 +709,23 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
        if (svc_xprt_is_dead(xprt))
                goto out_notconn;
 
-       err = xdr_alloc_bvec(xdr, GFP_KERNEL);
-       if (err < 0)
-               goto out_unlock;
+       count = xdr_buf_to_bvec(rqstp->rq_bvec,
+                               ARRAY_SIZE(rqstp->rq_bvec), xdr);
 
-       err = xprt_sock_sendmsg(svsk->sk_sock, &msg, xdr, 0, 0, &sent);
+       iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
+                     count, 0);
+       err = sock_sendmsg(svsk->sk_sock, &msg);
        if (err == -ECONNREFUSED) {
                /* ICMP error on earlier request. */
-               err = xprt_sock_sendmsg(svsk->sk_sock, &msg, xdr, 0, 0, &sent);
+               iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
+                             count, 0);
+               err = sock_sendmsg(svsk->sk_sock, &msg);
        }
-       xdr_free_bvec(xdr);
+
        trace_svcsock_udp_send(xprt, err);
-out_unlock:
+
        mutex_unlock(&xprt->xpt_mutex);
-       if (err < 0)
-               return err;
-       return sent;
+       return err;
 
 out_notconn:
        mutex_unlock(&xprt->xpt_mutex);