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 | |
parent | 8142c184b8f16d213eb8ba06ccb6222259a51cfc (diff) |
iov_iter: Move iov_iter to uio.h
Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Diffstat (limited to 'include')
-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 |