aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/linux/skbuff.h22
-rw-r--r--include/linux/socket.h3
-rw-r--r--include/linux/tcp.h2
-rw-r--r--include/linux/uio.h7
-rw-r--r--include/linux/vmw_vmci_api.h5
-rw-r--r--include/net/bluetooth/l2cap.h29
-rw-r--r--include/net/udplite.h4
7 files changed, 22 insertions, 50 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index ef64cec42804..ab0bc43c82a4 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -2644,24 +2644,17 @@ struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, int noblock,
2644 int *err); 2644 int *err);
2645unsigned int datagram_poll(struct file *file, struct socket *sock, 2645unsigned int datagram_poll(struct file *file, struct socket *sock,
2646 struct poll_table_struct *wait); 2646 struct poll_table_struct *wait);
2647int skb_copy_datagram_iovec(const struct sk_buff *from, int offset, 2647int skb_copy_datagram_iter(const struct sk_buff *from, int offset,
2648 struct iovec *to, int size); 2648 struct iov_iter *to, int size);
2649static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset, 2649static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset,
2650 struct msghdr *msg, int size) 2650 struct msghdr *msg, int size)
2651{ 2651{
2652 return skb_copy_datagram_iovec(from, offset, msg->msg_iov, size); 2652 return skb_copy_datagram_iter(from, offset, &msg->msg_iter, size);
2653}
2654int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, int hlen,
2655 struct iovec *iov);
2656static inline int skb_copy_and_csum_datagram_msg(struct sk_buff *skb, int hlen,
2657 struct msghdr *msg)
2658{
2659 return skb_copy_and_csum_datagram_iovec(skb, hlen, msg->msg_iov);
2660} 2653}
2654int skb_copy_and_csum_datagram_msg(struct sk_buff *skb, int hlen,
2655 struct msghdr *msg);
2661int skb_copy_datagram_from_iter(struct sk_buff *skb, int offset, 2656int skb_copy_datagram_from_iter(struct sk_buff *skb, int offset,
2662 struct iov_iter *from, int len); 2657 struct iov_iter *from, int len);
2663int skb_copy_datagram_iter(const struct sk_buff *from, int offset,
2664 struct iov_iter *to, int size);
2665int zerocopy_sg_from_iter(struct sk_buff *skb, struct iov_iter *frm); 2658int zerocopy_sg_from_iter(struct sk_buff *skb, struct iov_iter *frm);
2666void skb_free_datagram(struct sock *sk, struct sk_buff *skb); 2659void skb_free_datagram(struct sock *sk, struct sk_buff *skb);
2667void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb); 2660void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb);
@@ -2689,12 +2682,13 @@ int skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci);
2689 2682
2690static inline int memcpy_from_msg(void *data, struct msghdr *msg, int len) 2683static inline int memcpy_from_msg(void *data, struct msghdr *msg, int len)
2691{ 2684{
2692 return memcpy_fromiovec(data, msg->msg_iov, len); 2685 /* XXX: stripping const */
2686 return memcpy_fromiovec(data, (struct iovec *)msg->msg_iter.iov, len);
2693} 2687}
2694 2688
2695static inline int memcpy_to_msg(struct msghdr *msg, void *data, int len) 2689static inline int memcpy_to_msg(struct msghdr *msg, void *data, int len)
2696{ 2690{
2697 return memcpy_toiovec(msg->msg_iov, data, len); 2691 return copy_to_iter(data, len, &msg->msg_iter) == len ? 0 : -EFAULT;
2698} 2692}
2699 2693
2700struct skb_checksum_ops { 2694struct 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 {
47struct msghdr { 47struct 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/linux/tcp.h b/include/linux/tcp.h
index 3fa0a9669a3a..67309ece0772 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -162,7 +162,7 @@ struct tcp_sock {
162 struct { 162 struct {
163 struct sk_buff_head prequeue; 163 struct sk_buff_head prequeue;
164 struct task_struct *task; 164 struct task_struct *task;
165 struct iovec *iov; 165 struct msghdr *msg;
166 int memory; 166 int memory;
167 int len; 167 int len;
168 } ucopy; 168 } ucopy;
diff --git a/include/linux/uio.h b/include/linux/uio.h
index 9b1581414cd4..a41e252396c0 100644
--- a/include/linux/uio.h
+++ b/include/linux/uio.h
@@ -31,6 +31,7 @@ struct iov_iter {
31 size_t count; 31 size_t count;
32 union { 32 union {
33 const struct iovec *iov; 33 const struct iovec *iov;
34 const struct kvec *kvec;
34 const struct bio_vec *bvec; 35 const struct bio_vec *bvec;
35 }; 36 };
36 unsigned long nr_segs; 37 unsigned long nr_segs;
@@ -82,10 +83,13 @@ size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes,
82 struct iov_iter *i); 83 struct iov_iter *i);
83size_t copy_to_iter(void *addr, size_t bytes, struct iov_iter *i); 84size_t copy_to_iter(void *addr, size_t bytes, struct iov_iter *i);
84size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i); 85size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i);
86size_t copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i);
85size_t iov_iter_zero(size_t bytes, struct iov_iter *); 87size_t iov_iter_zero(size_t bytes, struct iov_iter *);
86unsigned long iov_iter_alignment(const struct iov_iter *i); 88unsigned long iov_iter_alignment(const struct iov_iter *i);
87void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov, 89void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov,
88 unsigned long nr_segs, size_t count); 90 unsigned long nr_segs, size_t count);
91void iov_iter_kvec(struct iov_iter *i, int direction, const struct kvec *iov,
92 unsigned long nr_segs, size_t count);
89ssize_t iov_iter_get_pages(struct iov_iter *i, struct page **pages, 93ssize_t iov_iter_get_pages(struct iov_iter *i, struct page **pages,
90 size_t maxsize, unsigned maxpages, size_t *start); 94 size_t maxsize, unsigned maxpages, size_t *start);
91ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, struct page ***pages, 95ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, struct page ***pages,
@@ -123,9 +127,10 @@ static inline void iov_iter_reexpand(struct iov_iter *i, size_t count)
123{ 127{
124 i->count = count; 128 i->count = count;
125} 129}
130size_t csum_and_copy_to_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i);
131size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i);
126 132
127int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); 133int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len);
128int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len);
129int memcpy_fromiovecend(unsigned char *kdata, const struct iovec *iov, 134int memcpy_fromiovecend(unsigned char *kdata, const struct iovec *iov,
130 int offset, int len); 135 int offset, int len);
131int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata, 136int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata,
diff --git a/include/linux/vmw_vmci_api.h b/include/linux/vmw_vmci_api.h
index 023430e265fe..5691f752ce8f 100644
--- a/include/linux/vmw_vmci_api.h
+++ b/include/linux/vmw_vmci_api.h
@@ -24,6 +24,7 @@
24#define VMCI_KERNEL_API_VERSION_2 2 24#define VMCI_KERNEL_API_VERSION_2 2
25#define VMCI_KERNEL_API_VERSION VMCI_KERNEL_API_VERSION_2 25#define VMCI_KERNEL_API_VERSION VMCI_KERNEL_API_VERSION_2
26 26
27struct msghdr;
27typedef void (vmci_device_shutdown_fn) (void *device_registration, 28typedef void (vmci_device_shutdown_fn) (void *device_registration,
28 void *user_data); 29 void *user_data);
29 30
@@ -75,8 +76,8 @@ ssize_t vmci_qpair_peek(struct vmci_qp *qpair, void *buf, size_t buf_size,
75ssize_t vmci_qpair_enquev(struct vmci_qp *qpair, 76ssize_t vmci_qpair_enquev(struct vmci_qp *qpair,
76 void *iov, size_t iov_size, int mode); 77 void *iov, size_t iov_size, int mode);
77ssize_t vmci_qpair_dequev(struct vmci_qp *qpair, 78ssize_t vmci_qpair_dequev(struct vmci_qp *qpair,
78 void *iov, size_t iov_size, int mode); 79 struct msghdr *msg, size_t iov_size, int mode);
79ssize_t vmci_qpair_peekv(struct vmci_qp *qpair, void *iov, size_t iov_size, 80ssize_t vmci_qpair_peekv(struct vmci_qp *qpair, struct msghdr *msg, size_t iov_size,
80 int mode); 81 int mode);
81 82
82#endif /* !__VMW_VMCI_API_H__ */ 83#endif /* !__VMW_VMCI_API_H__ */
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
index eee3ef530e79..d1bb342d083f 100644
--- a/include/net/bluetooth/l2cap.h
+++ b/include/net/bluetooth/l2cap.h
@@ -608,10 +608,6 @@ struct l2cap_ops {
608 struct sk_buff *(*alloc_skb) (struct l2cap_chan *chan, 608 struct sk_buff *(*alloc_skb) (struct l2cap_chan *chan,
609 unsigned long hdr_len, 609 unsigned long hdr_len,
610 unsigned long len, int nb); 610 unsigned long len, int nb);
611 int (*memcpy_fromiovec) (struct l2cap_chan *chan,
612 unsigned char *kdata,
613 struct iovec *iov,
614 int len);
615}; 611};
616 612
617struct l2cap_conn { 613struct l2cap_conn {
@@ -905,31 +901,6 @@ static inline long l2cap_chan_no_get_sndtimeo(struct l2cap_chan *chan)
905 return 0; 901 return 0;
906} 902}
907 903
908static inline int l2cap_chan_no_memcpy_fromiovec(struct l2cap_chan *chan,
909 unsigned char *kdata,
910 struct iovec *iov,
911 int len)
912{
913 /* Following is safe since for compiler definitions of kvec and
914 * iovec are identical, yielding the same in-core layout and alignment
915 */
916 struct kvec *vec = (struct kvec *)iov;
917
918 while (len > 0) {
919 if (vec->iov_len) {
920 int copy = min_t(unsigned int, len, vec->iov_len);
921 memcpy(kdata, vec->iov_base, copy);
922 len -= copy;
923 kdata += copy;
924 vec->iov_base += copy;
925 vec->iov_len -= copy;
926 }
927 vec++;
928 }
929
930 return 0;
931}
932
933extern bool disable_ertm; 904extern bool disable_ertm;
934 905
935int l2cap_init_sockets(void); 906int l2cap_init_sockets(void);
diff --git a/include/net/udplite.h b/include/net/udplite.h
index 9a28a5179400..ae7c8d1fbcad 100644
--- a/include/net/udplite.h
+++ b/include/net/udplite.h
@@ -19,7 +19,9 @@ extern struct udp_table udplite_table;
19static __inline__ int udplite_getfrag(void *from, char *to, int offset, 19static __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 return memcpy_fromiovecend(to, (struct iovec *) from, offset, len); 22 struct msghdr *msg = from;
23 /* XXX: stripping const */
24 return memcpy_fromiovecend(to, (struct iovec *)msg->msg_iter.iov, offset, len);
23} 25}
24 26
25/* Designate sk as UDP-Lite socket */ 27/* Designate sk as UDP-Lite socket */