]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
SUNRPC: Convert xs_send_kvec() to use iov_iter_kvec()
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Tue, 19 Feb 2019 17:39:40 +0000 (12:39 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 20 Feb 2019 22:35:58 +0000 (17:35 -0500)
Prepare to the socket transmission code to use iov_iter.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
net/sunrpc/xprtsock.c

index a3aadc04808fb0c842754d5648b598a6df15e67e..e1546dd6aacc50c4f4bf390e907ad106a86a258a 100644 (file)
@@ -742,21 +742,21 @@ xs_stream_start_connect(struct sock_xprt *transport)
 
 #define XS_SENDMSG_FLAGS       (MSG_DONTWAIT | MSG_NOSIGNAL)
 
-static int xs_send_kvec(struct socket *sock, struct sockaddr *addr, int addrlen, struct kvec *vec, unsigned int base, int more)
+static int xs_sendmsg(struct socket *sock, struct msghdr *msg, size_t seek)
 {
-       struct msghdr msg = {
-               .msg_name       = addr,
-               .msg_namelen    = addrlen,
-               .msg_flags      = XS_SENDMSG_FLAGS | (more ? MSG_MORE : 0),
-       };
-       struct kvec iov = {
-               .iov_base       = vec->iov_base + base,
-               .iov_len        = vec->iov_len - base,
-       };
+       if (seek)
+               iov_iter_advance(&msg->msg_iter, seek);
+       return sock_sendmsg(sock, msg);
+}
 
-       if (iov.iov_len != 0)
-               return kernel_sendmsg(sock, &msg, &iov, 1, iov.iov_len);
-       return kernel_sendmsg(sock, &msg, NULL, 0, 0);
+static int xs_send_kvec(struct socket *sock, struct msghdr *msg, struct kvec *vec, size_t seek)
+{
+       if (!vec) {
+               iov_iter_kvec(&msg->msg_iter, WRITE, NULL, 0, 0);
+               return sock_sendmsg(sock, msg);
+       }
+       iov_iter_kvec(&msg->msg_iter, WRITE, vec, 1, vec->iov_len);
+       return xs_sendmsg(sock, msg, seek);
 }
 
 static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned int base, int more, bool zerocopy, int *sent_p)
@@ -810,6 +810,11 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i
  */
 static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, struct xdr_buf *xdr, unsigned int base, bool zerocopy, int *sent_p)
 {
+       struct msghdr msg = {
+               .msg_name = addr,
+               .msg_namelen = addrlen,
+               .msg_flags = XS_SENDMSG_FLAGS | MSG_MORE,
+       };
        unsigned int remainder = xdr->len - base;
        int err = 0;
        int sent = 0;
@@ -825,7 +830,9 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
        if (base < xdr->head[0].iov_len || addr != NULL) {
                unsigned int len = xdr->head[0].iov_len - base;
                remainder -= len;
-               err = xs_send_kvec(sock, addr, addrlen, &xdr->head[0], base, remainder != 0);
+               if (remainder == 0)
+                       msg.msg_flags &= ~MSG_MORE;
+               err = xs_send_kvec(sock, &msg, &xdr->head[0], base);
                if (remainder == 0 || err != len)
                        goto out;
                *sent_p += err;
@@ -846,7 +853,8 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
 
        if (base >= xdr->tail[0].iov_len)
                return 0;
-       err = xs_send_kvec(sock, NULL, 0, &xdr->tail[0], base, 0);
+       msg.msg_flags &= ~MSG_MORE;
+       err = xs_send_kvec(sock, &msg, &xdr->tail[0], base);
 out:
        if (err > 0) {
                *sent_p += err;