diff options
Diffstat (limited to 'net/core/iovec.c')
-rw-r--r-- | net/core/iovec.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/net/core/iovec.c b/net/core/iovec.c index de178e462682..b77eeecc0011 100644 --- a/net/core/iovec.c +++ b/net/core/iovec.c | |||
@@ -212,3 +212,27 @@ out_fault: | |||
212 | goto out; | 212 | goto out; |
213 | } | 213 | } |
214 | EXPORT_SYMBOL(csum_partial_copy_fromiovecend); | 214 | EXPORT_SYMBOL(csum_partial_copy_fromiovecend); |
215 | |||
216 | unsigned long iov_pages(const struct iovec *iov, int offset, | ||
217 | unsigned long nr_segs) | ||
218 | { | ||
219 | unsigned long seg, base; | ||
220 | int pages = 0, len, size; | ||
221 | |||
222 | while (nr_segs && (offset >= iov->iov_len)) { | ||
223 | offset -= iov->iov_len; | ||
224 | ++iov; | ||
225 | --nr_segs; | ||
226 | } | ||
227 | |||
228 | for (seg = 0; seg < nr_segs; seg++) { | ||
229 | base = (unsigned long)iov[seg].iov_base + offset; | ||
230 | len = iov[seg].iov_len - offset; | ||
231 | size = ((base & ~PAGE_MASK) + len + ~PAGE_MASK) >> PAGE_SHIFT; | ||
232 | pages += size; | ||
233 | offset = 0; | ||
234 | } | ||
235 | |||
236 | return pages; | ||
237 | } | ||
238 | EXPORT_SYMBOL(iov_pages); | ||