iov_iter.c revision 71d8e532b1549a478e6a6a8a44f309d050294d00
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);
238