diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2024-04-07 02:42:36 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2024-04-07 02:42:36 -0400 |
commit | e82051193a171f393d2a165a7ce18d8a2e2b4837 (patch) | |
tree | afb78295d4390ae7034f86589f0fd980dfb74d3e | |
parent | 39cd87c4eb2b893354f3b850f916353f2658ae6f (diff) |
new helper: copy_to_iter_full()
... and convert copy_linear_skb() to using that.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | include/linux/uio.h | 10 | ||||
-rw-r--r-- | include/net/udp.h | 9 |
2 files changed, 11 insertions, 8 deletions
diff --git a/include/linux/uio.h b/include/linux/uio.h index 00cebe2b70de..7020adedfa08 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h @@ -206,6 +206,16 @@ size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i) } static __always_inline __must_check +bool copy_to_iter_full(const void *addr, size_t bytes, struct iov_iter *i) +{ + size_t copied = copy_to_iter(addr, bytes, i); + if (likely(copied == bytes)) + return true; + iov_iter_revert(i, copied); + return false; +} + +static __always_inline __must_check bool copy_from_iter_full(void *addr, size_t bytes, struct iov_iter *i) { size_t copied = copy_from_iter(addr, bytes, i); diff --git a/include/net/udp.h b/include/net/udp.h index 488a6d2babcc..c4e05b14b648 100644 --- a/include/net/udp.h +++ b/include/net/udp.h @@ -379,14 +379,7 @@ static inline bool udp_skb_is_linear(struct sk_buff *skb) static inline int copy_linear_skb(struct sk_buff *skb, int len, int off, struct iov_iter *to) { - int n; - - n = copy_to_iter(skb->data + off, len, to); - if (n == len) - return 0; - - iov_iter_revert(to, n); - return -EFAULT; + return copy_to_iter_full(skb->data + off, len, to) ? 0 : -EFAULT; } /* |