]> Pileus Git - ~andy/linux/blobdiff - net/core/iovec.c
net: move iov_pages() to net/core/iovec.c
[~andy/linux] / net / core / iovec.c
index de178e462682af6c97dbfc4326df85942ec25174..b77eeecc00115eefd2395648e71cb337ee53757a 100644 (file)
@@ -212,3 +212,27 @@ out_fault:
        goto out;
 }
 EXPORT_SYMBOL(csum_partial_copy_fromiovecend);
+
+unsigned long iov_pages(const struct iovec *iov, int offset,
+                       unsigned long nr_segs)
+{
+       unsigned long seg, base;
+       int pages = 0, len, size;
+
+       while (nr_segs && (offset >= iov->iov_len)) {
+               offset -= iov->iov_len;
+               ++iov;
+               --nr_segs;
+       }
+
+       for (seg = 0; seg < nr_segs; seg++) {
+               base = (unsigned long)iov[seg].iov_base + offset;
+               len = iov[seg].iov_len - offset;
+               size = ((base & ~PAGE_MASK) + len + ~PAGE_MASK) >> PAGE_SHIFT;
+               pages += size;
+               offset = 0;
+       }
+
+       return pages;
+}
+EXPORT_SYMBOL(iov_pages);