aboutsummaryrefslogtreecommitdiffstats
path: root/net
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 /net
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>
Diffstat (limited to 'net')
-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
23 files changed, 59 insertions, 73 deletions
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)