9
9
#ifndef __LINUX_UIO_H
10
10
#define __LINUX_UIO_H
11
11
12
+ #include <linux/kernel.h>
12
13
#include <uapi/linux/uio.h>
13
14
15
+ struct page ;
14
16
15
17
struct kvec {
16
18
void * iov_base ; /* and that should *never* hold a userland pointer */
17
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
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
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
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
88
int memcpy_fromiovec (unsigned char * kdata , struct iovec * iov , int len );
40
89
int memcpy_toiovec (struct iovec * iov , unsigned char * kdata , int len );
90
+
41
91
#endif
0 commit comments