diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/skbuff.h | 22 | ||||
-rw-r--r-- | include/linux/socket.h | 3 | ||||
-rw-r--r-- | include/linux/tcp.h | 2 | ||||
-rw-r--r-- | include/linux/uio.h | 7 | ||||
-rw-r--r-- | include/linux/vmw_vmci_api.h | 5 | ||||
-rw-r--r-- | include/net/bluetooth/l2cap.h | 29 | ||||
-rw-r--r-- | include/net/udplite.h | 4 |
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); |
2645 | unsigned int datagram_poll(struct file *file, struct socket *sock, | 2645 | 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_iter(const struct sk_buff *from, int offset, |
2648 | struct iovec *to, int size); | 2648 | struct iov_iter *to, int size); |
2649 | static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset, | 2649 | static 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 | } | ||
2654 | int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, int hlen, | ||
2655 | struct iovec *iov); | ||
2656 | static 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 | } |
2654 | int skb_copy_and_csum_datagram_msg(struct sk_buff *skb, int hlen, | ||
2655 | struct msghdr *msg); | ||
2661 | int skb_copy_datagram_from_iter(struct sk_buff *skb, int offset, | 2656 | int 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); |
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); | 2658 | 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); | 2659 | void skb_free_datagram(struct sock *sk, struct sk_buff *skb); |
2667 | void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb); | 2660 | void 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 | ||
2690 | static inline int memcpy_from_msg(void *data, struct msghdr *msg, int len) | 2683 | static 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 | ||
2695 | static inline int memcpy_to_msg(struct msghdr *msg, void *data, int len) | 2689 | static 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 | ||
2700 | struct skb_checksum_ops { | 2694 | 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/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); |
83 | size_t copy_to_iter(void *addr, size_t bytes, struct iov_iter *i); | 84 | size_t copy_to_iter(void *addr, size_t bytes, struct iov_iter *i); |
84 | size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i); | 85 | size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i); |
86 | size_t copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i); | ||
85 | size_t iov_iter_zero(size_t bytes, struct iov_iter *); | 87 | size_t iov_iter_zero(size_t bytes, struct iov_iter *); |
86 | unsigned long iov_iter_alignment(const struct iov_iter *i); | 88 | unsigned long iov_iter_alignment(const struct iov_iter *i); |
87 | void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov, | 89 | void 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); |
91 | void iov_iter_kvec(struct iov_iter *i, int direction, const struct kvec *iov, | ||
92 | unsigned long nr_segs, size_t count); | ||
89 | ssize_t iov_iter_get_pages(struct iov_iter *i, struct page **pages, | 93 | ssize_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); |
91 | ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, struct page ***pages, | 95 | ssize_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 | } |
130 | size_t csum_and_copy_to_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i); | ||
131 | size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i); | ||
126 | 132 | ||
127 | int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); | 133 | int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); |
128 | int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len); | ||
129 | int memcpy_fromiovecend(unsigned char *kdata, const struct iovec *iov, | 134 | int memcpy_fromiovecend(unsigned char *kdata, const struct iovec *iov, |
130 | int offset, int len); | 135 | int offset, int len); |
131 | int memcpy_toiovecend(const struct iovec *v, unsigned char *kdata, | 136 | int 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 | ||
27 | struct msghdr; | ||
27 | typedef void (vmci_device_shutdown_fn) (void *device_registration, | 28 | typedef 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, | |||
75 | ssize_t vmci_qpair_enquev(struct vmci_qp *qpair, | 76 | ssize_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); |
77 | ssize_t vmci_qpair_dequev(struct vmci_qp *qpair, | 78 | ssize_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); |
79 | ssize_t vmci_qpair_peekv(struct vmci_qp *qpair, void *iov, size_t iov_size, | 80 | ssize_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 | ||
617 | struct l2cap_conn { | 613 | struct 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 | ||
908 | static 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 | |||
933 | extern bool disable_ertm; | 904 | extern bool disable_ertm; |
934 | 905 | ||
935 | int l2cap_init_sockets(void); | 906 | int 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; | |||
19 | static __inline__ int udplite_getfrag(void *from, char *to, int offset, | 19 | 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 | 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 */ |