aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/iovec.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/iovec.c')
-rw-r--r--net/core/iovec.c24
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}
214EXPORT_SYMBOL(csum_partial_copy_fromiovecend); 214EXPORT_SYMBOL(csum_partial_copy_fromiovecend);
215
216unsigned 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}
238EXPORT_SYMBOL(iov_pages);