Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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()

+46 -56
+1 -7
drivers/block/drbd/drbd_main.c
··· 1847 1847 void *buf, size_t size, unsigned msg_flags) 1848 1848 { 1849 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 1851 int rv, sent = 0; 1852 1852 1853 1853 if (!sock) 1854 1854 return -EBADR; 1855 1855 1856 1856 /* THINK if (signal_pending) return ... ? */ 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 1857 1864 1858 iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, &iov, 1, size); 1865 1859
+2 -1
drivers/block/drbd/drbd_receiver.c
··· 516 516 struct msghdr msg = { 517 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 523 static int drbd_recv(struct drbd_connection *connection, void *buf, size_t size)
+9 -13
drivers/isdn/mISDN/l1oip_core.c
··· 645 645 { 646 646 struct l1oip *hc = (struct l1oip *)data; 647 647 int ret = 0; 648 - struct msghdr msg; 649 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 652 unsigned char *recvbuf; 651 653 size_t recvbuf_size = 1500; 652 654 int recvlen; ··· 662 660 ret = -ENOMEM; 663 661 goto fail; 664 662 } 663 + 664 + iov.iov_base = recvbuf; 665 + iov.iov_len = recvbuf_size; 665 666 666 667 /* make daemon */ 667 668 allow_signal(SIGTERM); ··· 702 697 goto fail; 703 698 } 704 699 705 - /* build receive message */ 706 - msg.msg_name = &sin_rx; 707 - msg.msg_namelen = sizeof(sin_rx); 708 - msg.msg_control = NULL; 709 - msg.msg_controllen = 0; 710 - 711 700 /* build send message */ 712 701 hc->sendmsg.msg_name = &hc->sin_remote; 713 702 hc->sendmsg.msg_namelen = sizeof(hc->sin_remote); ··· 718 719 printk(KERN_DEBUG "%s: socket created and open\n", 719 720 __func__); 720 721 while (!signal_pending(current)) { 721 - struct kvec iov = { 722 - .iov_base = recvbuf, 723 - .iov_len = recvbuf_size, 724 - }; 725 - recvlen = kernel_recvmsg(socket, &msg, &iov, 1, 726 - recvbuf_size, 0); 722 + iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, 723 + recvbuf_size); 724 + recvlen = sock_recvmsg(socket, &msg, 0); 727 725 if (recvlen > 0) { 728 726 l1oip_socket_parse(hc, &sin_rx, recvbuf, recvlen); 729 727 } else {
+11 -13
drivers/staging/lustre/lnet/lnet/lib-socket.c
··· 314 314 long jiffies_left = timeout * msecs_to_jiffies(MSEC_PER_SEC); 315 315 unsigned long then; 316 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 325 LASSERT(nob > 0); 319 326 LASSERT(jiffies_left > 0); 320 327 321 - for (;;) { 322 - struct kvec iov = { 323 - .iov_base = buffer, 324 - .iov_len = nob 325 - }; 326 - struct msghdr msg = { 327 - .msg_flags = 0 328 - }; 328 + iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, nob); 329 329 330 + for (;;) { 330 331 /* Set receive timeout to remaining time */ 331 332 jiffies_to_timeval(jiffies_left, &tv); 332 333 rc = kernel_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, ··· 339 338 } 340 339 341 340 then = jiffies; 342 - rc = kernel_recvmsg(sock, &msg, &iov, 1, nob, 0); 341 + rc = sock_recvmsg(sock, &msg, 0); 343 342 jiffies_left -= jiffies - then; 344 343 345 344 if (rc < 0) ··· 348 347 if (!rc) 349 348 return -ECONNRESET; 350 349 351 - buffer = ((char *)buffer) + rc; 352 - nob -= rc; 353 - 354 - if (!nob) 350 + if (!msg_data_left(&msg)) 355 351 return 0; 356 352 357 353 if (jiffies_left <= 0)
+2 -2
fs/dlm/lowcomms.c
··· 675 675 nvec = 2; 676 676 } 677 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 - MSG_DONTWAIT | MSG_NOSIGNAL); 680 + r = ret = sock_recvmsg(con->sock, &msg, MSG_DONTWAIT | MSG_NOSIGNAL); 681 681 if (ret <= 0) 682 682 goto out_close; 683 683 else if (ret == len)
+2 -1
fs/ncpfs/sock.c
··· 39 39 { 40 40 struct msghdr msg = {NULL, }; 41 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 46 static int _send(struct socket *sock, const void *buff, int len)
+2 -1
fs/ocfs2/cluster/tcp.c
··· 918 918 { 919 919 struct kvec vec = { .iov_len = len, .iov_base = data, }; 920 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 925 static int o2net_send_tcp_msg(struct socket *sock, struct kvec *vec,
+3 -6
net/netfilter/ipvs/ip_vs_sync.c
··· 1636 1636 ip_vs_receive(struct socket *sock, char *buffer, const size_t buflen) 1637 1637 { 1638 1638 struct msghdr msg = {NULL,}; 1639 - struct kvec iov; 1639 + struct kvec iov = {buffer, buflen}; 1640 1640 int len; 1641 1641 1642 1642 EnterFunction(7); 1643 1643 1644 1644 /* Receive a packet */ 1645 - iov.iov_base = buffer; 1646 - iov.iov_len = (size_t)buflen; 1647 - 1648 - len = kernel_recvmsg(sock, &msg, &iov, 1, buflen, MSG_DONTWAIT); 1649 - 1645 + iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, buflen); 1646 + len = sock_recvmsg(sock, &msg, MSG_DONTWAIT); 1650 1647 if (len < 0) 1651 1648 return len; 1652 1649
+10 -8
net/smc/smc_clc.c
··· 35 35 struct smc_clc_msg_hdr *clcm = buf; 36 36 struct msghdr msg = {NULL, 0}; 37 37 int reason_code = 0; 38 - struct kvec vec; 38 + struct kvec vec = {buf, buflen}; 39 39 int len, datlen; 40 40 int krflags; 41 41 ··· 43 43 * so we don't consume any subsequent CLC message or payload data 44 44 * in the TCP byte stream 45 45 */ 46 - vec.iov_base = buf; 47 - vec.iov_len = buflen; 46 + /* 47 + * Caller must make sure that buflen is no less than 48 + * sizeof(struct smc_clc_msg_hdr) 49 + */ 48 50 krflags = MSG_PEEK | MSG_WAITALL; 49 51 smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; 50 - len = kernel_recvmsg(smc->clcsock, &msg, &vec, 1, 51 - sizeof(struct smc_clc_msg_hdr), krflags); 52 + iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, 53 + sizeof(struct smc_clc_msg_hdr)); 54 + len = sock_recvmsg(smc->clcsock, &msg, krflags); 52 55 if (signal_pending(current)) { 53 56 reason_code = -EINTR; 54 57 clc_sk->sk_err = EINTR; ··· 86 83 } 87 84 88 85 /* receive the complete CLC message */ 89 - vec.iov_base = buf; 90 - vec.iov_len = buflen; 91 86 memset(&msg, 0, sizeof(struct msghdr)); 87 + iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, buflen); 92 88 krflags = MSG_WAITALL; 93 89 smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME; 94 - len = kernel_recvmsg(smc->clcsock, &msg, &vec, 1, datlen, krflags); 90 + len = sock_recvmsg(smc->clcsock, &msg, krflags); 95 91 if (len < datlen) { 96 92 smc->sk.sk_err = EPROTO; 97 93 reason_code = -EPROTO;
+2 -2
net/sunrpc/svcsock.c
··· 338 338 rqstp->rq_xprt_hlen = 0; 339 339 340 340 clear_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); 341 - len = kernel_recvmsg(svsk->sk_sock, &msg, iov, nr, buflen, 342 - msg.msg_flags); 341 + iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, iov, nr, buflen); 342 + len = sock_recvmsg(svsk->sk_sock, &msg, msg.msg_flags); 343 343 /* If we read a full record, then assume there may be more 344 344 * data to read (stream based sockets only!) 345 345 */
+2 -2
net/tipc/server.c
··· 264 264 iov.iov_base = buf; 265 265 iov.iov_len = s->max_rcvbuf_size; 266 266 msg.msg_name = &addr; 267 - ret = kernel_recvmsg(con->sock, &msg, &iov, 1, iov.iov_len, 268 - MSG_DONTWAIT); 267 + iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &iov, 1, iov.iov_len); 268 + ret = sock_recvmsg(con->sock, &msg, MSG_DONTWAIT); 269 269 if (ret <= 0) { 270 270 kmem_cache_free(s->rcvbuf_cache, buf); 271 271 goto out_close;