mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
net: Add and use skb_copy_datagram_msg() helper.
This encapsulates all of the skb_copy_datagram_iovec() callers with call argument signature "skb, offset, msghdr->msg_iov, length". When we move to iov_iters in the networking, the iov_iter object will sit in the msghdr. Having a helper like this means there will be less places to touch during that transformation. Based upon descriptions and patch from Al Viro. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -163,7 +163,7 @@ mISDN_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
memcpy(skb_push(skb, MISDN_HEADER_LEN), mISDN_HEAD_P(skb),
|
||||
MISDN_HEADER_LEN);
|
||||
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
|
||||
mISDN_sock_cmsg(sk, msg, skb);
|
||||
|
||||
|
||||
@@ -981,7 +981,7 @@ static int pppoe_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
|
||||
if (skb) {
|
||||
total_len = min_t(size_t, total_len, skb->len);
|
||||
error = skb_copy_datagram_iovec(skb, 0, m->msg_iov, total_len);
|
||||
error = skb_copy_datagram_msg(skb, 0, m, total_len);
|
||||
if (error == 0) {
|
||||
consume_skb(skb);
|
||||
return total_len;
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/bug.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/rbtree.h>
|
||||
#include <linux/socket.h>
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <asm/types.h>
|
||||
@@ -2639,6 +2640,11 @@ unsigned int datagram_poll(struct file *file, struct socket *sock,
|
||||
struct poll_table_struct *wait);
|
||||
int skb_copy_datagram_iovec(const struct sk_buff *from, int offset,
|
||||
struct iovec *to, int size);
|
||||
static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset,
|
||||
struct msghdr *msg, int size)
|
||||
{
|
||||
return skb_copy_datagram_iovec(from, offset, msg->msg_iov, size);
|
||||
}
|
||||
int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, int hlen,
|
||||
struct iovec *iov);
|
||||
int skb_copy_datagram_from_iovec(struct sk_buff *skb, int offset,
|
||||
|
||||
+1
-1
@@ -1758,7 +1758,7 @@ static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
|
||||
copied = size;
|
||||
msg->msg_flags |= MSG_TRUNC;
|
||||
}
|
||||
err = skb_copy_datagram_iovec(skb, offset, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, offset, msg, copied);
|
||||
|
||||
if (!err && msg->msg_name) {
|
||||
DECLARE_SOCKADDR(struct sockaddr_at *, sat, msg->msg_name);
|
||||
|
||||
+1
-1
@@ -554,7 +554,7 @@ int vcc_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
|
||||
msg->msg_flags |= MSG_TRUNC;
|
||||
}
|
||||
|
||||
error = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
error = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
if (error)
|
||||
return error;
|
||||
sock_recv_ts_and_drops(msg, sk, skb);
|
||||
|
||||
+1
-1
@@ -1634,7 +1634,7 @@ static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
msg->msg_flags |= MSG_TRUNC;
|
||||
}
|
||||
|
||||
skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
|
||||
if (msg->msg_name) {
|
||||
ax25_digi digi;
|
||||
|
||||
@@ -237,7 +237,7 @@ int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
}
|
||||
|
||||
skb_reset_transport_header(skb);
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
if (err == 0) {
|
||||
sock_recv_ts_and_drops(msg, sk, skb);
|
||||
|
||||
@@ -328,7 +328,7 @@ int bt_sock_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
}
|
||||
|
||||
chunk = min_t(unsigned int, skb->len, size);
|
||||
if (skb_copy_datagram_iovec(skb, 0, msg->msg_iov, chunk)) {
|
||||
if (skb_copy_datagram_msg(skb, 0, msg, chunk)) {
|
||||
skb_queue_head(&sk->sk_receive_queue, skb);
|
||||
if (!copied)
|
||||
copied = -EFAULT;
|
||||
|
||||
@@ -878,7 +878,7 @@ static int hci_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
}
|
||||
|
||||
skb_reset_transport_header(skb);
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
|
||||
switch (hci_pi(sk)->channel) {
|
||||
case HCI_CHANNEL_RAW:
|
||||
|
||||
@@ -293,7 +293,7 @@ static int caif_seqpkt_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
copylen = len;
|
||||
}
|
||||
|
||||
ret = skb_copy_datagram_iovec(skb, 0, m->msg_iov, copylen);
|
||||
ret = skb_copy_datagram_msg(skb, 0, m, copylen);
|
||||
if (ret)
|
||||
goto out_free;
|
||||
|
||||
|
||||
+1
-1
@@ -2457,7 +2457,7 @@ int sock_recv_errqueue(struct sock *sk, struct msghdr *msg, int len,
|
||||
msg->msg_flags |= MSG_TRUNC;
|
||||
copied = len;
|
||||
}
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
if (err)
|
||||
goto out_free_skb;
|
||||
|
||||
|
||||
+1
-1
@@ -896,7 +896,7 @@ verify_sock_status:
|
||||
else if (len < skb->len)
|
||||
msg->msg_flags |= MSG_TRUNC;
|
||||
|
||||
if (skb_copy_datagram_iovec(skb, 0, msg->msg_iov, len)) {
|
||||
if (skb_copy_datagram_msg(skb, 0, msg, len)) {
|
||||
/* Exception. Bailout! */
|
||||
len = -EFAULT;
|
||||
break;
|
||||
|
||||
@@ -324,7 +324,7 @@ static int dgram_recvmsg(struct kiocb *iocb, struct sock *sk,
|
||||
}
|
||||
|
||||
/* FIXME: skip headers if necessary ?! */
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
if (err)
|
||||
goto done;
|
||||
|
||||
|
||||
@@ -195,7 +195,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
||||
copied = len;
|
||||
}
|
||||
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
if (err)
|
||||
goto done;
|
||||
|
||||
|
||||
@@ -424,7 +424,7 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
||||
msg->msg_flags |= MSG_TRUNC;
|
||||
copied = len;
|
||||
}
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
if (err)
|
||||
goto out_free_skb;
|
||||
|
||||
|
||||
+1
-1
@@ -875,7 +875,7 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
||||
}
|
||||
|
||||
/* Don't bother checking the checksum */
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
if (err)
|
||||
goto done;
|
||||
|
||||
|
||||
+1
-1
@@ -718,7 +718,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
||||
copied = len;
|
||||
}
|
||||
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
if (err)
|
||||
goto done;
|
||||
|
||||
|
||||
+2
-3
@@ -1377,7 +1377,7 @@ static int tcp_peek_sndq(struct sock *sk, struct msghdr *msg, int len)
|
||||
/* XXX -- need to support SO_PEEK_OFF */
|
||||
|
||||
skb_queue_walk(&sk->sk_write_queue, skb) {
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, skb->len);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, skb->len);
|
||||
if (err)
|
||||
break;
|
||||
|
||||
@@ -1833,8 +1833,7 @@ do_prequeue:
|
||||
}
|
||||
|
||||
if (!(flags & MSG_TRUNC)) {
|
||||
err = skb_copy_datagram_iovec(skb, offset,
|
||||
msg->msg_iov, used);
|
||||
err = skb_copy_datagram_msg(skb, offset, msg, used);
|
||||
if (err) {
|
||||
/* Exception. Bailout! */
|
||||
if (!copied)
|
||||
|
||||
+2
-2
@@ -1281,8 +1281,8 @@ try_again:
|
||||
}
|
||||
|
||||
if (skb_csum_unnecessary(skb))
|
||||
err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr),
|
||||
msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, sizeof(struct udphdr),
|
||||
msg, copied);
|
||||
else {
|
||||
err = skb_copy_and_csum_datagram_iovec(skb,
|
||||
sizeof(struct udphdr),
|
||||
|
||||
+2
-2
@@ -351,7 +351,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
||||
msg->msg_flags |= MSG_TRUNC;
|
||||
copied = len;
|
||||
}
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
if (err)
|
||||
goto out_free_skb;
|
||||
|
||||
@@ -445,7 +445,7 @@ int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len,
|
||||
msg->msg_flags |= MSG_TRUNC;
|
||||
copied = len;
|
||||
}
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
if (err)
|
||||
goto out_free_skb;
|
||||
|
||||
|
||||
+2
-2
@@ -486,11 +486,11 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
|
||||
}
|
||||
|
||||
if (skb_csum_unnecessary(skb)) {
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
} else if (msg->msg_flags&MSG_TRUNC) {
|
||||
if (__skb_checksum_complete(skb))
|
||||
goto csum_copy_err;
|
||||
err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
|
||||
err = skb_copy_datagram_msg(skb, 0, msg, copied);
|
||||
} else {
|
||||
err = skb_copy_and_csum_datagram_iovec(skb, 0, msg->msg_iov);
|
||||
if (err == -EINVAL)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user