aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorKent Overstreet <kmo@daterainc.com>2013-11-27 19:29:46 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2014-04-01 23:19:21 -0400
commit9223687863ffa63fa655f52ef64148ee08dee4d1 (patch)
tree314ffae2789995acbd311cf0832a766035021b26 /include
parent8142c184b8f16d213eb8ba06ccb6222259a51cfc (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.h32
-rw-r--r--include/linux/uio.h50
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;
295struct address_space; 295struct address_space;
296struct writeback_control; 296struct writeback_control;
297 297
298struct iov_iter {
299 const struct iovec *iov;
300 unsigned long nr_segs;
301 size_t iov_offset;
302 size_t count;
303};
304
305size_t iov_iter_copy_from_user_atomic(struct page *page,
306 struct iov_iter *i, unsigned long offset, size_t bytes);
307size_t iov_iter_copy_from_user(struct page *page,
308 struct iov_iter *i, unsigned long offset, size_t bytes);
309void iov_iter_advance(struct iov_iter *i, size_t bytes);
310int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes);
311size_t iov_iter_single_seg_count(const struct iov_iter *i);
312
313static 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
325static 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
15struct page;
14 16
15struct kvec { 17struct 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
22struct 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
46static 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
37unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to); 61unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to);
38 62
63size_t iov_iter_copy_from_user_atomic(struct page *page,
64 struct iov_iter *i, unsigned long offset, size_t bytes);
65size_t iov_iter_copy_from_user(struct page *page,
66 struct iov_iter *i, unsigned long offset, size_t bytes);
67void iov_iter_advance(struct iov_iter *i, size_t bytes);
68int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes);
69size_t iov_iter_single_seg_count(const struct iov_iter *i);
70
71static 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
83static inline size_t iov_iter_count(struct iov_iter *i)
84{
85 return i->count;
86}
87
39int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len); 88int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len);
40int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len); 89int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len);
90
41#endif 91#endif