Skip to content

Commit c0371da

Browse files
author
Al Viro
committed
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 <[email protected]>
1 parent d838df2 commit c0371da

33 files changed

+90
-112
lines changed

crypto/algif_hash.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ static int hash_sendmsg(struct kiocb *unused, struct socket *sock,
4242
struct alg_sock *ask = alg_sk(sk);
4343
struct hash_ctx *ctx = ask->private;
4444
unsigned long iovlen;
45-
struct iovec *iov;
45+
const struct iovec *iov;
4646
long copied = 0;
4747
int err;
4848

@@ -58,7 +58,7 @@ static int hash_sendmsg(struct kiocb *unused, struct socket *sock,
5858

5959
ctx->more = 0;
6060

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;
6262
iovlen--, iov++) {
6363
unsigned long seglen = iov->iov_len;
6464
char __user *from = iov->iov_base;

crypto/algif_skcipher.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -429,13 +429,13 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock,
429429
struct skcipher_sg_list *sgl;
430430
struct scatterlist *sg;
431431
unsigned long iovlen;
432-
struct iovec *iov;
432+
const struct iovec *iov;
433433
int err = -EAGAIN;
434434
int used;
435435
long copied = 0;
436436

437437
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;
439439
iovlen--, iov++) {
440440
unsigned long seglen = iov->iov_len;
441441
char __user *from = iov->iov_base;

drivers/net/macvtap.c

+2-6
Original file line numberDiff line numberDiff line change
@@ -1095,22 +1095,18 @@ static int macvtap_sendmsg(struct kiocb *iocb, struct socket *sock,
10951095
struct msghdr *m, size_t total_len)
10961096
{
10971097
struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock);
1098-
struct iov_iter from;
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);
1098+
return macvtap_get_user(q, m, &m->msg_iter, m->msg_flags & MSG_DONTWAIT);
11011099
}
11021100

11031101
static int macvtap_recvmsg(struct kiocb *iocb, struct socket *sock,
11041102
struct msghdr *m, size_t total_len,
11051103
int flags)
11061104
{
11071105
struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock);
1108-
struct iov_iter to;
11091106
int ret;
11101107
if (flags & ~(MSG_DONTWAIT|MSG_TRUNC))
11111108
return -EINVAL;
1112-
iov_iter_init(&to, READ, m->msg_iov, m->msg_iovlen, total_len);
1113-
ret = macvtap_do_read(q, &to, flags & MSG_DONTWAIT);
1109+
ret = macvtap_do_read(q, &m->msg_iter, flags & MSG_DONTWAIT);
11141110
if (ret > total_len) {
11151111
m->msg_flags |= MSG_TRUNC;
11161112
ret = flags & MSG_TRUNC ? ret : total_len;

drivers/net/tun.c

+2-6
Original file line numberDiff line numberDiff line change
@@ -1449,13 +1449,11 @@ static int tun_sendmsg(struct kiocb *iocb, struct socket *sock,
14491449
int ret;
14501450
struct tun_file *tfile = container_of(sock, struct tun_file, socket);
14511451
struct tun_struct *tun = __tun_get(tfile);
1452-
struct iov_iter from;
14531452

14541453
if (!tun)
14551454
return -EBADFD;
14561455

1457-
iov_iter_init(&from, WRITE, m->msg_iov, m->msg_iovlen, total_len);
1458-
ret = tun_get_user(tun, tfile, m->msg_control, &from,
1456+
ret = tun_get_user(tun, tfile, m->msg_control, &m->msg_iter,
14591457
m->msg_flags & MSG_DONTWAIT);
14601458
tun_put(tun);
14611459
return ret;
@@ -1467,7 +1465,6 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
14671465
{
14681466
struct tun_file *tfile = container_of(sock, struct tun_file, socket);
14691467
struct tun_struct *tun = __tun_get(tfile);
1470-
struct iov_iter to;
14711468
int ret;
14721469

14731470
if (!tun)
@@ -1482,8 +1479,7 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
14821479
SOL_PACKET, TUN_TX_TIMESTAMP);
14831480
goto out;
14841481
}
1485-
iov_iter_init(&to, READ, m->msg_iov, m->msg_iovlen, total_len);
1486-
ret = tun_do_read(tun, tfile, &to, flags & MSG_DONTWAIT);
1482+
ret = tun_do_read(tun, tfile, &m->msg_iter, flags & MSG_DONTWAIT);
14871483
if (ret > total_len) {
14881484
m->msg_flags |= MSG_TRUNC;
14891485
ret = flags & MSG_TRUNC ? ret : total_len;

drivers/vhost/net.c

+3-5
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,6 @@ static void handle_tx(struct vhost_net *net)
342342
.msg_namelen = 0,
343343
.msg_control = NULL,
344344
.msg_controllen = 0,
345-
.msg_iov = vq->iov,
346345
.msg_flags = MSG_DONTWAIT,
347346
};
348347
size_t len, total_len = 0;
@@ -396,8 +395,8 @@ static void handle_tx(struct vhost_net *net)
396395
}
397396
/* Skip header. TODO: support TSO. */
398397
s = move_iovec_hdr(vq->iov, nvq->hdr, hdr_size, out);
399-
msg.msg_iovlen = out;
400398
len = iov_length(vq->iov, out);
399+
iov_iter_init(&msg.msg_iter, WRITE, vq->iov, out, len);
401400
/* Sanity check */
402401
if (!len) {
403402
vq_err(vq, "Unexpected header len for TX: "
@@ -562,7 +561,6 @@ static void handle_rx(struct vhost_net *net)
562561
.msg_namelen = 0,
563562
.msg_control = NULL, /* FIXME: get and handle RX aux data. */
564563
.msg_controllen = 0,
565-
.msg_iov = vq->iov,
566564
.msg_flags = MSG_DONTWAIT,
567565
};
568566
struct virtio_net_hdr_mrg_rxbuf hdr = {
@@ -600,7 +598,7 @@ static void handle_rx(struct vhost_net *net)
600598
break;
601599
/* On overrun, truncate and discard */
602600
if (unlikely(headcount > UIO_MAXIOV)) {
603-
msg.msg_iovlen = 1;
601+
iov_iter_init(&msg.msg_iter, READ, vq->iov, 1, 1);
604602
err = sock->ops->recvmsg(NULL, sock, &msg,
605603
1, MSG_DONTWAIT | MSG_TRUNC);
606604
pr_debug("Discarded rx packet: len %zd\n", sock_len);
@@ -626,7 +624,7 @@ static void handle_rx(struct vhost_net *net)
626624
/* Copy the header for use in VIRTIO_NET_F_MRG_RXBUF:
627625
* needed because recvmsg can modify msg_iov. */
628626
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);
630628
err = sock->ops->recvmsg(NULL, sock, &msg,
631629
sock_len, MSG_DONTWAIT | MSG_TRUNC);
632630
/* Userspace might have consumed the packet meanwhile:

fs/afs/rxrpc.c

+6-8
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,8 @@ static int afs_send_pages(struct afs_call *call, struct msghdr *msg,
306306

307307
_debug("- range %u-%u%s",
308308
offset, to, msg->msg_flags ? " [more]" : "");
309-
msg->msg_iov = (struct iovec *) iov;
310-
msg->msg_iovlen = 1;
309+
iov_iter_init(&msg->msg_iter, WRITE,
310+
(struct iovec *) iov, 1, to - offset);
311311

312312
/* have to change the state *before* sending the last
313313
* 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,
384384

385385
msg.msg_name = NULL;
386386
msg.msg_namelen = 0;
387-
msg.msg_iov = (struct iovec *) iov;
388-
msg.msg_iovlen = 1;
387+
iov_iter_init(&msg.msg_iter, WRITE, (struct iovec *)iov, 1,
388+
call->request_size);
389389
msg.msg_control = NULL;
390390
msg.msg_controllen = 0;
391391
msg.msg_flags = (call->send_pages ? MSG_MORE : 0);
@@ -778,8 +778,7 @@ void afs_send_empty_reply(struct afs_call *call)
778778
iov[0].iov_len = 0;
779779
msg.msg_name = NULL;
780780
msg.msg_namelen = 0;
781-
msg.msg_iov = iov;
782-
msg.msg_iovlen = 0;
781+
iov_iter_init(&msg.msg_iter, WRITE, iov, 0, 0); /* WTF? */
783782
msg.msg_control = NULL;
784783
msg.msg_controllen = 0;
785784
msg.msg_flags = 0;
@@ -815,8 +814,7 @@ void afs_send_simple_reply(struct afs_call *call, const void *buf, size_t len)
815814
iov[0].iov_len = len;
816815
msg.msg_name = NULL;
817816
msg.msg_namelen = 0;
818-
msg.msg_iov = iov;
819-
msg.msg_iovlen = 1;
817+
iov_iter_init(&msg.msg_iter, WRITE, iov, 1, len);
820818
msg.msg_control = NULL;
821819
msg.msg_controllen = 0;
822820
msg.msg_flags = 0;

include/linux/skbuff.h

+10-6
Original file line numberDiff line numberDiff line change
@@ -2646,22 +2646,24 @@ unsigned int datagram_poll(struct file *file, struct socket *sock,
26462646
struct poll_table_struct *wait);
26472647
int skb_copy_datagram_iovec(const struct sk_buff *from, int offset,
26482648
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);
26492651
static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset,
26502652
struct msghdr *msg, int size)
26512653
{
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);
26532656
}
26542657
int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, int hlen,
26552658
struct iovec *iov);
26562659
static inline int skb_copy_and_csum_datagram_msg(struct sk_buff *skb, int hlen,
26572660
struct msghdr *msg)
26582661
{
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);
26602664
}
26612665
int skb_copy_datagram_from_iter(struct sk_buff *skb, int offset,
26622666
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);
26652667
int zerocopy_sg_from_iter(struct sk_buff *skb, struct iov_iter *frm);
26662668
void skb_free_datagram(struct sock *sk, struct sk_buff *skb);
26672669
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);
26892691

26902692
static inline int memcpy_from_msg(void *data, struct msghdr *msg, int len)
26912693
{
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);
26932696
}
26942697

26952698
static inline int memcpy_to_msg(struct msghdr *msg, void *data, int len)
26962699
{
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);
26982702
}
26992703

27002704
struct skb_checksum_ops {

include/linux/socket.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ struct linger {
4747
struct msghdr {
4848
void *msg_name; /* ptr to socket address structure */
4949
int msg_namelen; /* size of socket address structure */
50-
struct iovec *msg_iov; /* scatter/gather array */
51-
__kernel_size_t msg_iovlen; /* # elements in msg_iov */
50+
struct iov_iter msg_iter; /* data */
5251
void *msg_control; /* ancillary data */
5352
__kernel_size_t msg_controllen; /* ancillary data buffer length */
5453
unsigned int msg_flags; /* flags on received message */

include/net/bluetooth/l2cap.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -911,7 +911,7 @@ static inline int l2cap_chan_no_memcpy_fromiovec(struct l2cap_chan *chan,
911911
/* Following is safe since for compiler definitions of kvec and
912912
* iovec are identical, yielding the same in-core layout and alignment
913913
*/
914-
struct kvec *vec = (struct kvec *)msg->msg_iov;
914+
struct kvec *vec = (struct kvec *)msg->msg_iter.iov;
915915

916916
while (len > 0) {
917917
if (vec->iov_len) {

include/net/udplite.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ static __inline__ int udplite_getfrag(void *from, char *to, int offset,
2020
int len, int odd, struct sk_buff *skb)
2121
{
2222
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);
2425
}
2526

2627
/* Designate sk as UDP-Lite socket */

net/atm/common.c

+1-4
Original file line numberDiff line numberDiff line change
@@ -577,9 +577,6 @@ int vcc_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
577577
struct atm_vcc *vcc;
578578
struct sk_buff *skb;
579579
int eff, error;
580-
struct iov_iter from;
581-
582-
iov_iter_init(&from, WRITE, m->msg_iov, m->msg_iovlen, size);
583580

584581
lock_sock(sk);
585582
if (sock->state != SS_CONNECTED) {
@@ -634,7 +631,7 @@ int vcc_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
634631
goto out;
635632
skb->dev = NULL; /* for paths shared with net_device interfaces */
636633
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) {
638635
kfree_skb(skb);
639636
error = -EFAULT;
640637
goto out;

net/bluetooth/6lowpan.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -537,12 +537,12 @@ static int send_pkt(struct l2cap_chan *chan, struct sk_buff *skb,
537537
*/
538538
chan->data = skb;
539539

540-
memset(&msg, 0, sizeof(msg));
541-
msg.msg_iov = (struct iovec *) &iv;
542-
msg.msg_iovlen = 1;
543540
iv.iov_base = skb->data;
544541
iv.iov_len = skb->len;
545542

543+
memset(&msg, 0, sizeof(msg));
544+
iov_iter_init(&msg.msg_iter, WRITE, (struct iovec *) &iv, 1, skb->len);
545+
546546
err = l2cap_chan_send(chan, &msg, skb->len);
547547
if (err > 0) {
548548
netdev->stats.tx_bytes += err;

net/bluetooth/a2mp.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ void a2mp_send(struct amp_mgr *mgr, u8 code, u8 ident, u16 len, void *data)
6060

6161
memset(&msg, 0, sizeof(msg));
6262

63-
msg.msg_iov = (struct iovec *) &iv;
64-
msg.msg_iovlen = 1;
63+
iov_iter_init(&msg.msg_iter, WRITE, (struct iovec *)&iv, 1, total_len);
6564

6665
l2cap_chan_send(chan, &msg, total_len);
6766

net/bluetooth/smp.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,7 @@ static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
268268

269269
memset(&msg, 0, sizeof(msg));
270270

271-
msg.msg_iov = (struct iovec *) &iv;
272-
msg.msg_iovlen = 2;
271+
iov_iter_init(&msg.msg_iter, WRITE, (struct iovec *)iv, 2, 1 + len);
273272

274273
l2cap_chan_send(chan, &msg, 1 + len);
275274

net/caif/caif_socket.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ static int caif_seqpkt_sendmsg(struct kiocb *kiocb, struct socket *sock,
535535
goto err;
536536

537537
ret = -EINVAL;
538-
if (unlikely(msg->msg_iov->iov_base == NULL))
538+
if (unlikely(msg->msg_iter.iov->iov_base == NULL))
539539
goto err;
540540
noblock = msg->msg_flags & MSG_DONTWAIT;
541541

net/compat.c

+6-4
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,14 @@ ssize_t get_compat_msghdr(struct msghdr *kmsg,
3737
struct iovec **iov)
3838
{
3939
compat_uptr_t uaddr, uiov, tmp3;
40+
compat_size_t nr_segs;
4041
ssize_t err;
4142

4243
if (!access_ok(VERIFY_READ, umsg, sizeof(*umsg)) ||
4344
__get_user(uaddr, &umsg->msg_name) ||
4445
__get_user(kmsg->msg_namelen, &umsg->msg_namelen) ||
4546
__get_user(uiov, &umsg->msg_iov) ||
46-
__get_user(kmsg->msg_iovlen, &umsg->msg_iovlen) ||
47+
__get_user(nr_segs, &umsg->msg_iovlen) ||
4748
__get_user(tmp3, &umsg->msg_control) ||
4849
__get_user(kmsg->msg_controllen, &umsg->msg_controllen) ||
4950
__get_user(kmsg->msg_flags, &umsg->msg_flags))
@@ -68,14 +69,15 @@ ssize_t get_compat_msghdr(struct msghdr *kmsg,
6869
kmsg->msg_namelen = 0;
6970
}
7071

71-
if (kmsg->msg_iovlen > UIO_MAXIOV)
72+
if (nr_segs > UIO_MAXIOV)
7273
return -EMSGSIZE;
7374

7475
err = compat_rw_copy_check_uvector(save_addr ? READ : WRITE,
75-
compat_ptr(uiov), kmsg->msg_iovlen,
76+
compat_ptr(uiov), nr_segs,
7677
UIO_FASTIOV, *iov, iov);
7778
if (err >= 0)
78-
kmsg->msg_iov = *iov;
79+
iov_iter_init(&kmsg->msg_iter, save_addr ? READ : WRITE,
80+
*iov, nr_segs, err);
7981
return err;
8082
}
8183

net/ipv4/ip_output.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -755,11 +755,13 @@ ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk
755755
struct msghdr *msg = from;
756756

757757
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)
759760
return -EFAULT;
760761
} else {
761762
__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)
763765
return -EFAULT;
764766
skb->csum = csum_block_add(skb->csum, csum, odd);
765767
}

net/ipv4/ping.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,8 @@ static int ping_v4_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m
811811
pfh.icmph.checksum = 0;
812812
pfh.icmph.un.echo.id = inet->inet_sport;
813813
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;
815816
pfh.wcheck = 0;
816817
pfh.family = AF_INET;
817818

net/ipv4/raw.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,8 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
625625
back_from_confirm:
626626

627627
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,
629630
&rt, msg->msg_flags);
630631

631632
else {

0 commit comments

Comments
 (0)