aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2014-11-24 10:42:55 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2014-12-09 16:29:03 -0500
commitc0371da6047abd261bc483c744dbc7d81a116172 (patch)
tree73b4d685f311a83e04f3a684ce18225b409b3f5f
parentd838df2e5dcbb6ed4d82854869e9a30f9aeef6da (diff)
put iov_iter into msghdr
Note that the code _using_ ->msg_iter at that point will be very unhappy with anything other than unshifted iovec-backed iov_iter. We still need to convert users to proper primitives. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--crypto/algif_hash.c4
-rw-r--r--crypto/algif_skcipher.c4
-rw-r--r--drivers/net/macvtap.c8
-rw-r--r--drivers/net/tun.c8
-rw-r--r--drivers/vhost/net.c8
-rw-r--r--fs/afs/rxrpc.c14
-rw-r--r--include/linux/skbuff.h16
-rw-r--r--include/linux/socket.h3
-rw-r--r--include/net/bluetooth/l2cap.h2
-rw-r--r--include/net/udplite.h3
-rw-r--r--net/atm/common.c5
-rw-r--r--net/bluetooth/6lowpan.c6
-rw-r--r--net/bluetooth/a2mp.c3
-rw-r--r--net/bluetooth/smp.c3
-rw-r--r--net/caif/caif_socket.c2
-rw-r--r--net/compat.c10
-rw-r--r--net/ipv4/ip_output.c6
-rw-r--r--net/ipv4/ping.c3
-rw-r--r--net/ipv4/raw.c3
-rw-r--r--net/ipv4/tcp.c6
-rw-r--r--net/ipv4/tcp_output.c2
-rw-r--r--net/ipv6/ping.c3
-rw-r--r--net/ipv6/raw.c3
-rw-r--r--net/netlink/af_netlink.c2
-rw-r--r--net/packet/af_packet.c7
-rw-r--r--net/rds/recv.c7
-rw-r--r--net/rds/send.c4
-rw-r--r--net/rxrpc/ar-output.c8
-rw-r--r--net/sctp/socket.c5
-rw-r--r--net/socket.c27
-rw-r--r--net/tipc/msg.c4
-rw-r--r--net/unix/af_unix.c10
-rw-r--r--net/vmw_vsock/vmci_transport.c3
33 files changed, 90 insertions, 112 deletions
diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c
index 35c93ff11f35..83cd2cc49c9f 100644
--- a/crypto/algif_hash.c
+++ b/crypto/algif_hash.c
@@ -42,7 +42,7 @@ static int hash_sendmsg(struct kiocb *unused, struct socket *sock,
42 struct alg_sock *ask = alg_sk(sk); 42 struct alg_sock *ask = alg_sk(sk);
43 struct hash_ctx *ctx = ask->private; 43 struct hash_ctx *ctx = ask->private;
44 unsigned long iovlen; 44 unsigned long iovlen;
45 struct iovec *iov; 45 const struct iovec *iov;
46 long copied = 0; 46 long copied = 0;
47 int err; 47 int err;
48 48
@@ -58,7 +58,7 @@ static int hash_sendmsg(struct kiocb *unused, struct socket *sock,
58 58
59 ctx->more = 0; 59 ctx->more = 0;
60 60
61 for (iov = msg->msg_iov, iovlen = msg->msg_iovlen; iovlen > 0; 61 for (iov = msg->msg_iter.iov, iovlen = msg->msg_iter.nr_segs; iovlen > 0;
62 iovlen--, iov++) { 62 iovlen--, iov++) {
63 unsigned long seglen = iov->iov_len; 63 unsigned long seglen = iov->iov_len;
64 char __user *from = iov->iov_base; 64 char __user *from = iov->iov_base;
diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c
index c3b482bee208..4f45dab24648 100644
--- a/crypto/algif_skcipher.c
+++ b/crypto/algif_skcipher.c
@@ -429,13 +429,13 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock,
429 struct skcipher_sg_list *sgl; 429 struct skcipher_sg_list *sgl;
430 struct scatterlist *sg; 430 struct scatterlist *sg;
431 unsigned long iovlen; 431 unsigned long iovlen;
432 struct iovec *iov; 432 const struct iovec *iov;
433 int err = -EAGAIN; 433 int err = -EAGAIN;
434 int used; 434 int used;
435 long copied = 0; 435 long copied = 0;
436 436
437 lock_sock(sk); 437 lock_sock(sk);
438 for (iov = msg->msg_iov, iovlen = msg->msg_iovlen; iovlen > 0; 438 for (iov = msg->msg_iter.iov, iovlen = msg->msg_iter.nr_segs; iovlen > 0;
439 iovlen--, iov++) { 439 iovlen--, iov++) {
440 unsigned long seglen = iov->iov_len; 440 unsigned long seglen = iov->iov_len;
441 char __user *from = iov->iov_base; 441 char __user *from = iov->iov_base;
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index ba1e5db2152e..2c157cced81f 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -1095,9 +1095,7 @@ static int macvtap_sendmsg(struct kiocb *iocb, struct socket *sock,
1095 struct msghdr *m, size_t total_len) 1095 struct msghdr *m, size_t total_len)
1096{ 1096{
1097 struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock); 1097 struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock);
1098 struct iov_iter from; 1098 return macvtap_get_user(q, m, &m->msg_iter, m->msg_flags & MSG_DONTWAIT);
1099 iov_iter_init(&from, WRITE, m->msg_iov, m->msg_iovlen, total_len);
1100 return macvtap_get_user(q, m, &from, m->msg_flags & MSG_DONTWAIT);
1101} 1099}
1102 1100
1103static int macvtap_recvmsg(struct kiocb *iocb, struct socket *sock, 1101static int macvtap_recvmsg(struct kiocb *iocb, struct socket *sock,
@@ -1105,12 +1103,10 @@ static int macvtap_recvmsg(struct kiocb *iocb, struct socket *sock,
1105 int flags) 1103 int flags)
1106{ 1104{
1107 struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock); 1105 struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock);
1108 struct iov_iter to;
1109 int ret; 1106 int ret;
1110 if (flags & ~(MSG_DONTWAIT|MSG_TRUNC)) 1107 if (flags & ~(MSG_DONTWAIT|MSG_TRUNC))
1111 return -EINVAL; 1108 return -EINVAL;
1112 iov_iter_init(&to, READ, m->msg_iov, m->msg_iovlen, total_len); 1109 ret = macvtap_do_read(q, &m->msg_iter, flags & MSG_DONTWAIT);
1113 ret = macvtap_do_read(q, &to, flags & MSG_DONTWAIT);
1114 if (ret > total_len) { 1110 if (ret > total_len) {
1115 m->msg_flags |= MSG_TRUNC; 1111 m->msg_flags |= MSG_TRUNC;
1116 ret = flags & MSG_TRUNC ? ret : total_len; 1112 ret = flags & MSG_TRUNC ? ret : total_len;
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 9c58286b8a42..f3e992ed87ac 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1449,13 +1449,11 @@ static int tun_sendmsg(struct kiocb *iocb, struct socket *sock,
1449 int ret; 1449 int ret;
1450 struct tun_file *tfile = container_of(sock, struct tun_file, socket); 1450 struct tun_file *tfile = container_of(sock, struct tun_file, socket);
1451 struct tun_struct *tun = __tun_get(tfile); 1451 struct tun_struct *tun = __tun_get(tfile);
1452 struct iov_iter from;
1453 1452
1454 if (!tun) 1453 if (!tun)
1455 return -EBADFD; 1454 return -EBADFD;
1456 1455
1457 iov_iter_init(&from, WRITE, m->msg_iov, m->msg_iovlen, total_len); 1456 ret = tun_get_user(tun, tfile, m->msg_control, &m->msg_iter,
1458 ret = tun_get_user(tun, tfile, m->msg_control, &from,
1459 m->msg_flags & MSG_DONTWAIT); 1457 m->msg_flags & MSG_DONTWAIT);
1460 tun_put(tun); 1458 tun_put(tun);
1461 return ret; 1459 return ret;
@@ -1467,7 +1465,6 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
1467{ 1465{
1468 struct tun_file *tfile = container_of(sock, struct tun_file, socket); 1466 struct tun_file *tfile = container_of(sock, struct tun_file, socket);
1469 struct tun_struct *tun = __tun_get(tfile); 1467 struct tun_struct *tun = __tun_get(tfile);
1470 struct iov_iter to;
1471 int ret; 1468 int ret;
1472 1469
1473 if (!tun) 1470 if (!tun)
@@ -1482,8 +1479,7 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
1482 SOL_PACKET, TUN_TX_TIMESTAMP); 1479 SOL_PACKET, TUN_TX_TIMESTAMP);
1483 goto out; 1480 goto out;
1484 } 1481 }
1485 iov_iter_init(&to, READ, m->msg_iov, m->msg_iovlen, total_len); 1482 ret = tun_do_read(tun, tfile, &m->msg_iter, flags & MSG_DONTWAIT);
1486 ret = tun_do_read(tun, tfile, &to, flags & MSG_DONTWAIT);
1487 if (ret > total_len) { 1483 if (ret > total_len) {
1488 m->msg_flags |= MSG_TRUNC; 1484 m->msg_flags |= MSG_TRUNC;
1489 ret = flags & MSG_TRUNC ? ret : total_len; 1485 ret = flags & MSG_TRUNC ? ret : total_len;
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index 8dae2f724a35..9f06e70a2631 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -342,7 +342,6 @@ static void handle_tx(struct vhost_net *net)
342 .msg_namelen = 0, 342 .msg_namelen = 0,
343 .msg_control = NULL, 343 .msg_control = NULL,
344 .msg_controllen = 0, 344 .msg_controllen = 0,
345 .msg_iov = vq->iov,
346 .msg_flags = MSG_DONTWAIT, 345 .msg_flags = MSG_DONTWAIT,
347 }; 346 };
348 size_t len, total_len = 0; 347 size_t len, total_len = 0;
@@ -396,8 +395,8 @@ static void handle_tx(struct vhost_net *net)
396 } 395 }
397 /* Skip header. TODO: support TSO. */ 396 /* Skip header. TODO: support TSO. */
398 s = move_iovec_hdr(vq->iov, nvq->hdr, hdr_size, out); 397 s = move_iovec_hdr(vq->iov, nvq->hdr, hdr_size, out);
399 msg.msg_iovlen = out;
400 len = iov_length(vq->iov, out); 398 len = iov_length(vq->iov, out);
399 iov_iter_init(&msg.msg_iter, WRITE, vq->iov, out, len);
401 /* Sanity check */ 400 /* Sanity check */
402 if (!len) { 401 if (!len) {
403 vq_err(vq, "Unexpected header len for TX: " 402 vq_err(vq, "Unexpected header len for TX: "
@@ -562,7 +561,6 @@ static void handle_rx(struct vhost_net *net)
562 .msg_namelen = 0, 561 .msg_namelen = 0,
563 .msg_control = NULL, /* FIXME: get and handle RX aux data. */ 562 .msg_control = NULL, /* FIXME: get and handle RX aux data. */
564 .msg_controllen = 0, 563 .msg_controllen = 0,
565 .msg_iov = vq->iov,
566 .msg_flags = MSG_DONTWAIT, 564 .msg_flags = MSG_DONTWAIT,
567 }; 565 };
568 struct virtio_net_hdr_mrg_rxbuf hdr = { 566 struct virtio_net_hdr_mrg_rxbuf hdr = {
@@ -600,7 +598,7 @@ static void handle_rx(struct vhost_net *net)
600 break; 598 break;
601 /* On overrun, truncate and discard */ 599 /* On overrun, truncate and discard */
602 if (unlikely(headcount > UIO_MAXIOV)) { 600 if (unlikely(headcount > UIO_MAXIOV)) {
603 msg.msg_iovlen = 1; 601 iov_iter_init(&msg.msg_iter, READ, vq->iov, 1, 1);
604 err = sock->ops->recvmsg(NULL, sock, &msg, 602 err = sock->ops->recvmsg(NULL, sock, &msg,
605 1, MSG_DONTWAIT | MSG_TRUNC); 603 1, MSG_DONTWAIT | MSG_TRUNC);
606 pr_debug("Discarded rx packet: len %zd\n", sock_len); 604 pr_debug("Discarded rx packet: len %zd\n", sock_len);
@@ -626,7 +624,7 @@ static void handle_rx(struct vhost_net *net)
626 /* Copy the header for use in VIRTIO_NET_F_MRG_RXBUF: 624 /* Copy the header for use in VIRTIO_NET_F_MRG_RXBUF:
627 * needed because recvmsg can modify msg_iov. */ 625 * needed because recvmsg can modify msg_iov. */
628 copy_iovec_hdr(vq->iov, nvq->hdr, sock_hlen, in); 626 copy_iovec_hdr(vq->iov, nvq->hdr, sock_hlen, in);
629 msg.msg_iovlen = in; 627 iov_iter_init(&msg.msg_iter, READ, vq->iov, in, sock_len);
630 err = sock->ops->recvmsg(NULL, sock, &msg, 628 err = sock->ops->recvmsg(NULL, sock, &msg,
631 sock_len, MSG_DONTWAIT | MSG_TRUNC); 629 sock_len, MSG_DONTWAIT | MSG_TRUNC);
632 /* Userspace might have consumed the packet meanwhile: 630 /* Userspace might have consumed the packet meanwhile:
diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c
index 03a3beb17004..06e14bfb3496 100644
--- a/fs/afs/rxrpc.c
+++ b/fs/afs/rxrpc.c
@@ -306,8 +306,8 @@ static int afs_send_pages(struct afs_call *call, struct msghdr *msg,
306 306
307 _debug("- range %u-%u%s", 307 _debug("- range %u-%u%s",
308 offset, to, msg->msg_flags ? " [more]" : ""); 308 offset, to, msg->msg_flags ? " [more]" : "");
309 msg->msg_iov = (struct iovec *) iov; 309 iov_iter_init(&msg->msg_iter, WRITE,
310 msg->msg_iovlen = 1; 310 (struct iovec *) iov, 1, to - offset);
311 311
312 /* have to change the state *before* sending the last 312 /* have to change the state *before* sending the last
313 * packet as RxRPC might give us the reply before it 313 * packet as RxRPC might give us the reply before it
@@ -384,8 +384,8 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp,
384 384
385 msg.msg_name = NULL; 385 msg.msg_name = NULL;
386 msg.msg_namelen = 0; 386 msg.msg_namelen = 0;
387 msg.msg_iov = (struct iovec *) iov; 387 iov_iter_init(&msg.msg_iter, WRITE, (struct iovec *)iov, 1,
388 msg.msg_iovlen = 1; 388 call->request_size);
389 msg.msg_control = NULL; 389 msg.msg_control = NULL;
390 msg.msg_controllen = 0; 390 msg.msg_controllen = 0;
391 msg.msg_flags = (call->send_pages ? MSG_MORE : 0); 391 msg.msg_flags = (call->send_pages ? MSG_MORE : 0);
@@ -778,8 +778,7 @@ void afs_send_empty_reply(struct afs_call *call)
778 iov[0].iov_len = 0; 778 iov[0].iov_len = 0;
779 msg.msg_name = NULL; 779 msg.msg_name = NULL;
780 msg.msg_namelen = 0; 780 msg.msg_namelen = 0;
781 msg.msg_iov = iov; 781 iov_iter_init(&msg.msg_iter, WRITE, iov, 0, 0); /* WTF? */
782 msg.msg_iovlen = 0;
783 msg.msg_control = NULL; 782 msg.msg_control = NULL;
784 msg.msg_controllen = 0; 783 msg.msg_controllen = 0;
785 msg.msg_flags = 0; 784 msg.msg_flags = 0;
@@ -815,8 +814,7 @@ void afs_send_simple_reply(struct afs_call *call, const void *buf, size_t len)
815 iov[0].iov_len = len; 814 iov[0].iov_len = len;
816 msg.msg_name = NULL; 815 msg.msg_name = NULL;
817 msg.msg_namelen = 0; 816 msg.msg_namelen = 0;
818 msg.msg_iov = iov; 817 iov_iter_init(&msg.msg_iter, WRITE, iov, 1, len);
819 msg.msg_iovlen = 1;
820 msg.msg_control = NULL; 818 msg.msg_control = NULL;
821 msg.msg_controllen = 0; 819 msg.msg_controllen = 0;
822 msg.msg_flags = 0; 820 msg.msg_flags = 0;
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index ef64cec42804..52cf1bdac0d8 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -2646,22 +2646,24 @@ unsigned int datagram_poll(struct file *file, struct socket *sock,
2646 struct poll_table_struct *wait); 2646 struct poll_table_struct *wait);
2647int skb_copy_datagram_iovec(const struct sk_buff *from, int offset, 2647int skb_copy_datagram_iovec(const struct sk_buff *from, int offset,
2648 struct iovec *to, int size); 2648 struct iovec *to, int size);
2649int skb_copy_datagram_iter(const struct sk_buff *from, int offset,
2650 struct iov_iter *to, int size);
2649static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset, 2651static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset,
2650 struct msghdr *msg, int size) 2652 struct msghdr *msg, int size)
2651{ 2653{
2652 return skb_copy_datagram_iovec(from, offset, msg->msg_iov, size); 2654 /* XXX: stripping const */
2655 return skb_copy_datagram_iovec(from, offset, (struct iovec *)msg->msg_iter.iov, size);
2653} 2656}
2654int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, int hlen, 2657int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, int hlen,
2655 struct iovec *iov); 2658 struct iovec *iov);
2656static inline int skb_copy_and_csum_datagram_msg(struct sk_buff *skb, int hlen, 2659static inline int skb_copy_and_csum_datagram_msg(struct sk_buff *skb, int hlen,
2657 struct msghdr *msg) 2660 struct msghdr *msg)
2658{ 2661{
2659 return skb_copy_and_csum_datagram_iovec(skb, hlen, msg->msg_iov); 2662 /* XXX: stripping const */
2663 return skb_copy_and_csum_datagram_iovec(skb, hlen, (struct iovec *)msg->msg_iter.iov);
2660} 2664}
2661int skb_copy_datagram_from_iter(struct sk_buff *skb, int offset, 2665int skb_copy_datagram_from_iter(struct sk_buff *skb, int offset,
2662 struct iov_iter *from, int len); 2666 struct iov_iter *from, int len);
2663int skb_copy_datagram_iter(const struct sk_buff *from, int offset,
2664 struct iov_iter *to, int size);
2665int zerocopy_sg_from_iter(struct sk_buff *skb, struct iov_iter *frm); 2667int zerocopy_sg_from_iter(struct sk_buff *skb, struct iov_iter *frm);
2666void skb_free_datagram(struct sock *sk, struct sk_buff *skb); 2668void skb_free_datagram(struct sock *sk, struct sk_buff *skb);
2667void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb); 2669void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb);
@@ -2689,12 +2691,14 @@ int skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci);
2689 2691
2690static inline int memcpy_from_msg(void *data, struct msghdr *msg, int len) 2692static inline int memcpy_from_msg(void *data, struct msghdr *msg, int len)
2691{ 2693{
2692 return memcpy_fromiovec(data, msg->msg_iov, len); 2694 /* XXX: stripping const */
2695 return memcpy_fromiovec(data, (struct iovec *)msg->msg_iter.iov, len);
2693} 2696}
2694 2697
2695static inline int memcpy_to_msg(struct msghdr *msg, void *data, int len) 2698static inline int memcpy_to_msg(struct msghdr *msg, void *data, int len)
2696{ 2699{
2697 return memcpy_toiovec(msg->msg_iov, data, len); 2700 /* XXX: stripping const */
2701 return memcpy_toiovec((struct iovec *)msg->msg_iter.iov, data, len);
2698} 2702}
2699 2703
2700struct skb_checksum_ops { 2704struct skb_checksum_ops {
diff --git a/include/linux/socket.h b/include/linux/socket.h
index de5222832be4..048d6d6eed6d 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -47,8 +47,7 @@ struct linger {
47struct msghdr { 47struct msghdr {
48 void *msg_name; /* ptr to socket address structure */ 48 void *msg_name; /* ptr to socket address structure */
49 int msg_namelen; /* size of socket address structure */ 49 int msg_namelen; /* size of socket address structure */
50 struct iovec *msg_iov; /* scatter/gather array */ 50 struct iov_iter msg_iter; /* data */
51 __kernel_size_t msg_iovlen; /* # elements in msg_iov */
52 void *msg_control; /* ancillary data */ 51 void *msg_control; /* ancillary data */
53 __kernel_size_t msg_controllen; /* ancillary data buffer length */ 52 __kernel_size_t msg_controllen; /* ancillary data buffer length */
54 unsigned int msg_flags; /* flags on received message */ 53 unsigned int msg_flags; /* flags on received message */
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
index 4e23674d3649..bca6fc0a3196 100644
--- a/include/net/bluetooth/l2cap.h
+++ b/include/net/bluetooth/l2cap.h
@@ -911,7 +911,7 @@ static inline int l2cap_chan_no_memcpy_fromiovec(struct l2cap_chan *chan,
911 /* Following is safe since for compiler definitions of kvec and 911 /* Following is safe since for compiler definitions of kvec and
912 * iovec are identical, yielding the same in-core layout and alignment 912 * iovec are identical, yielding the same in-core layout and alignment
913 */ 913 */
914 struct kvec *vec = (struct kvec *)msg->msg_iov; 914 struct kvec *vec = (struct kvec *)msg->msg_iter.iov;
915 915
916 while (len > 0) { 916 while (len > 0) {
917 if (vec->iov_len) { 917 if (vec->iov_len) {
diff --git a/include/net/udplite.h b/include/net/udplite.h
index d5baaba65b46..ae7c8d1fbcad 100644
--- a/include/net/udplite.h
+++ b/include/net/udplite.h
@@ -20,7 +20,8 @@ static __inline__ int udplite_getfrag(void *from, char *to, int offset,
20 int len, int odd, struct sk_buff *skb) 20 int len, int odd, struct sk_buff *skb)
21{ 21{
22 struct msghdr *msg = from; 22 struct msghdr *msg = from;
23 return memcpy_fromiovecend(to, msg->msg_iov, offset, len); 23 /* XXX: stripping const */
24 return memcpy_fromiovecend(to, (struct iovec *)msg->msg_iter.iov, offset, len);
24} 25}
25 26
26/* Designate sk as UDP-Lite socket */ 27/* Designate sk as UDP-Lite socket */
diff --git a/net/atm/common.c b/net/atm/common.c
index f59112944c91..b84057e41bd6 100644
--- a/net/atm/common.c
+++ b/net/atm/common.c
@@ -577,9 +577,6 @@ int vcc_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
577 struct atm_vcc *vcc; 577 struct atm_vcc *vcc;
578 struct sk_buff *skb; 578 struct sk_buff *skb;
579 int eff, error; 579 int eff, error;
580 struct iov_iter from;
581
582 iov_iter_init(&from, WRITE, m->msg_iov, m->msg_iovlen, size);
583 580
584 lock_sock(sk); 581 lock_sock(sk);
585 if (sock->state != SS_CONNECTED) { 582 if (sock->state != SS_CONNECTED) {
@@ -634,7 +631,7 @@ int vcc_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
634 goto out; 631 goto out;
635 skb->dev = NULL; /* for paths shared with net_device interfaces */ 632 skb->dev = NULL; /* for paths shared with net_device interfaces */
636 ATM_SKB(skb)->atm_options = vcc->atm_options; 633 ATM_SKB(skb)->atm_options = vcc->atm_options;
637 if (copy_from_iter(skb_put(skb, size), size, &from) != size) { 634 if (copy_from_iter(skb_put(skb, size), size, &m->msg_iter) != size) {
638 kfree_skb(skb); 635 kfree_skb(skb);
639 error = -EFAULT; 636 error = -EFAULT;
640 goto out; 637 goto out;
diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c
index bdcaefd2db12..d8c67a5e7a02 100644
--- a/net/bluetooth/6lowpan.c
+++ b/net/bluetooth/6lowpan.c
@@ -537,12 +537,12 @@ static int send_pkt(struct l2cap_chan *chan, struct sk_buff *skb,
537 */ 537 */
538 chan->data = skb; 538 chan->data = skb;
539 539
540 memset(&msg, 0, sizeof(msg));
541 msg.msg_iov = (struct iovec *) &iv;
542 msg.msg_iovlen = 1;
543 iv.iov_base = skb->data; 540 iv.iov_base = skb->data;
544 iv.iov_len = skb->len; 541 iv.iov_len = skb->len;
545 542
543 memset(&msg, 0, sizeof(msg));
544 iov_iter_init(&msg.msg_iter, WRITE, (struct iovec *) &iv, 1, skb->len);
545
546 err = l2cap_chan_send(chan, &msg, skb->len); 546 err = l2cap_chan_send(chan, &msg, skb->len);
547 if (err > 0) { 547 if (err > 0) {
548 netdev->stats.tx_bytes += err; 548 netdev->stats.tx_bytes += err;
diff --git a/net/bluetooth/a2mp.c b/net/bluetooth/a2mp.c
index 5dcade511fdb..716d2a388858 100644
--- a/net/bluetooth/a2mp.c
+++ b/net/bluetooth/a2mp.c
@@ -60,8 +60,7 @@ void a2mp_send(struct amp_mgr *mgr, u8 code, u8 ident, u16 len, void *data)
60 60
61 memset(&msg, 0, sizeof(msg)); 61 memset(&msg, 0, sizeof(msg));
62 62
63 msg.msg_iov = (struct iovec *) &iv; 63 iov_iter_init(&msg.msg_iter, WRITE, (struct iovec *)&iv, 1, total_len);
64 msg.msg_iovlen = 1;
65 64
66 l2cap_chan_send(chan, &msg, total_len); 65 l2cap_chan_send(chan, &msg, total_len);
67 66
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
index 069b76e03b57..21f555b4df17 100644
--- a/net/bluetooth/smp.c
+++ b/net/bluetooth/smp.c
@@ -268,8 +268,7 @@ static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
268 268
269 memset(&msg, 0, sizeof(msg)); 269 memset(&msg, 0, sizeof(msg));
270 270
271 msg.msg_iov = (struct iovec *) &iv; 271 iov_iter_init(&msg.msg_iter, WRITE, (struct iovec *)iv, 2, 1 + len);
272 msg.msg_iovlen = 2;
273 272
274 l2cap_chan_send(chan, &msg, 1 + len); 273 l2cap_chan_send(chan, &msg, 1 + len);
275 274
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
index ac618b0b8a4f..769b185fefbd 100644
--- a/net/caif/caif_socket.c
+++ b/net/caif/caif_socket.c
@@ -535,7 +535,7 @@ static int caif_seqpkt_sendmsg(struct kiocb *kiocb, struct socket *sock,
535 goto err; 535 goto err;
536 536
537 ret = -EINVAL; 537 ret = -EINVAL;
538 if (unlikely(msg->msg_iov->iov_base == NULL)) 538 if (unlikely(msg->msg_iter.iov->iov_base == NULL))
539 goto err; 539 goto err;
540 noblock = msg->msg_flags & MSG_DONTWAIT; 540 noblock = msg->msg_flags & MSG_DONTWAIT;
541 541
diff --git a/net/compat.c b/net/compat.c
index 062f157d2a6b..3236b4167a32 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -37,13 +37,14 @@ ssize_t get_compat_msghdr(struct msghdr *kmsg,
37 struct iovec **iov) 37 struct iovec **iov)
38{ 38{
39 compat_uptr_t uaddr, uiov, tmp3; 39 compat_uptr_t uaddr, uiov, tmp3;
40 compat_size_t nr_segs;
40 ssize_t err; 41 ssize_t err;
41 42
42 if (!access_ok(VERIFY_READ, umsg, sizeof(*umsg)) || 43 if (!access_ok(VERIFY_READ, umsg, sizeof(*umsg)) ||
43 __get_user(uaddr, &umsg->msg_name) || 44 __get_user(uaddr, &umsg->msg_name) ||
44 __get_user(kmsg->msg_namelen, &umsg->msg_namelen) || 45 __get_user(kmsg->msg_namelen, &umsg->msg_namelen) ||
45 __get_user(uiov, &umsg->msg_iov) || 46 __get_user(uiov, &umsg->msg_iov) ||
46 __get_user(kmsg->msg_iovlen, &umsg->msg_iovlen) || 47 __get_user(nr_segs, &umsg->msg_iovlen) ||
47 __get_user(tmp3, &umsg->msg_control) || 48 __get_user(tmp3, &umsg->msg_control) ||
48 __get_user(kmsg->msg_controllen, &umsg->msg_controllen) || 49 __get_user(kmsg->msg_controllen, &umsg->msg_controllen) ||
49 __get_user(kmsg->msg_flags, &umsg->msg_flags)) 50 __get_user(kmsg->msg_flags, &umsg->msg_flags))
@@ -68,14 +69,15 @@ ssize_t get_compat_msghdr(struct msghdr *kmsg,
68 kmsg->msg_namelen = 0; 69 kmsg->msg_namelen = 0;
69 } 70 }
70 71
71 if (kmsg->msg_iovlen > UIO_MAXIOV) 72 if (nr_segs > UIO_MAXIOV)
72 return -EMSGSIZE; 73 return -EMSGSIZE;
73 74
74 err = compat_rw_copy_check_uvector(save_addr ? READ : WRITE, 75 err = compat_rw_copy_check_uvector(save_addr ? READ : WRITE,
75 compat_ptr(uiov), kmsg->msg_iovlen, 76 compat_ptr(uiov), nr_segs,
76 UIO_FASTIOV, *iov, iov); 77 UIO_FASTIOV, *iov, iov);
77 if (err >= 0) 78 if (err >= 0)
78 kmsg->msg_iov = *iov; 79 iov_iter_init(&kmsg->msg_iter, save_addr ? READ : WRITE,
80 *iov, nr_segs, err);
79 return err; 81 return err;
80} 82}
81 83
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index cdedcf144463..b50861b22b6b 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -755,11 +755,13 @@ ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk
755 struct msghdr *msg = from; 755 struct msghdr *msg = from;
756 756
757 if (skb->ip_summed == CHECKSUM_PARTIAL) { 757 if (skb->ip_summed == CHECKSUM_PARTIAL) {
758 if (memcpy_fromiovecend(to, msg->msg_iov, offset, len) < 0) 758 /* XXX: stripping const */
759 if (memcpy_fromiovecend(to, (struct iovec *)msg->msg_iter.iov, offset, len) < 0)
759 return -EFAULT; 760 return -EFAULT;
760 } else { 761 } else {
761 __wsum csum = 0; 762 __wsum csum = 0;
762 if (csum_partial_copy_fromiovecend(to, msg->msg_iov, offset, len, &csum) < 0) 763 /* XXX: stripping const */
764 if (csum_partial_copy_fromiovecend(to, (struct iovec *)msg->msg_iter.iov, offset, len, &csum) < 0)
763 return -EFAULT; 765 return -EFAULT;
764 skb->csum = csum_block_add(skb->csum, csum, odd); 766 skb->csum = csum_block_add(skb->csum, csum, odd);
765 } 767 }
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
index 8dd4ae0424fc..c0d82f78d364 100644
--- a/net/ipv4/ping.c
+++ b/net/ipv4/ping.c
@@ -811,7 +811,8 @@ back_from_confirm:
811 pfh.icmph.checksum = 0; 811 pfh.icmph.checksum = 0;
812 pfh.icmph.un.echo.id = inet->inet_sport; 812 pfh.icmph.un.echo.id = inet->inet_sport;
813 pfh.icmph.un.echo.sequence = user_icmph.un.echo.sequence; 813 pfh.icmph.un.echo.sequence = user_icmph.un.echo.sequence;
814 pfh.iov = msg->msg_iov; 814 /* XXX: stripping const */
815 pfh.iov = (struct iovec *)msg->msg_iter.iov;
815 pfh.wcheck = 0; 816 pfh.wcheck = 0;
816 pfh.family = AF_INET; 817 pfh.family = AF_INET;
817 818
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 5d83bd2fcedb..0bb68df5055d 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -625,7 +625,8 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
625back_from_confirm: 625back_from_confirm:
626 626
627 if (inet->hdrincl) 627 if (inet->hdrincl)
628 err = raw_send_hdrinc(sk, &fl4, msg->msg_iov, len, 628 /* XXX: stripping const */
629 err = raw_send_hdrinc(sk, &fl4, (struct iovec *)msg->msg_iter.iov, len,
629 &rt, msg->msg_flags); 630 &rt, msg->msg_flags);
630 631
631 else { 632 else {
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 4a96f3730170..54ba6209eea9 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1085,7 +1085,7 @@ static int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg,
1085int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, 1085int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
1086 size_t size) 1086 size_t size)
1087{ 1087{
1088 struct iovec *iov; 1088 const struct iovec *iov;
1089 struct tcp_sock *tp = tcp_sk(sk); 1089 struct tcp_sock *tp = tcp_sk(sk);
1090 struct sk_buff *skb; 1090 struct sk_buff *skb;
1091 int iovlen, flags, err, copied = 0; 1091 int iovlen, flags, err, copied = 0;
@@ -1136,8 +1136,8 @@ int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
1136 mss_now = tcp_send_mss(sk, &size_goal, flags); 1136 mss_now = tcp_send_mss(sk, &size_goal, flags);
1137 1137
1138 /* Ok commence sending. */ 1138 /* Ok commence sending. */
1139 iovlen = msg->msg_iovlen; 1139 iovlen = msg->msg_iter.nr_segs;
1140 iov = msg->msg_iov; 1140 iov = msg->msg_iter.iov;
1141 copied = 0; 1141 copied = 0;
1142 1142
1143 err = -EPIPE; 1143 err = -EPIPE;
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index f5bd4bd3f7e6..3e225b03eb95 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -3050,7 +3050,7 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn)
3050 syn_data->ip_summed = CHECKSUM_PARTIAL; 3050 syn_data->ip_summed = CHECKSUM_PARTIAL;
3051 memcpy(syn_data->cb, syn->cb, sizeof(syn->cb)); 3051 memcpy(syn_data->cb, syn->cb, sizeof(syn->cb));
3052 if (unlikely(memcpy_fromiovecend(skb_put(syn_data, space), 3052 if (unlikely(memcpy_fromiovecend(skb_put(syn_data, space),
3053 fo->data->msg_iov, 0, space))) { 3053 fo->data->msg_iter.iov, 0, space))) {
3054 kfree_skb(syn_data); 3054 kfree_skb(syn_data);
3055 goto fallback; 3055 goto fallback;
3056 } 3056 }
diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c
index 5b7a1ed2aba9..2d3148378a1f 100644
--- a/net/ipv6/ping.c
+++ b/net/ipv6/ping.c
@@ -163,7 +163,8 @@ int ping_v6_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
163 pfh.icmph.checksum = 0; 163 pfh.icmph.checksum = 0;
164 pfh.icmph.un.echo.id = inet->inet_sport; 164 pfh.icmph.un.echo.id = inet->inet_sport;
165 pfh.icmph.un.echo.sequence = user_icmph.icmp6_sequence; 165 pfh.icmph.un.echo.sequence = user_icmph.icmp6_sequence;
166 pfh.iov = msg->msg_iov; 166 /* XXX: stripping const */
167 pfh.iov = (struct iovec *)msg->msg_iter.iov;
167 pfh.wcheck = 0; 168 pfh.wcheck = 0;
168 pfh.family = AF_INET6; 169 pfh.family = AF_INET6;
169 170
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 11a9283fda51..ee25631f8c29 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -886,7 +886,8 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
886 886
887back_from_confirm: 887back_from_confirm:
888 if (inet->hdrincl) 888 if (inet->hdrincl)
889 err = rawv6_send_hdrinc(sk, msg->msg_iov, len, &fl6, &dst, msg->msg_flags); 889 /* XXX: stripping const */
890 err = rawv6_send_hdrinc(sk, (struct iovec *)msg->msg_iter.iov, len, &fl6, &dst, msg->msg_flags);
890 else { 891 else {
891 lock_sock(sk); 892 lock_sock(sk);
892 err = ip6_append_data(sk, raw6_getfrag, &rfv, 893 err = ip6_append_data(sk, raw6_getfrag, &rfv,
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 63aa5c8acf12..cc9bcf008b03 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -2305,7 +2305,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
2305 } 2305 }
2306 2306
2307 if (netlink_tx_is_mmaped(sk) && 2307 if (netlink_tx_is_mmaped(sk) &&
2308 msg->msg_iov->iov_base == NULL) { 2308 msg->msg_iter.iov->iov_base == NULL) {
2309 err = netlink_mmap_sendmsg(sk, msg, dst_portid, dst_group, 2309 err = netlink_mmap_sendmsg(sk, msg, dst_portid, dst_group,
2310 siocb); 2310 siocb);
2311 goto out; 2311 goto out;
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index efa844501136..ed2e620b61df 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -2408,11 +2408,8 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
2408 unsigned short gso_type = 0; 2408 unsigned short gso_type = 0;
2409 int hlen, tlen; 2409 int hlen, tlen;
2410 int extra_len = 0; 2410 int extra_len = 0;
2411 struct iov_iter from;
2412 ssize_t n; 2411 ssize_t n;
2413 2412
2414 iov_iter_init(&from, WRITE, msg->msg_iov, msg->msg_iovlen, len);
2415
2416 /* 2413 /*
2417 * Get and verify the address. 2414 * Get and verify the address.
2418 */ 2415 */
@@ -2451,7 +2448,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
2451 len -= vnet_hdr_len; 2448 len -= vnet_hdr_len;
2452 2449
2453 err = -EFAULT; 2450 err = -EFAULT;
2454 n = copy_from_iter(&vnet_hdr, vnet_hdr_len, &from); 2451 n = copy_from_iter(&vnet_hdr, vnet_hdr_len, &msg->msg_iter);
2455 if (n != vnet_hdr_len) 2452 if (n != vnet_hdr_len)
2456 goto out_unlock; 2453 goto out_unlock;
2457 2454
@@ -2522,7 +2519,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
2522 } 2519 }
2523 2520
2524 /* Returns -EFAULT on error */ 2521 /* Returns -EFAULT on error */
2525 err = skb_copy_datagram_from_iter(skb, offset, &from, len); 2522 err = skb_copy_datagram_from_iter(skb, offset, &msg->msg_iter, len);
2526 if (err) 2523 if (err)
2527 goto out_free; 2524 goto out_free;
2528 2525
diff --git a/net/rds/recv.c b/net/rds/recv.c
index 47d7b1029b33..f9ec1acd801c 100644
--- a/net/rds/recv.c
+++ b/net/rds/recv.c
@@ -404,7 +404,6 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
404 int ret = 0, nonblock = msg_flags & MSG_DONTWAIT; 404 int ret = 0, nonblock = msg_flags & MSG_DONTWAIT;
405 DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name); 405 DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name);
406 struct rds_incoming *inc = NULL; 406 struct rds_incoming *inc = NULL;
407 struct iov_iter to;
408 407
409 /* udp_recvmsg()->sock_recvtimeo() gets away without locking too.. */ 408 /* udp_recvmsg()->sock_recvtimeo() gets away without locking too.. */
410 timeo = sock_rcvtimeo(sk, nonblock); 409 timeo = sock_rcvtimeo(sk, nonblock);
@@ -415,6 +414,7 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
415 goto out; 414 goto out;
416 415
417 while (1) { 416 while (1) {
417 struct iov_iter save;
418 /* If there are pending notifications, do those - and nothing else */ 418 /* If there are pending notifications, do those - and nothing else */
419 if (!list_empty(&rs->rs_notify_queue)) { 419 if (!list_empty(&rs->rs_notify_queue)) {
420 ret = rds_notify_queue_get(rs, msg); 420 ret = rds_notify_queue_get(rs, msg);
@@ -450,8 +450,8 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
450 rdsdebug("copying inc %p from %pI4:%u to user\n", inc, 450 rdsdebug("copying inc %p from %pI4:%u to user\n", inc,
451 &inc->i_conn->c_faddr, 451 &inc->i_conn->c_faddr,
452 ntohs(inc->i_hdr.h_sport)); 452 ntohs(inc->i_hdr.h_sport));
453 iov_iter_init(&to, READ, msg->msg_iov, msg->msg_iovlen, size); 453 save = msg->msg_iter;
454 ret = inc->i_conn->c_trans->inc_copy_to_user(inc, &to); 454 ret = inc->i_conn->c_trans->inc_copy_to_user(inc, &msg->msg_iter);
455 if (ret < 0) 455 if (ret < 0)
456 break; 456 break;
457 457
@@ -464,6 +464,7 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
464 rds_inc_put(inc); 464 rds_inc_put(inc);
465 inc = NULL; 465 inc = NULL;
466 rds_stats_inc(s_recv_deliver_raced); 466 rds_stats_inc(s_recv_deliver_raced);
467 msg->msg_iter = save;
467 continue; 468 continue;
468 } 469 }
469 470
diff --git a/net/rds/send.c b/net/rds/send.c
index 4de62ead1c71..40a5629a0a13 100644
--- a/net/rds/send.c
+++ b/net/rds/send.c
@@ -934,9 +934,7 @@ int rds_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
934 int queued = 0, allocated_mr = 0; 934 int queued = 0, allocated_mr = 0;
935 int nonblock = msg->msg_flags & MSG_DONTWAIT; 935 int nonblock = msg->msg_flags & MSG_DONTWAIT;
936 long timeo = sock_sndtimeo(sk, nonblock); 936 long timeo = sock_sndtimeo(sk, nonblock);
937 struct iov_iter from;
938 937
939 iov_iter_init(&from, WRITE, msg->msg_iov, msg->msg_iovlen, payload_len);
940 /* Mirror Linux UDP mirror of BSD error message compatibility */ 938 /* Mirror Linux UDP mirror of BSD error message compatibility */
941 /* XXX: Perhaps MSG_MORE someday */ 939 /* XXX: Perhaps MSG_MORE someday */
942 if (msg->msg_flags & ~(MSG_DONTWAIT | MSG_CMSG_COMPAT)) { 940 if (msg->msg_flags & ~(MSG_DONTWAIT | MSG_CMSG_COMPAT)) {
@@ -984,7 +982,7 @@ int rds_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
984 ret = -ENOMEM; 982 ret = -ENOMEM;
985 goto out; 983 goto out;
986 } 984 }
987 ret = rds_message_copy_from_user(rm, &from); 985 ret = rds_message_copy_from_user(rm, &msg->msg_iter);
988 if (ret) 986 if (ret)
989 goto out; 987 goto out;
990 } 988 }
diff --git a/net/rxrpc/ar-output.c b/net/rxrpc/ar-output.c
index 0b4b9a79f5ab..86e0f10aa2c0 100644
--- a/net/rxrpc/ar-output.c
+++ b/net/rxrpc/ar-output.c
@@ -531,14 +531,12 @@ static int rxrpc_send_data(struct kiocb *iocb,
531 struct rxrpc_skb_priv *sp; 531 struct rxrpc_skb_priv *sp;
532 unsigned char __user *from; 532 unsigned char __user *from;
533 struct sk_buff *skb; 533 struct sk_buff *skb;
534 struct iovec *iov; 534 const struct iovec *iov;
535 struct sock *sk = &rx->sk; 535 struct sock *sk = &rx->sk;
536 long timeo; 536 long timeo;
537 bool more; 537 bool more;
538 int ret, ioc, segment, copied; 538 int ret, ioc, segment, copied;
539 539
540 _enter(",,,{%zu},%zu", msg->msg_iovlen, len);
541
542 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); 540 timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT);
543 541
544 /* this should be in poll */ 542 /* this should be in poll */
@@ -547,8 +545,8 @@ static int rxrpc_send_data(struct kiocb *iocb,
547 if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) 545 if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
548 return -EPIPE; 546 return -EPIPE;
549 547
550 iov = msg->msg_iov; 548 iov = msg->msg_iter.iov;
551 ioc = msg->msg_iovlen - 1; 549 ioc = msg->msg_iter.nr_segs - 1;
552 from = iov->iov_base; 550 from = iov->iov_base;
553 segment = iov->iov_len; 551 segment = iov->iov_len;
554 iov++; 552 iov++;
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 0397ac9fd98c..c92f96cda699 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -1609,9 +1609,6 @@ static int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
1609 __u16 sinfo_flags = 0; 1609 __u16 sinfo_flags = 0;
1610 long timeo; 1610 long timeo;
1611 int err; 1611 int err;
1612 struct iov_iter from;
1613
1614 iov_iter_init(&from, WRITE, msg->msg_iov, msg->msg_iovlen, msg_len);
1615 1612
1616 err = 0; 1613 err = 0;
1617 sp = sctp_sk(sk); 1614 sp = sctp_sk(sk);
@@ -1950,7 +1947,7 @@ static int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
1950 } 1947 }
1951 1948
1952 /* Break the message into multiple chunks of maximum size. */ 1949 /* Break the message into multiple chunks of maximum size. */
1953 datamsg = sctp_datamsg_from_user(asoc, sinfo, &from); 1950 datamsg = sctp_datamsg_from_user(asoc, sinfo, &msg->msg_iter);
1954 if (IS_ERR(datamsg)) { 1951 if (IS_ERR(datamsg)) {
1955 err = PTR_ERR(datamsg); 1952 err = PTR_ERR(datamsg);
1956 goto out_free; 1953 goto out_free;
diff --git a/net/socket.c b/net/socket.c
index f676ac4a3701..8809afccf7fa 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -689,8 +689,7 @@ int kernel_sendmsg(struct socket *sock, struct msghdr *msg,
689 * the following is safe, since for compiler definitions of kvec and 689 * the following is safe, since for compiler definitions of kvec and
690 * iovec are identical, yielding the same in-core layout and alignment 690 * iovec are identical, yielding the same in-core layout and alignment
691 */ 691 */
692 msg->msg_iov = (struct iovec *)vec; 692 iov_iter_init(&msg->msg_iter, WRITE, (struct iovec *)vec, num, size);
693 msg->msg_iovlen = num;
694 result = sock_sendmsg(sock, msg, size); 693 result = sock_sendmsg(sock, msg, size);
695 set_fs(oldfs); 694 set_fs(oldfs);
696 return result; 695 return result;
@@ -853,7 +852,7 @@ int kernel_recvmsg(struct socket *sock, struct msghdr *msg,
853 * the following is safe, since for compiler definitions of kvec and 852 * the following is safe, since for compiler definitions of kvec and
854 * iovec are identical, yielding the same in-core layout and alignment 853 * iovec are identical, yielding the same in-core layout and alignment
855 */ 854 */
856 msg->msg_iov = (struct iovec *)vec, msg->msg_iovlen = num; 855 iov_iter_init(&msg->msg_iter, READ, (struct iovec *)vec, num, size);
857 result = sock_recvmsg(sock, msg, size, flags); 856 result = sock_recvmsg(sock, msg, size, flags);
858 set_fs(oldfs); 857 set_fs(oldfs);
859 return result; 858 return result;
@@ -913,8 +912,7 @@ static ssize_t do_sock_read(struct msghdr *msg, struct kiocb *iocb,
913 msg->msg_namelen = 0; 912 msg->msg_namelen = 0;
914 msg->msg_control = NULL; 913 msg->msg_control = NULL;
915 msg->msg_controllen = 0; 914 msg->msg_controllen = 0;
916 msg->msg_iov = (struct iovec *)iov; 915 iov_iter_init(&msg->msg_iter, READ, iov, nr_segs, size);
917 msg->msg_iovlen = nr_segs;
918 msg->msg_flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0; 916 msg->msg_flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0;
919 917
920 return __sock_recvmsg(iocb, sock, msg, size, msg->msg_flags); 918 return __sock_recvmsg(iocb, sock, msg, size, msg->msg_flags);
@@ -953,8 +951,7 @@ static ssize_t do_sock_write(struct msghdr *msg, struct kiocb *iocb,
953 msg->msg_namelen = 0; 951 msg->msg_namelen = 0;
954 msg->msg_control = NULL; 952 msg->msg_control = NULL;
955 msg->msg_controllen = 0; 953 msg->msg_controllen = 0;
956 msg->msg_iov = (struct iovec *)iov; 954 iov_iter_init(&msg->msg_iter, WRITE, iov, nr_segs, size);
957 msg->msg_iovlen = nr_segs;
958 msg->msg_flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0; 955 msg->msg_flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0;
959 if (sock->type == SOCK_SEQPACKET) 956 if (sock->type == SOCK_SEQPACKET)
960 msg->msg_flags |= MSG_EOR; 957 msg->msg_flags |= MSG_EOR;
@@ -1798,8 +1795,7 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
1798 iov.iov_base = buff; 1795 iov.iov_base = buff;
1799 iov.iov_len = len; 1796 iov.iov_len = len;
1800 msg.msg_name = NULL; 1797 msg.msg_name = NULL;
1801 msg.msg_iov = &iov; 1798 iov_iter_init(&msg.msg_iter, WRITE, &iov, 1, len);
1802 msg.msg_iovlen = 1;
1803 msg.msg_control = NULL; 1799 msg.msg_control = NULL;
1804 msg.msg_controllen = 0; 1800 msg.msg_controllen = 0;
1805 msg.msg_namelen = 0; 1801 msg.msg_namelen = 0;
@@ -1856,10 +1852,9 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
1856 1852
1857 msg.msg_control = NULL; 1853 msg.msg_control = NULL;
1858 msg.msg_controllen = 0; 1854 msg.msg_controllen = 0;
1859 msg.msg_iovlen = 1;
1860 msg.msg_iov = &iov;
1861 iov.iov_len = size; 1855 iov.iov_len = size;
1862 iov.iov_base = ubuf; 1856 iov.iov_base = ubuf;
1857 iov_iter_init(&msg.msg_iter, READ, &iov, 1, size);
1863 /* Save some cycles and don't copy the address if not needed */ 1858 /* Save some cycles and don't copy the address if not needed */
1864 msg.msg_name = addr ? (struct sockaddr *)&address : NULL; 1859 msg.msg_name = addr ? (struct sockaddr *)&address : NULL;
1865 /* We assume all kernel code knows the size of sockaddr_storage */ 1860 /* We assume all kernel code knows the size of sockaddr_storage */
@@ -1993,13 +1988,14 @@ static ssize_t copy_msghdr_from_user(struct msghdr *kmsg,
1993{ 1988{
1994 struct sockaddr __user *uaddr; 1989 struct sockaddr __user *uaddr;
1995 struct iovec __user *uiov; 1990 struct iovec __user *uiov;
1991 size_t nr_segs;
1996 ssize_t err; 1992 ssize_t err;
1997 1993
1998 if (!access_ok(VERIFY_READ, umsg, sizeof(*umsg)) || 1994 if (!access_ok(VERIFY_READ, umsg, sizeof(*umsg)) ||
1999 __get_user(uaddr, &umsg->msg_name) || 1995 __get_user(uaddr, &umsg->msg_name) ||
2000 __get_user(kmsg->msg_namelen, &umsg->msg_namelen) || 1996 __get_user(kmsg->msg_namelen, &umsg->msg_namelen) ||
2001 __get_user(uiov, &umsg->msg_iov) || 1997 __get_user(uiov, &umsg->msg_iov) ||
2002 __get_user(kmsg->msg_iovlen, &umsg->msg_iovlen) || 1998 __get_user(nr_segs, &umsg->msg_iovlen) ||
2003 __get_user(kmsg->msg_control, &umsg->msg_control) || 1999 __get_user(kmsg->msg_control, &umsg->msg_control) ||
2004 __get_user(kmsg->msg_controllen, &umsg->msg_controllen) || 2000 __get_user(kmsg->msg_controllen, &umsg->msg_controllen) ||
2005 __get_user(kmsg->msg_flags, &umsg->msg_flags)) 2001 __get_user(kmsg->msg_flags, &umsg->msg_flags))
@@ -2029,14 +2025,15 @@ static ssize_t copy_msghdr_from_user(struct msghdr *kmsg,
2029 kmsg->msg_namelen = 0; 2025 kmsg->msg_namelen = 0;
2030 } 2026 }
2031 2027
2032 if (kmsg->msg_iovlen > UIO_MAXIOV) 2028 if (nr_segs > UIO_MAXIOV)
2033 return -EMSGSIZE; 2029 return -EMSGSIZE;
2034 2030
2035 err = rw_copy_check_uvector(save_addr ? READ : WRITE, 2031 err = rw_copy_check_uvector(save_addr ? READ : WRITE,
2036 uiov, kmsg->msg_iovlen, 2032 uiov, nr_segs,
2037 UIO_FASTIOV, *iov, iov); 2033 UIO_FASTIOV, *iov, iov);
2038 if (err >= 0) 2034 if (err >= 0)
2039 kmsg->msg_iov = *iov; 2035 iov_iter_init(&kmsg->msg_iter, save_addr ? READ : WRITE,
2036 *iov, nr_segs, err);
2040 return err; 2037 return err;
2041} 2038}
2042 2039
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index 5b0659791c07..a687b30a699c 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c
@@ -194,7 +194,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m, int offset,
194 __skb_queue_tail(list, skb); 194 __skb_queue_tail(list, skb);
195 skb_copy_to_linear_data(skb, mhdr, mhsz); 195 skb_copy_to_linear_data(skb, mhdr, mhsz);
196 pktpos = skb->data + mhsz; 196 pktpos = skb->data + mhsz;
197 if (!dsz || !memcpy_fromiovecend(pktpos, m->msg_iov, offset, 197 if (!dsz || !memcpy_fromiovecend(pktpos, m->msg_iter.iov, offset,
198 dsz)) 198 dsz))
199 return dsz; 199 return dsz;
200 rc = -EFAULT; 200 rc = -EFAULT;
@@ -224,7 +224,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m, int offset,
224 if (drem < pktrem) 224 if (drem < pktrem)
225 pktrem = drem; 225 pktrem = drem;
226 226
227 if (memcpy_fromiovecend(pktpos, m->msg_iov, offset, pktrem)) { 227 if (memcpy_fromiovecend(pktpos, m->msg_iter.iov, offset, pktrem)) {
228 rc = -EFAULT; 228 rc = -EFAULT;
229 goto error; 229 goto error;
230 } 230 }
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 4450d6226602..8e1b10274b02 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -1459,9 +1459,6 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
1459 struct scm_cookie tmp_scm; 1459 struct scm_cookie tmp_scm;
1460 int max_level; 1460 int max_level;
1461 int data_len = 0; 1461 int data_len = 0;
1462 struct iov_iter from;
1463
1464 iov_iter_init(&from, WRITE, msg->msg_iov, msg->msg_iovlen, len);
1465 1462
1466 if (NULL == siocb->scm) 1463 if (NULL == siocb->scm)
1467 siocb->scm = &tmp_scm; 1464 siocb->scm = &tmp_scm;
@@ -1519,7 +1516,7 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
1519 skb_put(skb, len - data_len); 1516 skb_put(skb, len - data_len);
1520 skb->data_len = data_len; 1517 skb->data_len = data_len;
1521 skb->len = len; 1518 skb->len = len;
1522 err = skb_copy_datagram_from_iter(skb, 0, &from, len); 1519 err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, len);
1523 if (err) 1520 if (err)
1524 goto out_free; 1521 goto out_free;
1525 1522
@@ -1641,9 +1638,6 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
1641 bool fds_sent = false; 1638 bool fds_sent = false;
1642 int max_level; 1639 int max_level;
1643 int data_len; 1640 int data_len;
1644 struct iov_iter from;
1645
1646 iov_iter_init(&from, WRITE, msg->msg_iov, msg->msg_iovlen, len);
1647 1641
1648 if (NULL == siocb->scm) 1642 if (NULL == siocb->scm)
1649 siocb->scm = &tmp_scm; 1643 siocb->scm = &tmp_scm;
@@ -1700,7 +1694,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
1700 skb_put(skb, size - data_len); 1694 skb_put(skb, size - data_len);
1701 skb->data_len = data_len; 1695 skb->data_len = data_len;
1702 skb->len = size; 1696 skb->len = size;
1703 err = skb_copy_datagram_from_iter(skb, 0, &from, size); 1697 err = skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, size);
1704 if (err) { 1698 if (err) {
1705 kfree_skb(skb); 1699 kfree_skb(skb);
1706 goto out_err; 1700 goto out_err;
diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c
index 20a0ba3bfff6..02d2e5229240 100644
--- a/net/vmw_vsock/vmci_transport.c
+++ b/net/vmw_vsock/vmci_transport.c
@@ -1850,7 +1850,8 @@ static ssize_t vmci_transport_stream_enqueue(
1850 struct msghdr *msg, 1850 struct msghdr *msg,
1851 size_t len) 1851 size_t len)
1852{ 1852{
1853 return vmci_qpair_enquev(vmci_trans(vsk)->qpair, msg->msg_iov, len, 0); 1853 /* XXX: stripping const */
1854 return vmci_qpair_enquev(vmci_trans(vsk)->qpair, (struct iovec *)msg->msg_iter.iov, len, 0);
1854} 1855}
1855 1856
1856static s64 vmci_transport_stream_has_data(struct vsock_sock *vsk) 1857static s64 vmci_transport_stream_has_data(struct vsock_sock *vsk)