diff options
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 | ||
1103 | static int macvtap_recvmsg(struct kiocb *iocb, struct socket *sock, | 1101 | static 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); |
2647 | int skb_copy_datagram_iovec(const struct sk_buff *from, int offset, | 2647 | int skb_copy_datagram_iovec(const struct sk_buff *from, int offset, |
2648 | struct iovec *to, int size); | 2648 | struct iovec *to, int size); |
2649 | int skb_copy_datagram_iter(const struct sk_buff *from, int offset, | ||
2650 | struct iov_iter *to, int size); | ||
2649 | static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset, | 2651 | static 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 | } |
2654 | int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, int hlen, | 2657 | int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, int hlen, |
2655 | struct iovec *iov); | 2658 | struct iovec *iov); |
2656 | static inline int skb_copy_and_csum_datagram_msg(struct sk_buff *skb, int hlen, | 2659 | static 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 | } |
2661 | int skb_copy_datagram_from_iter(struct sk_buff *skb, int offset, | 2665 | int 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); |
2663 | int skb_copy_datagram_iter(const struct sk_buff *from, int offset, | ||
2664 | struct iov_iter *to, int size); | ||
2665 | int zerocopy_sg_from_iter(struct sk_buff *skb, struct iov_iter *frm); | 2667 | int zerocopy_sg_from_iter(struct sk_buff *skb, struct iov_iter *frm); |
2666 | void skb_free_datagram(struct sock *sk, struct sk_buff *skb); | 2668 | void skb_free_datagram(struct sock *sk, struct sk_buff *skb); |
2667 | void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb); | 2669 | void 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 | ||
2690 | static inline int memcpy_from_msg(void *data, struct msghdr *msg, int len) | 2692 | static 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 | ||
2695 | static inline int memcpy_to_msg(struct msghdr *msg, void *data, int len) | 2698 | static 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 | ||
2700 | struct skb_checksum_ops { | 2704 | struct 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 { | |||
47 | struct msghdr { | 47 | struct 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, | |||
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) |