diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-01-30 21:59:03 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-01-30 21:59:03 -0500 |
commit | 1ed2d76e0213751c82e3a242b61b0883daf330df (patch) | |
tree | 96c9d5d0fbb9c548ac448dea558b80632c266dc2 | |
parent | 8b0fdf631cf6a31f60a9ed3e1c0f37a9715de807 (diff) | |
parent | bc4802736d8b17eddde52e00838c348770f67c19 (diff) |
Merge branch 'work.sock_recvmsg' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull kern_recvmsg reduction from Al Viro:
"kernel_recvmsg() is a set_fs()-using wrapper for sock_recvmsg(). In
all but one case that is not needed - use of ITER_KVEC for ->msg_iter
takes care of the data and does not care about set_fs(). The only
exception is svc_udp_recvfrom() where we want cmsg to be store into
kernel object; everything else can just use sock_recvmsg() and be done
with that.
A followup converting svc_udp_recvfrom() away from set_fs() (and
killing kernel_recvmsg() off) is *NOT* in here - I'd like to hear what
netdev folks think of the approach proposed in that followup)"
* 'work.sock_recvmsg' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
tipc: switch to sock_recvmsg()
smc: switch to sock_recvmsg()
ipvs: switch to sock_recvmsg()
mISDN: switch to sock_recvmsg()
drbd: switch to sock_recvmsg()
lustre lnet_sock_read(): switch to sock_recvmsg()
cfs2: switch to sock_recvmsg()
ncpfs: switch to sock_recvmsg()
dlm: switch to sock_recvmsg()
svc_recvfrom(): switch to sock_recvmsg()
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 8 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 3 | ||||
-rw-r--r-- | drivers/isdn/mISDN/l1oip_core.c | 22 | ||||
-rw-r--r-- | drivers/staging/lustre/lnet/lnet/lib-socket.c | 24 | ||||
-rw-r--r-- | fs/dlm/lowcomms.c | 4 | ||||
-rw-r--r-- | fs/ncpfs/sock.c | 3 | ||||
-rw-r--r-- | fs/ocfs2/cluster/tcp.c | 3 | ||||
-rw-r--r-- | net/netfilter/ipvs/ip_vs_sync.c | 9 | ||||
-rw-r--r-- | net/smc/smc_clc.c | 18 | ||||
-rw-r--r-- | net/sunrpc/svcsock.c | 4 | ||||
-rw-r--r-- | net/tipc/server.c | 4 |
11 files changed, 46 insertions, 56 deletions
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 4b4697a1f963..0a0394aa1b9c 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
@@ -1847,7 +1847,7 @@ int drbd_send(struct drbd_connection *connection, struct socket *sock, | |||
1847 | void *buf, size_t size, unsigned msg_flags) | 1847 | void *buf, size_t size, unsigned msg_flags) |
1848 | { | 1848 | { |
1849 | struct kvec iov = {.iov_base = buf, .iov_len = size}; | 1849 | struct kvec iov = {.iov_base = buf, .iov_len = size}; |
1850 | struct msghdr msg; | 1850 | struct msghdr msg = {.msg_flags = msg_flags | MSG_NOSIGNAL}; |
1851 | int rv, sent = 0; | 1851 | int rv, sent = 0; |
1852 | 1852 | ||
1853 | if (!sock) | 1853 | if (!sock) |
@@ -1855,12 +1855,6 @@ int drbd_send(struct drbd_connection *connection, struct socket *sock, | |||
1855 | 1855 | ||
1856 | /* THINK if (signal_pending) return ... ? */ | 1856 | /* THINK if (signal_pending) return ... ? */ |
1857 | 1857 | ||
1858 | msg.msg_name = NULL; | ||
1859 | msg.msg_namelen = 0; | ||
1860 | msg.msg_control = NULL; | ||
1861 | msg.msg_controllen = 0; | ||
1862 | msg.msg_flags = msg_flags | MSG_NOSIGNAL; | ||
1863 | |||
1864 | iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, &iov, 1, size); | 1858 | iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, &iov, 1, size); |
1865 | 1859 | ||
1866 | if (sock == connection->data.socket) { | 1860 | if (sock == connection->data.socket) { |
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index cb2fa63f6bc0..c72dee0ef083 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
@@ -516,7 +516,8 @@ static int drbd_recv_short(struct socket *sock, void *buf, size_t size, int flag | |||
516 | struct msghdr msg = { | 516 | struct msghdr msg = { |
517 | .msg_flags = (flags ? flags : MSG_WAITALL | MSG_NOSIGNAL) | 517 | .msg_flags = (flags ? flags : MSG_WAITALL | MSG_NOSIGNAL) |
518 | }; | 518 | }; |
519 | return kernel_recvmsg(sock, &msg, &iov, 1, size, msg.msg_flags); | 519 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, size); |
520 | return sock_recvmsg(sock, &msg, msg.msg_flags); | ||
520 | } | 521 | } |
521 | 522 | ||
522 | static int drbd_recv(struct drbd_connection *connection, void *buf, size_t size) | 523 | static int drbd_recv(struct drbd_connection *connection, void *buf, size_t size) |
diff --git a/drivers/isdn/mISDN/l1oip_core.c b/drivers/isdn/mISDN/l1oip_core.c index e3654782a3e2..21d50e4cc5e1 100644 --- a/drivers/isdn/mISDN/l1oip_core.c +++ b/drivers/isdn/mISDN/l1oip_core.c | |||
@@ -645,8 +645,10 @@ l1oip_socket_thread(void *data) | |||
645 | { | 645 | { |
646 | struct l1oip *hc = (struct l1oip *)data; | 646 | struct l1oip *hc = (struct l1oip *)data; |
647 | int ret = 0; | 647 | int ret = 0; |
648 | struct msghdr msg; | ||
649 | struct sockaddr_in sin_rx; | 648 | struct sockaddr_in sin_rx; |
649 | struct kvec iov; | ||
650 | struct msghdr msg = {.msg_name = &sin_rx, | ||
651 | .msg_namelen = sizeof(sin_rx)}; | ||
650 | unsigned char *recvbuf; | 652 | unsigned char *recvbuf; |
651 | size_t recvbuf_size = 1500; | 653 | size_t recvbuf_size = 1500; |
652 | int recvlen; | 654 | int recvlen; |
@@ -661,6 +663,9 @@ l1oip_socket_thread(void *data) | |||
661 | goto fail; | 663 | goto fail; |
662 | } | 664 | } |
663 | 665 | ||
666 | iov.iov_base = recvbuf; | ||
667 | iov.iov_len = recvbuf_size; | ||
668 | |||
664 | /* make daemon */ | 669 | /* make daemon */ |
665 | allow_signal(SIGTERM); | 670 | allow_signal(SIGTERM); |
666 | 671 | ||
@@ -697,12 +702,6 @@ l1oip_socket_thread(void *data) | |||
697 | goto fail; | 702 | goto fail; |
698 | } | 703 | } |
699 | 704 | ||
700 | /* build receive message */ | ||
701 | msg.msg_name = &sin_rx; | ||
702 | msg.msg_namelen = sizeof(sin_rx); | ||
703 | msg.msg_control = NULL; | ||
704 | msg.msg_controllen = 0; | ||
705 | |||
706 | /* build send message */ | 705 | /* build send message */ |
707 | hc->sendmsg.msg_name = &hc->sin_remote; | 706 | hc->sendmsg.msg_name = &hc->sin_remote; |
708 | hc->sendmsg.msg_namelen = sizeof(hc->sin_remote); | 707 | hc->sendmsg.msg_namelen = sizeof(hc->sin_remote); |
@@ -719,12 +718,9 @@ l1oip_socket_thread(void *data) | |||
719 | printk(KERN_DEBUG "%s: socket created and open\n", | 718 | printk(KERN_DEBUG "%s: socket created and open\n", |
720 | __func__); | 719 | __func__); |
721 | while (!signal_pending(current)) { | 720 | while (!signal_pending(current)) { |
722 | struct kvec iov = { | 721 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, |
723 | .iov_base = recvbuf, | 722 | recvbuf_size); |
724 | .iov_len = recvbuf_size, | 723 | recvlen = sock_recvmsg(socket, &msg, 0); |
725 | }; | ||
726 | recvlen = kernel_recvmsg(socket, &msg, &iov, 1, | ||
727 | recvbuf_size, 0); | ||
728 | if (recvlen > 0) { | 724 | if (recvlen > 0) { |
729 | l1oip_socket_parse(hc, &sin_rx, recvbuf, recvlen); | 725 | l1oip_socket_parse(hc, &sin_rx, recvbuf, recvlen); |
730 | } else { | 726 | } else { |
diff --git a/drivers/staging/lustre/lnet/lnet/lib-socket.c b/drivers/staging/lustre/lnet/lnet/lib-socket.c index 7d49d4865298..ed46aaca0ba3 100644 --- a/drivers/staging/lustre/lnet/lnet/lib-socket.c +++ b/drivers/staging/lustre/lnet/lnet/lib-socket.c | |||
@@ -314,19 +314,20 @@ lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout) | |||
314 | long jiffies_left = timeout * msecs_to_jiffies(MSEC_PER_SEC); | 314 | long jiffies_left = timeout * msecs_to_jiffies(MSEC_PER_SEC); |
315 | unsigned long then; | 315 | unsigned long then; |
316 | struct timeval tv; | 316 | struct timeval tv; |
317 | struct kvec iov = { | ||
318 | .iov_base = buffer, | ||
319 | .iov_len = nob | ||
320 | }; | ||
321 | struct msghdr msg = { | ||
322 | .msg_flags = 0 | ||
323 | }; | ||
317 | 324 | ||
318 | LASSERT(nob > 0); | 325 | LASSERT(nob > 0); |
319 | LASSERT(jiffies_left > 0); | 326 | LASSERT(jiffies_left > 0); |
320 | 327 | ||
321 | for (;;) { | 328 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, nob); |
322 | struct kvec iov = { | ||
323 | .iov_base = buffer, | ||
324 | .iov_len = nob | ||
325 | }; | ||
326 | struct msghdr msg = { | ||
327 | .msg_flags = 0 | ||
328 | }; | ||
329 | 329 | ||
330 | for (;;) { | ||
330 | /* Set receive timeout to remaining time */ | 331 | /* Set receive timeout to remaining time */ |
331 | jiffies_to_timeval(jiffies_left, &tv); | 332 | jiffies_to_timeval(jiffies_left, &tv); |
332 | rc = kernel_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, | 333 | rc = kernel_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, |
@@ -338,7 +339,7 @@ lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout) | |||
338 | } | 339 | } |
339 | 340 | ||
340 | then = jiffies; | 341 | then = jiffies; |
341 | rc = kernel_recvmsg(sock, &msg, &iov, 1, nob, 0); | 342 | rc = sock_recvmsg(sock, &msg, 0); |
342 | jiffies_left -= jiffies - then; | 343 | jiffies_left -= jiffies - then; |
343 | 344 | ||
344 | if (rc < 0) | 345 | if (rc < 0) |
@@ -347,10 +348,7 @@ lnet_sock_read(struct socket *sock, void *buffer, int nob, int timeout) | |||
347 | if (!rc) | 348 | if (!rc) |
348 | return -ECONNRESET; | 349 | return -ECONNRESET; |
349 | 350 | ||
350 | buffer = ((char *)buffer) + rc; | 351 | if (!msg_data_left(&msg)) |
351 | nob -= rc; | ||
352 | |||
353 | if (!nob) | ||
354 | return 0; | 352 | return 0; |
355 | 353 | ||
356 | if (jiffies_left <= 0) | 354 | if (jiffies_left <= 0) |
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c index 05707850f93a..cff79ea0c01d 100644 --- a/fs/dlm/lowcomms.c +++ b/fs/dlm/lowcomms.c | |||
@@ -675,9 +675,9 @@ static int receive_from_sock(struct connection *con) | |||
675 | nvec = 2; | 675 | nvec = 2; |
676 | } | 676 | } |
677 | len = iov[0].iov_len + iov[1].iov_len; | 677 | len = iov[0].iov_len + iov[1].iov_len; |
678 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, iov, nvec, len); | ||
678 | 679 | ||
679 | r = ret = kernel_recvmsg(con->sock, &msg, iov, nvec, len, | 680 | r = ret = sock_recvmsg(con->sock, &msg, MSG_DONTWAIT | MSG_NOSIGNAL); |
680 | MSG_DONTWAIT | MSG_NOSIGNAL); | ||
681 | if (ret <= 0) | 681 | if (ret <= 0) |
682 | goto out_close; | 682 | goto out_close; |
683 | else if (ret == len) | 683 | else if (ret == len) |
diff --git a/fs/ncpfs/sock.c b/fs/ncpfs/sock.c index efb176b1751a..4c13174d85b7 100644 --- a/fs/ncpfs/sock.c +++ b/fs/ncpfs/sock.c | |||
@@ -39,7 +39,8 @@ static int _recv(struct socket *sock, void *buf, int size, unsigned flags) | |||
39 | { | 39 | { |
40 | struct msghdr msg = {NULL, }; | 40 | struct msghdr msg = {NULL, }; |
41 | struct kvec iov = {buf, size}; | 41 | struct kvec iov = {buf, size}; |
42 | return kernel_recvmsg(sock, &msg, &iov, 1, size, flags); | 42 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, size); |
43 | return sock_recvmsg(sock, &msg, flags); | ||
43 | } | 44 | } |
44 | 45 | ||
45 | static int _send(struct socket *sock, const void *buff, int len) | 46 | static int _send(struct socket *sock, const void *buff, int len) |
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index bebe59feca58..eac5140aac47 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c | |||
@@ -918,7 +918,8 @@ static int o2net_recv_tcp_msg(struct socket *sock, void *data, size_t len) | |||
918 | { | 918 | { |
919 | struct kvec vec = { .iov_len = len, .iov_base = data, }; | 919 | struct kvec vec = { .iov_len = len, .iov_base = data, }; |
920 | struct msghdr msg = { .msg_flags = MSG_DONTWAIT, }; | 920 | struct msghdr msg = { .msg_flags = MSG_DONTWAIT, }; |
921 | return kernel_recvmsg(sock, &msg, &vec, 1, len, msg.msg_flags); | 921 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, len); |
922 | return sock_recvmsg(sock, &msg, MSG_DONTWAIT); | ||
922 | } | 923 | } |
923 | 924 | ||
924 | static int o2net_send_tcp_msg(struct socket *sock, struct kvec *vec, | 925 | static int o2net_send_tcp_msg(struct socket *sock, struct kvec *vec, |
diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c index 9ee71cb276d7..fbaf3bd05b2e 100644 --- a/net/netfilter/ipvs/ip_vs_sync.c +++ b/net/netfilter/ipvs/ip_vs_sync.c | |||
@@ -1636,17 +1636,14 @@ static int | |||
1636 | ip_vs_receive(struct socket *sock, char *buffer, const size_t buflen) | 1636 | ip_vs_receive(struct socket *sock, char *buffer, const size_t buflen) |
1637 | { | 1637 | { |
1638 | struct msghdr msg = {NULL,}; | 1638 | struct msghdr msg = {NULL,}; |
1639 | struct kvec iov; | 1639 | struct kvec iov = {buffer, buflen}; |
1640 | int len; | 1640 | int len; |
1641 | 1641 | ||
1642 | EnterFunction(7); | 1642 | EnterFunction(7); |
1643 | 1643 | ||
1644 | /* Receive a packet */ | 1644 | /* Receive a packet */ |
1645 | iov.iov_base = buffer; | 1645 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, buflen); |
1646 | iov.iov_len = (size_t)buflen; | 1646 | len = sock_recvmsg(sock, &msg, MSG_DONTWAIT); |
1647 | |||
1648 | len = kernel_recvmsg(sock, &msg, &iov, 1, buflen, MSG_DONTWAIT); | ||
1649 | |||
1650 | if (len < 0) | 1647 | if (len < 0) |
1651 | return len; | 1648 | return len; |
1652 | 1649 | ||
diff --git a/net/smc/smc_clc.c b/net/smc/smc_clc.c index 1800e16b2a02..511548085d16 100644 --- a/net/smc/smc_clc.c +++ b/net/smc/smc_clc.c | |||
@@ -35,7 +35,7 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen, | |||
35 | struct smc_clc_msg_hdr *clcm = buf; | 35 | struct smc_clc_msg_hdr *clcm = buf; |
36 | struct msghdr msg = {NULL, 0}; | 36 | struct msghdr msg = {NULL, 0}; |
37 | int reason_code = 0; | 37 | int reason_code = 0; |
38 | struct kvec vec; | 38 | struct kvec vec = {buf, buflen}; |
39 | int len, datlen; | 39 | int len, datlen; |
40 | int krflags; | 40 | int krflags; |
41 | 41 | ||
@@ -43,12 +43,15 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen, | |||
43 | * so we don't consume any subsequent CLC message or payload data | 43 | * so we don't consume any subsequent CLC message or payload data |
44 | * in the TCP byte stream | 44 | * in the TCP byte stream |
45 | */ | 45 | */ |
46 | vec.iov_base = buf; | 46 | /* |
47 | vec.iov_len = buflen; | 47 | * Caller must make sure that buflen is no less than |
48 | * sizeof(struct smc_clc_msg_hdr) | ||
49 | */ | ||
48 | krflags = MSG_PEEK | MSG_WAITALL; | 50 | krflags = MSG_PEEK | MSG_WAITALL; |
49 | smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; | 51 | smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; |
50 | len = kernel_recvmsg(smc->clcsock, &msg, &vec, 1, | 52 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, |
51 | sizeof(struct smc_clc_msg_hdr), krflags); | 53 | sizeof(struct smc_clc_msg_hdr)); |
54 | len = sock_recvmsg(smc->clcsock, &msg, krflags); | ||
52 | if (signal_pending(current)) { | 55 | if (signal_pending(current)) { |
53 | reason_code = -EINTR; | 56 | reason_code = -EINTR; |
54 | clc_sk->sk_err = EINTR; | 57 | clc_sk->sk_err = EINTR; |
@@ -83,12 +86,11 @@ int smc_clc_wait_msg(struct smc_sock *smc, void *buf, int buflen, | |||
83 | } | 86 | } |
84 | 87 | ||
85 | /* receive the complete CLC message */ | 88 | /* receive the complete CLC message */ |
86 | vec.iov_base = buf; | ||
87 | vec.iov_len = buflen; | ||
88 | memset(&msg, 0, sizeof(struct msghdr)); | 89 | memset(&msg, 0, sizeof(struct msghdr)); |
90 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, buflen); | ||
89 | krflags = MSG_WAITALL; | 91 | krflags = MSG_WAITALL; |
90 | smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; | 92 | smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; |
91 | len = kernel_recvmsg(smc->clcsock, &msg, &vec, 1, datlen, krflags); | 93 | len = sock_recvmsg(smc->clcsock, &msg, krflags); |
92 | if (len < datlen) { | 94 | if (len < datlen) { |
93 | smc->sk.sk_err = EPROTO; | 95 | smc->sk.sk_err = EPROTO; |
94 | reason_code = -EPROTO; | 96 | reason_code = -EPROTO; |
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index ff8e06cd067e..5570719e4787 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
@@ -338,8 +338,8 @@ static int svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr, | |||
338 | rqstp->rq_xprt_hlen = 0; | 338 | rqstp->rq_xprt_hlen = 0; |
339 | 339 | ||
340 | clear_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); | 340 | clear_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); |
341 | len = kernel_recvmsg(svsk->sk_sock, &msg, iov, nr, buflen, | 341 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, iov, nr, buflen); |
342 | msg.msg_flags); | 342 | len = sock_recvmsg(svsk->sk_sock, &msg, msg.msg_flags); |
343 | /* If we read a full record, then assume there may be more | 343 | /* If we read a full record, then assume there may be more |
344 | * data to read (stream based sockets only!) | 344 | * data to read (stream based sockets only!) |
345 | */ | 345 | */ |
diff --git a/net/tipc/server.c b/net/tipc/server.c index d60c30342327..78a292a84afc 100644 --- a/net/tipc/server.c +++ b/net/tipc/server.c | |||
@@ -264,8 +264,8 @@ static int tipc_receive_from_sock(struct tipc_conn *con) | |||
264 | iov.iov_base = buf; | 264 | iov.iov_base = buf; |
265 | iov.iov_len = s->max_rcvbuf_size; | 265 | iov.iov_len = s->max_rcvbuf_size; |
266 | msg.msg_name = &addr; | 266 | msg.msg_name = &addr; |
267 | ret = kernel_recvmsg(con->sock, &msg, &iov, 1, iov.iov_len, | 267 | iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, iov.iov_len); |
268 | MSG_DONTWAIT); | 268 | ret = sock_recvmsg(con->sock, &msg, MSG_DONTWAIT); |
269 | if (ret <= 0) { | 269 | if (ret <= 0) { |
270 | kmem_cache_free(s->rcvbuf_cache, buf); | 270 | kmem_cache_free(s->rcvbuf_cache, buf); |
271 | goto out_close; | 271 | goto out_close; |