X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=net%2Fcore%2Fiovec.c;h=b77eeecc00115eefd2395648e71cb337ee53757a;hb=ea23192e8e577dfc51e0f4fc5ca113af334edff9;hp=de178e462682af6c97dbfc4326df85942ec25174;hpb=e3a0dd98e1ddfd135b7ef889fcc0269e8c2ca445;p=~andy%2Flinux diff --git a/net/core/iovec.c b/net/core/iovec.c index de178e46268..b77eeecc001 100644 --- a/net/core/iovec.c +++ b/net/core/iovec.c @@ -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);