iov_iter.c revision f67da30c1d5fc9e341bc8121708874bfd7b31e45
14f18cd317a118c28482f97303600a2fe2ada6c79Al Viro#include <linux/export.h>
24f18cd317a118c28482f97303600a2fe2ada6c79Al Viro#include <linux/uio.h>
34f18cd317a118c28482f97303600a2fe2ada6c79Al Viro#include <linux/pagemap.h>
44f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
54f18cd317a118c28482f97303600a2fe2ada6c79Al Virosize_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
64f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			 struct iov_iter *i)
74f18cd317a118c28482f97303600a2fe2ada6c79Al Viro{
84f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	size_t skip, copy, left, wanted;
94f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	const struct iovec *iov;
104f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	char __user *buf;
114f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	void *kaddr, *from;
124f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
134f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	if (unlikely(bytes > i->count))
144f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		bytes = i->count;
154f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
164f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	if (unlikely(!bytes))
174f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		return 0;
184f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
194f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	wanted = bytes;
204f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	iov = i->iov;
214f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	skip = i->iov_offset;
224f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	buf = iov->iov_base + skip;
234f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	copy = min(bytes, iov->iov_len - skip);
244f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
254f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	if (!fault_in_pages_writeable(buf, copy)) {
264f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		kaddr = kmap_atomic(page);
274f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		from = kaddr + offset;
284f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
294f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		/* first chunk, usually the only one */
304f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		left = __copy_to_user_inatomic(buf, from, copy);
314f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copy -= left;
324f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		skip += copy;
334f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		from += copy;
344f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		bytes -= copy;
354f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
364f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		while (unlikely(!left && bytes)) {
374f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			iov++;
384f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			buf = iov->iov_base;
394f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			copy = min(bytes, iov->iov_len);
404f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			left = __copy_to_user_inatomic(buf, from, copy);
414f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			copy -= left;
424f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			skip = copy;
434f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			from += copy;
444f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			bytes -= copy;
454f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		}
464f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		if (likely(!bytes)) {
474f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			kunmap_atomic(kaddr);
484f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			goto done;
494f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		}
504f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		offset = from - kaddr;
514f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		buf += copy;
524f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		kunmap_atomic(kaddr);
534f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copy = min(bytes, iov->iov_len - skip);
544f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	}
554f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	/* Too bad - revert to non-atomic kmap */
564f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	kaddr = kmap(page);
574f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	from = kaddr + offset;
584f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	left = __copy_to_user(buf, from, copy);
594f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	copy -= left;
604f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	skip += copy;
614f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	from += copy;
624f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	bytes -= copy;
634f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	while (unlikely(!left && bytes)) {
644f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		iov++;
654f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		buf = iov->iov_base;
664f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copy = min(bytes, iov->iov_len);
674f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		left = __copy_to_user(buf, from, copy);
684f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copy -= left;
694f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		skip = copy;
704f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		from += copy;
714f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		bytes -= copy;
724f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	}
734f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	kunmap(page);
744f18cd317a118c28482f97303600a2fe2ada6c79Al Virodone:
754f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	i->count -= wanted - bytes;
764f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	i->nr_segs -= iov - i->iov;
774f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	i->iov = iov;
784f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	i->iov_offset = skip;
794f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	return wanted - bytes;
804f18cd317a118c28482f97303600a2fe2ada6c79Al Viro}
814f18cd317a118c28482f97303600a2fe2ada6c79Al ViroEXPORT_SYMBOL(copy_page_to_iter);
824f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
834f18cd317a118c28482f97303600a2fe2ada6c79Al Virostatic size_t __iovec_copy_from_user_inatomic(char *vaddr,
844f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			const struct iovec *iov, size_t base, size_t bytes)
854f18cd317a118c28482f97303600a2fe2ada6c79Al Viro{
864f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	size_t copied = 0, left = 0;
874f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
884f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	while (bytes) {
894f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		char __user *buf = iov->iov_base + base;
904f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		int copy = min(bytes, iov->iov_len - base);
914f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
924f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		base = 0;
934f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		left = __copy_from_user_inatomic(vaddr, buf, copy);
944f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copied += copy;
954f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		bytes -= copy;
964f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		vaddr += copy;
974f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		iov++;
984f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
994f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		if (unlikely(left))
1004f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			break;
1014f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	}
1024f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	return copied - left;
1034f18cd317a118c28482f97303600a2fe2ada6c79Al Viro}
1044f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1054f18cd317a118c28482f97303600a2fe2ada6c79Al Viro/*
1064f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * Copy as much as we can into the page and return the number of bytes which
1074f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * were successfully copied.  If a fault is encountered then return the number of
1084f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * bytes which were copied.
1094f18cd317a118c28482f97303600a2fe2ada6c79Al Viro */
1104f18cd317a118c28482f97303600a2fe2ada6c79Al Virosize_t iov_iter_copy_from_user_atomic(struct page *page,
1114f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		struct iov_iter *i, unsigned long offset, size_t bytes)
1124f18cd317a118c28482f97303600a2fe2ada6c79Al Viro{
1134f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	char *kaddr;
1144f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	size_t copied;
1154f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1164f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	kaddr = kmap_atomic(page);
1174f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	if (likely(i->nr_segs == 1)) {
1184f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		int left;
1194f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		char __user *buf = i->iov->iov_base + i->iov_offset;
1204f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		left = __copy_from_user_inatomic(kaddr + offset, buf, bytes);
1214f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copied = bytes - left;
1224f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	} else {
1234f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copied = __iovec_copy_from_user_inatomic(kaddr + offset,
1244f18cd317a118c28482f97303600a2fe2ada6c79Al Viro						i->iov, i->iov_offset, bytes);
1254f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	}
1264f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	kunmap_atomic(kaddr);
1274f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1284f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	return copied;
1294f18cd317a118c28482f97303600a2fe2ada6c79Al Viro}
1304f18cd317a118c28482f97303600a2fe2ada6c79Al ViroEXPORT_SYMBOL(iov_iter_copy_from_user_atomic);
1314f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1324f18cd317a118c28482f97303600a2fe2ada6c79Al Virovoid iov_iter_advance(struct iov_iter *i, size_t bytes)
1334f18cd317a118c28482f97303600a2fe2ada6c79Al Viro{
1344f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	BUG_ON(i->count < bytes);
1354f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1364f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	if (likely(i->nr_segs == 1)) {
1374f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		i->iov_offset += bytes;
1384f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		i->count -= bytes;
1394f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	} else {
1404f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		const struct iovec *iov = i->iov;
1414f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		size_t base = i->iov_offset;
1424f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		unsigned long nr_segs = i->nr_segs;
1434f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1444f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		/*
1454f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		 * The !iov->iov_len check ensures we skip over unlikely
1464f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		 * zero-length segments (without overruning the iovec).
1474f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		 */
1484f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		while (bytes || unlikely(i->count && !iov->iov_len)) {
1494f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			int copy;
1504f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1514f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			copy = min(bytes, iov->iov_len - base);
1524f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			BUG_ON(!i->count || i->count < copy);
1534f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			i->count -= copy;
1544f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			bytes -= copy;
1554f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			base += copy;
1564f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			if (iov->iov_len == base) {
1574f18cd317a118c28482f97303600a2fe2ada6c79Al Viro				iov++;
1584f18cd317a118c28482f97303600a2fe2ada6c79Al Viro				nr_segs--;
1594f18cd317a118c28482f97303600a2fe2ada6c79Al Viro				base = 0;
1604f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			}
1614f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		}
1624f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		i->iov = iov;
1634f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		i->iov_offset = base;
1644f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		i->nr_segs = nr_segs;
1654f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	}
1664f18cd317a118c28482f97303600a2fe2ada6c79Al Viro}
1674f18cd317a118c28482f97303600a2fe2ada6c79Al ViroEXPORT_SYMBOL(iov_iter_advance);
1684f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1694f18cd317a118c28482f97303600a2fe2ada6c79Al Viro/*
1704f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * Fault in the first iovec of the given iov_iter, to a maximum length
1714f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * of bytes. Returns 0 on success, or non-zero if the memory could not be
1724f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * accessed (ie. because it is an invalid address).
1734f18cd317a118c28482f97303600a2fe2ada6c79Al Viro *
1744f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * writev-intensive code may want this to prefault several iovecs -- that
1754f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * would be possible (callers must not rely on the fact that _only_ the
1764f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * first iovec will be faulted with the current implementation).
1774f18cd317a118c28482f97303600a2fe2ada6c79Al Viro */
1784f18cd317a118c28482f97303600a2fe2ada6c79Al Viroint iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes)
1794f18cd317a118c28482f97303600a2fe2ada6c79Al Viro{
1804f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	char __user *buf = i->iov->iov_base + i->iov_offset;
1814f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	bytes = min(bytes, i->iov->iov_len - i->iov_offset);
1824f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	return fault_in_pages_readable(buf, bytes);
1834f18cd317a118c28482f97303600a2fe2ada6c79Al Viro}
1844f18cd317a118c28482f97303600a2fe2ada6c79Al ViroEXPORT_SYMBOL(iov_iter_fault_in_readable);
1854f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1864f18cd317a118c28482f97303600a2fe2ada6c79Al Viro/*
1874f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * Return the count of just the current iov_iter segment.
1884f18cd317a118c28482f97303600a2fe2ada6c79Al Viro */
1894f18cd317a118c28482f97303600a2fe2ada6c79Al Virosize_t iov_iter_single_seg_count(const struct iov_iter *i)
1904f18cd317a118c28482f97303600a2fe2ada6c79Al Viro{
1914f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	const struct iovec *iov = i->iov;
1924f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	if (i->nr_segs == 1)
1934f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		return i->count;
1944f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	else
1954f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		return min(i->count, iov->iov_len - i->iov_offset);
1964f18cd317a118c28482f97303600a2fe2ada6c79Al Viro}
1974f18cd317a118c28482f97303600a2fe2ada6c79Al ViroEXPORT_SYMBOL(iov_iter_single_seg_count);
198886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro
199886a39115005ced8b15ab067c9c2a8d546b40a5eAl Virounsigned long iov_iter_alignment(const struct iov_iter *i)
200886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro{
201886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	const struct iovec *iov = i->iov;
202886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	unsigned long res;
203886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	size_t size = i->count;
204886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	size_t n;
205886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro
206886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	if (!size)
207886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro		return 0;
208886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro
209886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	res = (unsigned long)iov->iov_base + i->iov_offset;
210886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	n = iov->iov_len - i->iov_offset;
211886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	if (n >= size)
212886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro		return res | size;
213886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	size -= n;
214886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	res |= n;
215886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	while (size > (++iov)->iov_len) {
216886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro		res |= (unsigned long)iov->iov_base | iov->iov_len;
217886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro		size -= iov->iov_len;
218886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	}
219886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	res |= (unsigned long)iov->iov_base | size;
220886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	return res;
221886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro}
222886a39115005ced8b15ab067c9c2a8d546b40a5eAl ViroEXPORT_SYMBOL(iov_iter_alignment);
22371d8e532b1549a478e6a6a8a44f309d050294d00Al Viro
22471d8e532b1549a478e6a6a8a44f309d050294d00Al Virovoid iov_iter_init(struct iov_iter *i, int direction,
22571d8e532b1549a478e6a6a8a44f309d050294d00Al Viro			const struct iovec *iov, unsigned long nr_segs,
22671d8e532b1549a478e6a6a8a44f309d050294d00Al Viro			size_t count)
22771d8e532b1549a478e6a6a8a44f309d050294d00Al Viro{
22871d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	/* It will get better.  Eventually... */
22971d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	if (segment_eq(get_fs(), KERNEL_DS))
23071d8e532b1549a478e6a6a8a44f309d050294d00Al Viro		direction |= REQ_KERNEL;
23171d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	i->type = direction;
23271d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	i->iov = iov;
23371d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	i->nr_segs = nr_segs;
23471d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	i->iov_offset = 0;
23571d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	i->count = count;
23671d8e532b1549a478e6a6a8a44f309d050294d00Al Viro}
23771d8e532b1549a478e6a6a8a44f309d050294d00Al ViroEXPORT_SYMBOL(iov_iter_init);
2387b2c99d15559e285384c742db52316802e24b0bdAl Viro
2397b2c99d15559e285384c742db52316802e24b0bdAl Virossize_t iov_iter_get_pages(struct iov_iter *i,
2407b2c99d15559e285384c742db52316802e24b0bdAl Viro		   struct page **pages, size_t maxsize,
2417b2c99d15559e285384c742db52316802e24b0bdAl Viro		   size_t *start)
2427b2c99d15559e285384c742db52316802e24b0bdAl Viro{
2437b2c99d15559e285384c742db52316802e24b0bdAl Viro	size_t offset = i->iov_offset;
2447b2c99d15559e285384c742db52316802e24b0bdAl Viro	const struct iovec *iov = i->iov;
2457b2c99d15559e285384c742db52316802e24b0bdAl Viro	size_t len;
2467b2c99d15559e285384c742db52316802e24b0bdAl Viro	unsigned long addr;
2477b2c99d15559e285384c742db52316802e24b0bdAl Viro	int n;
2487b2c99d15559e285384c742db52316802e24b0bdAl Viro	int res;
2497b2c99d15559e285384c742db52316802e24b0bdAl Viro
2507b2c99d15559e285384c742db52316802e24b0bdAl Viro	len = iov->iov_len - offset;
2517b2c99d15559e285384c742db52316802e24b0bdAl Viro	if (len > i->count)
2527b2c99d15559e285384c742db52316802e24b0bdAl Viro		len = i->count;
2537b2c99d15559e285384c742db52316802e24b0bdAl Viro	if (len > maxsize)
2547b2c99d15559e285384c742db52316802e24b0bdAl Viro		len = maxsize;
2557b2c99d15559e285384c742db52316802e24b0bdAl Viro	addr = (unsigned long)iov->iov_base + offset;
2567b2c99d15559e285384c742db52316802e24b0bdAl Viro	len += *start = addr & (PAGE_SIZE - 1);
2577b2c99d15559e285384c742db52316802e24b0bdAl Viro	addr &= ~(PAGE_SIZE - 1);
2587b2c99d15559e285384c742db52316802e24b0bdAl Viro	n = (len + PAGE_SIZE - 1) / PAGE_SIZE;
2597b2c99d15559e285384c742db52316802e24b0bdAl Viro	res = get_user_pages_fast(addr, n, (i->type & WRITE) != WRITE, pages);
2607b2c99d15559e285384c742db52316802e24b0bdAl Viro	if (unlikely(res < 0))
2617b2c99d15559e285384c742db52316802e24b0bdAl Viro		return res;
2627b2c99d15559e285384c742db52316802e24b0bdAl Viro	return (res == n ? len : res * PAGE_SIZE) - *start;
2637b2c99d15559e285384c742db52316802e24b0bdAl Viro}
2647b2c99d15559e285384c742db52316802e24b0bdAl ViroEXPORT_SYMBOL(iov_iter_get_pages);
265f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro
266f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viroint iov_iter_npages(const struct iov_iter *i, int maxpages)
267f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro{
268f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	size_t offset = i->iov_offset;
269f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	size_t size = i->count;
270f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	const struct iovec *iov = i->iov;
271f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	int npages = 0;
272f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	int n;
273f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro
274f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	for (n = 0; size && n < i->nr_segs; n++, iov++) {
275f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		unsigned long addr = (unsigned long)iov->iov_base + offset;
276f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		size_t len = iov->iov_len - offset;
277f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		offset = 0;
278f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		if (unlikely(!len))	/* empty segment */
279f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro			continue;
280f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		if (len > size)
281f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro			len = size;
282f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		npages += (addr + len + PAGE_SIZE - 1) / PAGE_SIZE
283f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro			  - addr / PAGE_SIZE;
284f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		if (npages >= maxpages)	/* don't bother going further */
285f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro			return maxpages;
286f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		size -= len;
287f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		offset = 0;
288f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	}
289f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	return min(npages, maxpages);
290f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro}
291f67da30c1d5fc9e341bc8121708874bfd7b31e45Al ViroEXPORT_SYMBOL(iov_iter_npages);
292