diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2014-11-24 18:29:54 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-12-09 16:29:11 -0500 |
commit | d3a9632f09153bc46a8077844e05e179f1c10c3f (patch) | |
tree | a443ff60494f22ea773f8da499f2b88262724f5c | |
parent | ba5684083c7b35e492dd856be2f9724b0efea416 (diff) |
skb_copy_datagram_iovec() can die
no callers other than itself.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | include/linux/skbuff.h | 2 | ||||
-rw-r--r-- | net/core/datagram.c | 84 |
2 files changed, 0 insertions, 86 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 4902f2df90c8..ab0bc43c82a4 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -2644,8 +2644,6 @@ 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, | ||
2648 | struct iovec *to, int size); | ||
2649 | int skb_copy_datagram_iter(const struct sk_buff *from, int offset, | 2647 | int skb_copy_datagram_iter(const struct sk_buff *from, int offset, |
2650 | struct iov_iter *to, int size); | 2648 | struct iov_iter *to, int size); |
2651 | 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, |
diff --git a/net/core/datagram.c b/net/core/datagram.c index 41075ed6bb52..df493d68330c 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
@@ -310,90 +310,6 @@ int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags) | |||
310 | EXPORT_SYMBOL(skb_kill_datagram); | 310 | EXPORT_SYMBOL(skb_kill_datagram); |
311 | 311 | ||
312 | /** | 312 | /** |
313 | * skb_copy_datagram_iovec - Copy a datagram to an iovec. | ||
314 | * @skb: buffer to copy | ||
315 | * @offset: offset in the buffer to start copying from | ||
316 | * @to: io vector to copy to | ||
317 | * @len: amount of data to copy from buffer to iovec | ||
318 | * | ||
319 | * Note: the iovec is modified during the copy. | ||
320 | */ | ||
321 | int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset, | ||
322 | struct iovec *to, int len) | ||
323 | { | ||
324 | int start = skb_headlen(skb); | ||
325 | int i, copy = start - offset; | ||
326 | struct sk_buff *frag_iter; | ||
327 | |||
328 | trace_skb_copy_datagram_iovec(skb, len); | ||
329 | |||
330 | /* Copy header. */ | ||
331 | if (copy > 0) { | ||
332 | if (copy > len) | ||
333 | copy = len; | ||
334 | if (memcpy_toiovec(to, skb->data + offset, copy)) | ||
335 | goto fault; | ||
336 | if ((len -= copy) == 0) | ||
337 | return 0; | ||
338 | offset += copy; | ||
339 | } | ||
340 | |||
341 | /* Copy paged appendix. Hmm... why does this look so complicated? */ | ||
342 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | ||
343 | int end; | ||
344 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
345 | |||
346 | WARN_ON(start > offset + len); | ||
347 | |||
348 | end = start + skb_frag_size(frag); | ||
349 | if ((copy = end - offset) > 0) { | ||
350 | int err; | ||
351 | u8 *vaddr; | ||
352 | struct page *page = skb_frag_page(frag); | ||
353 | |||
354 | if (copy > len) | ||
355 | copy = len; | ||
356 | vaddr = kmap(page); | ||
357 | err = memcpy_toiovec(to, vaddr + frag->page_offset + | ||
358 | offset - start, copy); | ||
359 | kunmap(page); | ||
360 | if (err) | ||
361 | goto fault; | ||
362 | if (!(len -= copy)) | ||
363 | return 0; | ||
364 | offset += copy; | ||
365 | } | ||
366 | start = end; | ||
367 | } | ||
368 | |||
369 | skb_walk_frags(skb, frag_iter) { | ||
370 | int end; | ||
371 | |||
372 | WARN_ON(start > offset + len); | ||
373 | |||
374 | end = start + frag_iter->len; | ||
375 | if ((copy = end - offset) > 0) { | ||
376 | if (copy > len) | ||
377 | copy = len; | ||
378 | if (skb_copy_datagram_iovec(frag_iter, | ||
379 | offset - start, | ||
380 | to, copy)) | ||
381 | goto fault; | ||
382 | if ((len -= copy) == 0) | ||
383 | return 0; | ||
384 | offset += copy; | ||
385 | } | ||
386 | start = end; | ||
387 | } | ||
388 | if (!len) | ||
389 | return 0; | ||
390 | |||
391 | fault: | ||
392 | return -EFAULT; | ||
393 | } | ||
394 | EXPORT_SYMBOL(skb_copy_datagram_iovec); | ||
395 | |||
396 | /** | ||
397 | * skb_copy_datagram_iter - Copy a datagram to an iovec iterator. | 313 | * skb_copy_datagram_iter - Copy a datagram to an iovec iterator. |
398 | * @skb: buffer to copy | 314 | * @skb: buffer to copy |
399 | * @offset: offset in the buffer to start copying from | 315 | * @offset: offset in the buffer to start copying from |