summary refs log tree commit diff
path: root/net/core
diff options
context:
space:
mode:
authorJason Wang <jasowang@redhat.com>2013-08-06 17:45:03 +0800
committerDavid S. Miller <davem@davemloft.net>2013-08-07 16:52:33 -0700
commitb4bf07771faaf959b0a916d35b1b930c030e30a8 (patch)
tree9292ea7010fc74fb5c3f5039ee3886b1f42702f3 /net/core
parent6261d983f226f0a6a8d4d32b57a032bc23a5ebb6 (diff)
downloadlinux-b4bf07771faaf959b0a916d35b1b930c030e30a8.tar.gz
net: move iov_pages() to net/core/iovec.c
To let it be reused and reduce code duplication.

Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-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:
 	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);