31
31
32
32
#include_next <linux/scatterlist.h>
33
33
34
- /*
35
- * XXX please review these
36
- *
37
- * XXXMJ curoff is ignored
38
- */
39
34
static inline size_t
40
35
sg_pcopy_from_buffer (struct scatterlist * sgl , unsigned int nents ,
41
- const void * buf , size_t buflen , off_t skip )
36
+ const void * buf , size_t buflen , off_t offset )
42
37
{
43
38
struct sg_page_iter iter ;
44
39
struct scatterlist * sg ;
45
40
struct page * page ;
46
41
void * vaddr ;
47
- off_t off ;
48
- int len , curlen , curoff ;
42
+ size_t total = 0 ;
43
+ size_t len ;
49
44
50
- off = 0 ;
51
45
for_each_sg_page (sgl , & iter , nents , 0 ) {
52
46
sg = iter .sg ;
53
- curlen = sg -> length ;
54
- curoff = sg -> offset ;
55
- if (skip != 0 && curlen >= skip ) {
56
- skip -= curlen ;
47
+
48
+ if (offset >= sg -> length ) {
49
+ offset -= sg -> length ;
57
50
continue ;
58
51
}
59
- if (skip != 0 ) {
60
- curlen -= skip ;
61
- curoff += skip ;
62
- skip = 0 ;
63
- }
64
- len = min (curlen , buflen - off );
52
+ len = min (buflen , sg -> length - offset );
53
+ if (len == 0 )
54
+ break ;
55
+
65
56
page = sg_page_iter_page (& iter );
66
- vaddr = ((caddr_t )kmap (page )) + sg -> offset ;
67
- memcpy (vaddr , (const char * )buf + off , len );
68
- off += len ;
57
+ vaddr = ((caddr_t )kmap (page )) + sg -> offset + offset ;
58
+ memcpy (vaddr , buf , len );
69
59
kunmap (page );
60
+
61
+ /* start at beginning of next page */
62
+ offset = 0 ;
63
+
64
+ /* advance buffer */
65
+ buf = (const char * )buf + len ;
66
+ buflen -= len ;
67
+ total += len ;
70
68
}
71
- return (off );
69
+ return (total );
72
70
}
73
71
74
72
static inline size_t
@@ -80,37 +78,40 @@ sg_copy_from_buffer(struct scatterlist *sgl, unsigned int nents,
80
78
81
79
static inline size_t
82
80
sg_pcopy_to_buffer (struct scatterlist * sgl , unsigned int nents ,
83
- void * buf , size_t buflen , off_t skip )
81
+ void * buf , size_t buflen , off_t offset )
84
82
{
85
83
struct sg_page_iter iter ;
86
84
struct scatterlist * sg ;
87
85
struct page * page ;
88
86
void * vaddr ;
89
- off_t off ;
90
- int len , curlen , curoff ;
87
+ size_t total = 0 ;
88
+ size_t len ;
91
89
92
- off = 0 ;
93
90
for_each_sg_page (sgl , & iter , nents , 0 ) {
94
91
sg = iter .sg ;
95
- curlen = sg -> length ;
96
- curoff = sg -> offset ;
97
- if (skip != 0 && curlen >= skip ) {
98
- skip -= curlen ;
92
+
93
+ if (offset >= sg -> length ) {
94
+ offset -= sg -> length ;
99
95
continue ;
100
96
}
101
- if (skip != 0 ) {
102
- curlen -= skip ;
103
- curoff += skip ;
104
- skip = 0 ;
105
- }
106
- len = min (curlen , buflen - off );
97
+ len = min (buflen , sg -> length - offset );
98
+ if (len == 0 )
99
+ break ;
100
+
107
101
page = sg_page_iter_page (& iter );
108
- vaddr = (caddr_t )kmap (page ) + sg -> offset ;
109
- memcpy (((caddr_t )buf ) + off , vaddr , len );
110
- off += len ;
102
+ vaddr = ((caddr_t )kmap (page )) + sg -> offset + offset ;
103
+ memcpy (buf , vaddr , len );
111
104
kunmap (page );
105
+
106
+ /* start at beginning of next page */
107
+ offset = 0 ;
108
+
109
+ /* advance buffer */
110
+ buf = (char * )buf + len ;
111
+ buflen -= len ;
112
+ total += len ;
112
113
}
113
- return (off );
114
+ return (total );
114
115
}
115
116
116
- #endif /* _LINUX_GPLV2_SCATTERLIST_H_ */
117
+ #endif /* _LINUX_GPLV2_SCATTERLIST_H_ */
0 commit comments