skb_copy_datagram_iovec() can die
no callers other than itself. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -2644,8 +2644,6 @@ struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, int noblock,
|
|||||||
int *err);
|
int *err);
|
||||||
unsigned int datagram_poll(struct file *file, struct socket *sock,
|
unsigned int datagram_poll(struct file *file, struct socket *sock,
|
||||||
struct poll_table_struct *wait);
|
struct poll_table_struct *wait);
|
||||||
int skb_copy_datagram_iovec(const struct sk_buff *from, int offset,
|
|
||||||
struct iovec *to, int size);
|
|
||||||
int skb_copy_datagram_iter(const struct sk_buff *from, int offset,
|
int skb_copy_datagram_iter(const struct sk_buff *from, int offset,
|
||||||
struct iov_iter *to, int size);
|
struct iov_iter *to, int size);
|
||||||
static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset,
|
static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset,
|
||||||
|
@@ -309,90 +309,6 @@ int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(skb_kill_datagram);
|
EXPORT_SYMBOL(skb_kill_datagram);
|
||||||
|
|
||||||
/**
|
|
||||||
* skb_copy_datagram_iovec - Copy a datagram to an iovec.
|
|
||||||
* @skb: buffer to copy
|
|
||||||
* @offset: offset in the buffer to start copying from
|
|
||||||
* @to: io vector to copy to
|
|
||||||
* @len: amount of data to copy from buffer to iovec
|
|
||||||
*
|
|
||||||
* Note: the iovec is modified during the copy.
|
|
||||||
*/
|
|
||||||
int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset,
|
|
||||||
struct iovec *to, int len)
|
|
||||||
{
|
|
||||||
int start = skb_headlen(skb);
|
|
||||||
int i, copy = start - offset;
|
|
||||||
struct sk_buff *frag_iter;
|
|
||||||
|
|
||||||
trace_skb_copy_datagram_iovec(skb, len);
|
|
||||||
|
|
||||||
/* Copy header. */
|
|
||||||
if (copy > 0) {
|
|
||||||
if (copy > len)
|
|
||||||
copy = len;
|
|
||||||
if (memcpy_toiovec(to, skb->data + offset, copy))
|
|
||||||
goto fault;
|
|
||||||
if ((len -= copy) == 0)
|
|
||||||
return 0;
|
|
||||||
offset += copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy paged appendix. Hmm... why does this look so complicated? */
|
|
||||||
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
|
|
||||||
int end;
|
|
||||||
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
|
|
||||||
|
|
||||||
WARN_ON(start > offset + len);
|
|
||||||
|
|
||||||
end = start + skb_frag_size(frag);
|
|
||||||
if ((copy = end - offset) > 0) {
|
|
||||||
int err;
|
|
||||||
u8 *vaddr;
|
|
||||||
struct page *page = skb_frag_page(frag);
|
|
||||||
|
|
||||||
if (copy > len)
|
|
||||||
copy = len;
|
|
||||||
vaddr = kmap(page);
|
|
||||||
err = memcpy_toiovec(to, vaddr + frag->page_offset +
|
|
||||||
offset - start, copy);
|
|
||||||
kunmap(page);
|
|
||||||
if (err)
|
|
||||||
goto fault;
|
|
||||||
if (!(len -= copy))
|
|
||||||
return 0;
|
|
||||||
offset += copy;
|
|
||||||
}
|
|
||||||
start = end;
|
|
||||||
}
|
|
||||||
|
|
||||||
skb_walk_frags(skb, frag_iter) {
|
|
||||||
int end;
|
|
||||||
|
|
||||||
WARN_ON(start > offset + len);
|
|
||||||
|
|
||||||
end = start + frag_iter->len;
|
|
||||||
if ((copy = end - offset) > 0) {
|
|
||||||
if (copy > len)
|
|
||||||
copy = len;
|
|
||||||
if (skb_copy_datagram_iovec(frag_iter,
|
|
||||||
offset - start,
|
|
||||||
to, copy))
|
|
||||||
goto fault;
|
|
||||||
if ((len -= copy) == 0)
|
|
||||||
return 0;
|
|
||||||
offset += copy;
|
|
||||||
}
|
|
||||||
start = end;
|
|
||||||
}
|
|
||||||
if (!len)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
fault:
|
|
||||||
return -EFAULT;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(skb_copy_datagram_iovec);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* skb_copy_datagram_iter - Copy a datagram to an iovec iterator.
|
* skb_copy_datagram_iter - Copy a datagram to an iovec iterator.
|
||||||
* @skb: buffer to copy
|
* @skb: buffer to copy
|
||||||
|
Reference in New Issue
Block a user