diff options
| author | Kent Overstreet <kmo@daterainc.com> | 2013-11-27 19:29:46 -0500 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-04-01 23:19:21 -0400 |
| commit | 9223687863ffa63fa655f52ef64148ee08dee4d1 (patch) | |
| tree | 314ffae2789995acbd311cf0832a766035021b26 /include/linux | |
| parent | 8142c184b8f16d213eb8ba06ccb6222259a51cfc (diff) | |
iov_iter: Move iov_iter to uio.h
Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/fs.h | 32 | ||||
| -rw-r--r-- | include/linux/uio.h | 50 |
2 files changed, 50 insertions, 32 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index ddfff2ecef0b..2261ac8f0534 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -295,38 +295,6 @@ struct page; | |||
| 295 | struct address_space; | 295 | struct address_space; |
| 296 | struct writeback_control; | 296 | struct writeback_control; |
| 297 | 297 | ||
| 298 | struct iov_iter { | ||
| 299 | const struct iovec *iov; | ||
| 300 | unsigned long nr_segs; | ||
| 301 | size_t iov_offset; | ||
| 302 | size_t count; | ||
| 303 | }; | ||
| 304 | |||
| 305 | size_t iov_iter_copy_from_user_atomic(struct page *page, | ||
| 306 | struct iov_iter *i, unsigned long offset, size_t bytes); | ||
| 307 | size_t iov_iter_copy_from_user(struct page *page, | ||
| 308 | struct iov_iter *i, unsigned long offset, size_t bytes); | ||
| 309 | void iov_iter_advance(struct iov_iter *i, size_t bytes); | ||
| 310 | int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes); | ||
| 311 | size_t iov_iter_single_seg_count(const struct iov_iter *i); | ||
| 312 | |||
| 313 | static inline void iov_iter_init(struct iov_iter *i, | ||
| 314 | const struct iovec *iov, unsigned long nr_segs, | ||
| 315 | size_t count, size_t written) | ||
| 316 | { | ||
| 317 | i->iov = iov; | ||
| 318 | i->nr_segs = nr_segs; | ||
| 319 | i->iov_offset = 0; | ||
| 320 | i->count = count + written; | ||
| 321 | |||
| 322 | iov_iter_advance(i, written); | ||
| 323 | } | ||
| 324 | |||
| 325 | static inline size_t iov_iter_count(struct iov_iter *i) | ||
| 326 | { | ||
| 327 | return i->count; | ||
| 328 | } | ||
| 329 | |||
| 330 | /* | 298 | /* |
| 331 | * "descriptor" for what we're up to with a read. | 299 | * "descriptor" for what we're up to with a read. |
| 332 | * This allows us to use the same read code yet | 300 | * This allows us to use the same read code yet |
diff --git a/include/linux/uio.h b/include/linux/uio.h index c55ce243cc09..347d70ce098e 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h | |||
| @@ -9,14 +9,23 @@ | |||
| 9 | #ifndef __LINUX_UIO_H | 9 | #ifndef __LINUX_UIO_H |
| 10 | #define __LINUX_UIO_H | 10 | #define __LINUX_UIO_H |
| 11 | 11 | ||
| 12 | #include <linux/kernel.h> | ||
| 12 | #include <uapi/linux/uio.h> | 13 | #include <uapi/linux/uio.h> |
| 13 | 14 | ||
| 15 | struct page; | ||
| 14 | 16 | ||
| 15 | struct kvec { | 17 | struct kvec { |
| 16 | void *iov_base; /* and that should *never* hold a userland pointer */ | 18 | void *iov_base; /* and that should *never* hold a userland pointer */ |
| 17 | size_t iov_len; | 19 | size_t iov_len; |
| 18 | }; | 20 | }; |
| 19 | 21 | ||
| 22 | struct iov_iter { | ||
| 23 | const struct iovec *iov; | ||
| 24 | unsigned long nr_segs; | ||
| 25 | size_t iov_offset; | ||
| 26 | size_t count; | ||
| 27 | }; | ||
| 28 | |||
| 20 | /* | 29 | /* |
| 21 | * Total number of bytes covered by an iovec. | 30 | * Total number of bytes covered by an iovec. |
| 22 | * | 31 | * |
| @@ -34,8 +43,49 @@ static inline size_t iov_length(const struct iovec *iov, unsigned long nr_segs) | |||
| 34 | return ret; | 43 | return ret; |
| 35 | } | 44 | } |
| 36 | 45 | ||
| 46 | static inline struct iovec iov_iter_iovec(const struct iov_iter *iter) | ||
| 47 | { | ||
| 48 | return (struct iovec) { | ||
| 49 | .iov_base = iter->iov->iov_base + iter->iov_offset, | ||
| 50 | .iov_len = min(iter->count, | ||
| 51 | iter->iov->iov_len - iter->iov_offset), | ||
| 52 | }; | ||
| 53 | } | ||
| 54 | |||
| 55 | #define iov_for_each(iov, iter, start) \ | ||
| 56 | for (iter = (start); \ | ||
| 57 | (iter).count && \ | ||
| 58 | ((iov = iov_iter_iovec(&(iter))), 1); \ | ||
| 59 | iov_iter_advance(&(iter), (iov).iov_len)) | ||
| 60 | |||
| 37 | unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to); | 61 | unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to); |
| 38 | 62 | ||
| 63 | size_t iov_iter_copy_from_user_atomic(struct page *page, | ||
| 64 | struct iov_iter *i, unsigned long offset, size_t bytes); | ||
| 65 | size_t iov_iter_copy_from_user(struct page *page, | ||
| 66 | struct iov_iter *i, unsigned long offset, size_t bytes); | ||
| 67 | void iov_iter_advance(struct iov_iter *i, size_t bytes); | ||
| 68 | int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes); | ||
| 69 | size_t iov_iter_single_seg_count(const struct iov_iter *i); | ||
| 70 | |||
| 71 | static inline void iov_iter_init(struct iov_iter *i, | ||
| 72 | const struct iovec *iov, unsigned long nr_segs, | ||
| 73 | size_t count, size_t written) | ||
| 74 | { | ||
| 75 | i->iov = iov; | ||
| 76 | i->nr_segs = nr_segs; | ||
| 77 | i->iov_offset = 0; | ||
| 78 | i->count = count + written; | ||
| 79 | |||
| 80 | iov_iter_advance(i, written); | ||
| 81 | } | ||
| 82 | |||
| 83 | static inline size_t iov_iter_count(struct iov_iter *i) | ||
| 84 | { | ||
| 85 | return i->count; | ||
| 86 | } | ||
| 87 | |||
| 39 | int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); | 88 | int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); |
| 40 | int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len); | 89 | int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len); |
| 90 | |||
| 41 | #endif | 91 | #endif |
