Skip to content

Commit e791f8e

Browse files
author
Trond Myklebust
committed
SUNRPC: Convert xs_send_kvec() to use iov_iter_kvec()
Prepare to the socket transmission code to use iov_iter. Signed-off-by: Trond Myklebust <[email protected]>
1 parent 5f52a9d commit e791f8e

File tree

1 file changed

+23
-15
lines changed

1 file changed

+23
-15
lines changed

net/sunrpc/xprtsock.c

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -742,21 +742,21 @@ xs_stream_start_connect(struct sock_xprt *transport)
742742

743743
#define XS_SENDMSG_FLAGS (MSG_DONTWAIT | MSG_NOSIGNAL)
744744

745-
static int xs_send_kvec(struct socket *sock, struct sockaddr *addr, int addrlen, struct kvec *vec, unsigned int base, int more)
745+
static int xs_sendmsg(struct socket *sock, struct msghdr *msg, size_t seek)
746746
{
747-
struct msghdr msg = {
748-
.msg_name = addr,
749-
.msg_namelen = addrlen,
750-
.msg_flags = XS_SENDMSG_FLAGS | (more ? MSG_MORE : 0),
751-
};
752-
struct kvec iov = {
753-
.iov_base = vec->iov_base + base,
754-
.iov_len = vec->iov_len - base,
755-
};
747+
if (seek)
748+
iov_iter_advance(&msg->msg_iter, seek);
749+
return sock_sendmsg(sock, msg);
750+
}
756751

757-
if (iov.iov_len != 0)
758-
return kernel_sendmsg(sock, &msg, &iov, 1, iov.iov_len);
759-
return kernel_sendmsg(sock, &msg, NULL, 0, 0);
752+
static int xs_send_kvec(struct socket *sock, struct msghdr *msg, struct kvec *vec, size_t seek)
753+
{
754+
if (!vec) {
755+
iov_iter_kvec(&msg->msg_iter, WRITE, NULL, 0, 0);
756+
return sock_sendmsg(sock, msg);
757+
}
758+
iov_iter_kvec(&msg->msg_iter, WRITE, vec, 1, vec->iov_len);
759+
return xs_sendmsg(sock, msg, seek);
760760
}
761761

762762
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
810810
*/
811811
static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, struct xdr_buf *xdr, unsigned int base, bool zerocopy, int *sent_p)
812812
{
813+
struct msghdr msg = {
814+
.msg_name = addr,
815+
.msg_namelen = addrlen,
816+
.msg_flags = XS_SENDMSG_FLAGS | MSG_MORE,
817+
};
813818
unsigned int remainder = xdr->len - base;
814819
int err = 0;
815820
int sent = 0;
@@ -825,7 +830,9 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
825830
if (base < xdr->head[0].iov_len || addr != NULL) {
826831
unsigned int len = xdr->head[0].iov_len - base;
827832
remainder -= len;
828-
err = xs_send_kvec(sock, addr, addrlen, &xdr->head[0], base, remainder != 0);
833+
if (remainder == 0)
834+
msg.msg_flags &= ~MSG_MORE;
835+
err = xs_send_kvec(sock, &msg, &xdr->head[0], base);
829836
if (remainder == 0 || err != len)
830837
goto out;
831838
*sent_p += err;
@@ -846,7 +853,8 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,
846853

847854
if (base >= xdr->tail[0].iov_len)
848855
return 0;
849-
err = xs_send_kvec(sock, NULL, 0, &xdr->tail[0], base, 0);
856+
msg.msg_flags &= ~MSG_MORE;
857+
err = xs_send_kvec(sock, &msg, &xdr->tail[0], base);
850858
out:
851859
if (err > 0) {
852860
*sent_p += err;

0 commit comments

Comments
 (0)