diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2014-11-24 10:42:55 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-12-09 16:29:03 -0500 |
commit | c0371da6047abd261bc483c744dbc7d81a116172 (patch) | |
tree | 73b4d685f311a83e04f3a684ce18225b409b3f5f /net | |
parent | d838df2e5dcbb6ed4d82854869e9a30f9aeef6da (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.c | 5 | ||||
-rw-r--r-- | net/bluetooth/6lowpan.c | 6 | ||||
-rw-r--r-- | net/bluetooth/a2mp.c | 3 | ||||
-rw-r--r-- | net/bluetooth/smp.c | 3 | ||||
-rw-r--r-- | net/caif/caif_socket.c | 2 | ||||
-rw-r--r-- | net/compat.c | 10 | ||||
-rw-r--r-- | net/ipv4/ip_output.c | 6 | ||||
-rw-r--r-- | net/ipv4/ping.c | 3 | ||||
-rw-r--r-- | net/ipv4/raw.c | 3 | ||||
-rw-r--r-- | net/ipv4/tcp.c | 6 | ||||
-rw-r--r-- | net/ipv4/tcp_output.c | 2 | ||||
-rw-r--r-- | net/ipv6/ping.c | 3 | ||||
-rw-r--r-- | net/ipv6/raw.c | 3 | ||||
-rw-r--r-- | net/netlink/af_netlink.c | 2 | ||||
-rw-r--r-- | net/packet/af_packet.c | 7 | ||||
-rw-r--r-- | net/rds/recv.c | 7 | ||||
-rw-r--r-- | net/rds/send.c | 4 | ||||
-rw-r--r-- | net/rxrpc/ar-output.c | 8 | ||||
-rw-r--r-- | net/sctp/socket.c | 5 | ||||
-rw-r--r-- | net/socket.c | 27 | ||||
-rw-r--r-- | net/tipc/msg.c | 4 | ||||
-rw-r--r-- | net/unix/af_unix.c | 10 | ||||
-rw-r--r-- | net/vmw_vsock/vmci_transport.c | 3 |
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, | |||
625 | back_from_confirm: | 625 | back_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, | |||
1085 | int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | 1085 | int 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 | ||
887 | back_from_confirm: | 887 | back_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 | ||
1856 | static s64 vmci_transport_stream_has_data(struct vsock_sock *vsk) | 1857 | static s64 vmci_transport_stream_has_data(struct vsock_sock *vsk) |