iov_iter.c revision f0d1bec9d58d4c038d0ac958c9af82be6eb18045
14f18cd317a118c28482f97303600a2fe2ada6c79Al Viro#include <linux/export.h>
24f18cd317a118c28482f97303600a2fe2ada6c79Al Viro#include <linux/uio.h>
34f18cd317a118c28482f97303600a2fe2ada6c79Al Viro#include <linux/pagemap.h>
491f79c43d1b54d7154b118860d81b39bad07dfffAl Viro#include <linux/slab.h>
591f79c43d1b54d7154b118860d81b39bad07dfffAl Viro#include <linux/vmalloc.h>
64f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
74f18cd317a118c28482f97303600a2fe2ada6c79Al Virosize_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
84f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			 struct iov_iter *i)
94f18cd317a118c28482f97303600a2fe2ada6c79Al Viro{
104f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	size_t skip, copy, left, wanted;
114f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	const struct iovec *iov;
124f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	char __user *buf;
134f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	void *kaddr, *from;
144f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
154f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	if (unlikely(bytes > i->count))
164f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		bytes = i->count;
174f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
184f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	if (unlikely(!bytes))
194f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		return 0;
204f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
214f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	wanted = bytes;
224f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	iov = i->iov;
234f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	skip = i->iov_offset;
244f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	buf = iov->iov_base + skip;
254f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	copy = min(bytes, iov->iov_len - skip);
264f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
274f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	if (!fault_in_pages_writeable(buf, copy)) {
284f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		kaddr = kmap_atomic(page);
294f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		from = kaddr + offset;
304f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
314f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		/* first chunk, usually the only one */
324f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		left = __copy_to_user_inatomic(buf, from, copy);
334f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copy -= left;
344f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		skip += copy;
354f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		from += copy;
364f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		bytes -= copy;
374f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
384f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		while (unlikely(!left && bytes)) {
394f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			iov++;
404f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			buf = iov->iov_base;
414f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			copy = min(bytes, iov->iov_len);
424f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			left = __copy_to_user_inatomic(buf, from, copy);
434f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			copy -= left;
444f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			skip = copy;
454f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			from += copy;
464f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			bytes -= copy;
474f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		}
484f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		if (likely(!bytes)) {
494f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			kunmap_atomic(kaddr);
504f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			goto done;
514f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		}
524f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		offset = from - kaddr;
534f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		buf += copy;
544f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		kunmap_atomic(kaddr);
554f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copy = min(bytes, iov->iov_len - skip);
564f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	}
574f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	/* Too bad - revert to non-atomic kmap */
584f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	kaddr = kmap(page);
594f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	from = kaddr + offset;
604f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	left = __copy_to_user(buf, from, copy);
614f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	copy -= left;
624f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	skip += copy;
634f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	from += copy;
644f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	bytes -= copy;
654f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	while (unlikely(!left && bytes)) {
664f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		iov++;
674f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		buf = iov->iov_base;
684f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copy = min(bytes, iov->iov_len);
694f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		left = __copy_to_user(buf, from, copy);
704f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copy -= left;
714f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		skip = copy;
724f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		from += copy;
734f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		bytes -= copy;
744f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	}
754f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	kunmap(page);
764f18cd317a118c28482f97303600a2fe2ada6c79Al Virodone:
774f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	i->count -= wanted - bytes;
784f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	i->nr_segs -= iov - i->iov;
794f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	i->iov = iov;
804f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	i->iov_offset = skip;
814f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	return wanted - bytes;
824f18cd317a118c28482f97303600a2fe2ada6c79Al Viro}
834f18cd317a118c28482f97303600a2fe2ada6c79Al ViroEXPORT_SYMBOL(copy_page_to_iter);
844f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
85f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Virosize_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes,
86f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro			 struct iov_iter *i)
87f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro{
88f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	size_t skip, copy, left, wanted;
89f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	const struct iovec *iov;
90f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	char __user *buf;
91f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	void *kaddr, *to;
92f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro
93f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	if (unlikely(bytes > i->count))
94f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		bytes = i->count;
95f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro
96f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	if (unlikely(!bytes))
97f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		return 0;
98f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro
99f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	wanted = bytes;
100f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	iov = i->iov;
101f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	skip = i->iov_offset;
102f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	buf = iov->iov_base + skip;
103f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	copy = min(bytes, iov->iov_len - skip);
104f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro
105f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	if (!fault_in_pages_readable(buf, copy)) {
106f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		kaddr = kmap_atomic(page);
107f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		to = kaddr + offset;
108f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro
109f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		/* first chunk, usually the only one */
110f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		left = __copy_from_user_inatomic(to, buf, copy);
111f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		copy -= left;
112f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		skip += copy;
113f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		to += copy;
114f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		bytes -= copy;
115f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro
116f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		while (unlikely(!left && bytes)) {
117f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro			iov++;
118f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro			buf = iov->iov_base;
119f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro			copy = min(bytes, iov->iov_len);
120f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro			left = __copy_from_user_inatomic(to, buf, copy);
121f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro			copy -= left;
122f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro			skip = copy;
123f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro			to += copy;
124f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro			bytes -= copy;
125f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		}
126f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		if (likely(!bytes)) {
127f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro			kunmap_atomic(kaddr);
128f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro			goto done;
129f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		}
130f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		offset = to - kaddr;
131f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		buf += copy;
132f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		kunmap_atomic(kaddr);
133f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		copy = min(bytes, iov->iov_len - skip);
134f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	}
135f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	/* Too bad - revert to non-atomic kmap */
136f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	kaddr = kmap(page);
137f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	to = kaddr + offset;
138f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	left = __copy_from_user(to, buf, copy);
139f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	copy -= left;
140f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	skip += copy;
141f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	to += copy;
142f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	bytes -= copy;
143f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	while (unlikely(!left && bytes)) {
144f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		iov++;
145f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		buf = iov->iov_base;
146f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		copy = min(bytes, iov->iov_len);
147f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		left = __copy_from_user(to, buf, copy);
148f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		copy -= left;
149f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		skip = copy;
150f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		to += copy;
151f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro		bytes -= copy;
152f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	}
153f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	kunmap(page);
154f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Virodone:
155f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	i->count -= wanted - bytes;
156f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	i->nr_segs -= iov - i->iov;
157f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	i->iov = iov;
158f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	i->iov_offset = skip;
159f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro	return wanted - bytes;
160f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro}
161f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al ViroEXPORT_SYMBOL(copy_page_from_iter);
162f0d1bec9d58d4c038d0ac958c9af82be6eb18045Al Viro
1634f18cd317a118c28482f97303600a2fe2ada6c79Al Virostatic size_t __iovec_copy_from_user_inatomic(char *vaddr,
1644f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			const struct iovec *iov, size_t base, size_t bytes)
1654f18cd317a118c28482f97303600a2fe2ada6c79Al Viro{
1664f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	size_t copied = 0, left = 0;
1674f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1684f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	while (bytes) {
1694f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		char __user *buf = iov->iov_base + base;
1704f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		int copy = min(bytes, iov->iov_len - base);
1714f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1724f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		base = 0;
1734f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		left = __copy_from_user_inatomic(vaddr, buf, copy);
1744f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copied += copy;
1754f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		bytes -= copy;
1764f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		vaddr += copy;
1774f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		iov++;
1784f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1794f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		if (unlikely(left))
1804f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			break;
1814f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	}
1824f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	return copied - left;
1834f18cd317a118c28482f97303600a2fe2ada6c79Al Viro}
1844f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1854f18cd317a118c28482f97303600a2fe2ada6c79Al Viro/*
1864f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * Copy as much as we can into the page and return the number of bytes which
1874f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * were successfully copied.  If a fault is encountered then return the number of
1884f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * bytes which were copied.
1894f18cd317a118c28482f97303600a2fe2ada6c79Al Viro */
1904f18cd317a118c28482f97303600a2fe2ada6c79Al Virosize_t iov_iter_copy_from_user_atomic(struct page *page,
1914f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		struct iov_iter *i, unsigned long offset, size_t bytes)
1924f18cd317a118c28482f97303600a2fe2ada6c79Al Viro{
1934f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	char *kaddr;
1944f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	size_t copied;
1954f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
1964f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	kaddr = kmap_atomic(page);
1974f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	if (likely(i->nr_segs == 1)) {
1984f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		int left;
1994f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		char __user *buf = i->iov->iov_base + i->iov_offset;
2004f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		left = __copy_from_user_inatomic(kaddr + offset, buf, bytes);
2014f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copied = bytes - left;
2024f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	} else {
2034f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		copied = __iovec_copy_from_user_inatomic(kaddr + offset,
2044f18cd317a118c28482f97303600a2fe2ada6c79Al Viro						i->iov, i->iov_offset, bytes);
2054f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	}
2064f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	kunmap_atomic(kaddr);
2074f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
2084f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	return copied;
2094f18cd317a118c28482f97303600a2fe2ada6c79Al Viro}
2104f18cd317a118c28482f97303600a2fe2ada6c79Al ViroEXPORT_SYMBOL(iov_iter_copy_from_user_atomic);
2114f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
2124f18cd317a118c28482f97303600a2fe2ada6c79Al Virovoid iov_iter_advance(struct iov_iter *i, size_t bytes)
2134f18cd317a118c28482f97303600a2fe2ada6c79Al Viro{
2144f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	BUG_ON(i->count < bytes);
2154f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
2164f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	if (likely(i->nr_segs == 1)) {
2174f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		i->iov_offset += bytes;
2184f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		i->count -= bytes;
2194f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	} else {
2204f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		const struct iovec *iov = i->iov;
2214f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		size_t base = i->iov_offset;
2224f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		unsigned long nr_segs = i->nr_segs;
2234f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
2244f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		/*
2254f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		 * The !iov->iov_len check ensures we skip over unlikely
2264f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		 * zero-length segments (without overruning the iovec).
2274f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		 */
2284f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		while (bytes || unlikely(i->count && !iov->iov_len)) {
2294f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			int copy;
2304f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
2314f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			copy = min(bytes, iov->iov_len - base);
2324f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			BUG_ON(!i->count || i->count < copy);
2334f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			i->count -= copy;
2344f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			bytes -= copy;
2354f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			base += copy;
2364f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			if (iov->iov_len == base) {
2374f18cd317a118c28482f97303600a2fe2ada6c79Al Viro				iov++;
2384f18cd317a118c28482f97303600a2fe2ada6c79Al Viro				nr_segs--;
2394f18cd317a118c28482f97303600a2fe2ada6c79Al Viro				base = 0;
2404f18cd317a118c28482f97303600a2fe2ada6c79Al Viro			}
2414f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		}
2424f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		i->iov = iov;
2434f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		i->iov_offset = base;
2444f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		i->nr_segs = nr_segs;
2454f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	}
2464f18cd317a118c28482f97303600a2fe2ada6c79Al Viro}
2474f18cd317a118c28482f97303600a2fe2ada6c79Al ViroEXPORT_SYMBOL(iov_iter_advance);
2484f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
2494f18cd317a118c28482f97303600a2fe2ada6c79Al Viro/*
2504f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * Fault in the first iovec of the given iov_iter, to a maximum length
2514f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * of bytes. Returns 0 on success, or non-zero if the memory could not be
2524f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * accessed (ie. because it is an invalid address).
2534f18cd317a118c28482f97303600a2fe2ada6c79Al Viro *
2544f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * writev-intensive code may want this to prefault several iovecs -- that
2554f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * would be possible (callers must not rely on the fact that _only_ the
2564f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * first iovec will be faulted with the current implementation).
2574f18cd317a118c28482f97303600a2fe2ada6c79Al Viro */
2584f18cd317a118c28482f97303600a2fe2ada6c79Al Viroint iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes)
2594f18cd317a118c28482f97303600a2fe2ada6c79Al Viro{
2604f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	char __user *buf = i->iov->iov_base + i->iov_offset;
2614f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	bytes = min(bytes, i->iov->iov_len - i->iov_offset);
2624f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	return fault_in_pages_readable(buf, bytes);
2634f18cd317a118c28482f97303600a2fe2ada6c79Al Viro}
2644f18cd317a118c28482f97303600a2fe2ada6c79Al ViroEXPORT_SYMBOL(iov_iter_fault_in_readable);
2654f18cd317a118c28482f97303600a2fe2ada6c79Al Viro
2664f18cd317a118c28482f97303600a2fe2ada6c79Al Viro/*
2674f18cd317a118c28482f97303600a2fe2ada6c79Al Viro * Return the count of just the current iov_iter segment.
2684f18cd317a118c28482f97303600a2fe2ada6c79Al Viro */
2694f18cd317a118c28482f97303600a2fe2ada6c79Al Virosize_t iov_iter_single_seg_count(const struct iov_iter *i)
2704f18cd317a118c28482f97303600a2fe2ada6c79Al Viro{
2714f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	const struct iovec *iov = i->iov;
2724f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	if (i->nr_segs == 1)
2734f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		return i->count;
2744f18cd317a118c28482f97303600a2fe2ada6c79Al Viro	else
2754f18cd317a118c28482f97303600a2fe2ada6c79Al Viro		return min(i->count, iov->iov_len - i->iov_offset);
2764f18cd317a118c28482f97303600a2fe2ada6c79Al Viro}
2774f18cd317a118c28482f97303600a2fe2ada6c79Al ViroEXPORT_SYMBOL(iov_iter_single_seg_count);
278886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro
279886a39115005ced8b15ab067c9c2a8d546b40a5eAl Virounsigned long iov_iter_alignment(const struct iov_iter *i)
280886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro{
281886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	const struct iovec *iov = i->iov;
282886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	unsigned long res;
283886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	size_t size = i->count;
284886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	size_t n;
285886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro
286886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	if (!size)
287886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro		return 0;
288886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro
289886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	res = (unsigned long)iov->iov_base + i->iov_offset;
290886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	n = iov->iov_len - i->iov_offset;
291886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	if (n >= size)
292886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro		return res | size;
293886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	size -= n;
294886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	res |= n;
295886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	while (size > (++iov)->iov_len) {
296886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro		res |= (unsigned long)iov->iov_base | iov->iov_len;
297886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro		size -= iov->iov_len;
298886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	}
299886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	res |= (unsigned long)iov->iov_base | size;
300886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro	return res;
301886a39115005ced8b15ab067c9c2a8d546b40a5eAl Viro}
302886a39115005ced8b15ab067c9c2a8d546b40a5eAl ViroEXPORT_SYMBOL(iov_iter_alignment);
30371d8e532b1549a478e6a6a8a44f309d050294d00Al Viro
30471d8e532b1549a478e6a6a8a44f309d050294d00Al Virovoid iov_iter_init(struct iov_iter *i, int direction,
30571d8e532b1549a478e6a6a8a44f309d050294d00Al Viro			const struct iovec *iov, unsigned long nr_segs,
30671d8e532b1549a478e6a6a8a44f309d050294d00Al Viro			size_t count)
30771d8e532b1549a478e6a6a8a44f309d050294d00Al Viro{
30871d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	/* It will get better.  Eventually... */
30971d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	if (segment_eq(get_fs(), KERNEL_DS))
31071d8e532b1549a478e6a6a8a44f309d050294d00Al Viro		direction |= REQ_KERNEL;
31171d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	i->type = direction;
31271d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	i->iov = iov;
31371d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	i->nr_segs = nr_segs;
31471d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	i->iov_offset = 0;
31571d8e532b1549a478e6a6a8a44f309d050294d00Al Viro	i->count = count;
31671d8e532b1549a478e6a6a8a44f309d050294d00Al Viro}
31771d8e532b1549a478e6a6a8a44f309d050294d00Al ViroEXPORT_SYMBOL(iov_iter_init);
3187b2c99d15559e285384c742db52316802e24b0bdAl Viro
3197b2c99d15559e285384c742db52316802e24b0bdAl Virossize_t iov_iter_get_pages(struct iov_iter *i,
3207b2c99d15559e285384c742db52316802e24b0bdAl Viro		   struct page **pages, size_t maxsize,
3217b2c99d15559e285384c742db52316802e24b0bdAl Viro		   size_t *start)
3227b2c99d15559e285384c742db52316802e24b0bdAl Viro{
3237b2c99d15559e285384c742db52316802e24b0bdAl Viro	size_t offset = i->iov_offset;
3247b2c99d15559e285384c742db52316802e24b0bdAl Viro	const struct iovec *iov = i->iov;
3257b2c99d15559e285384c742db52316802e24b0bdAl Viro	size_t len;
3267b2c99d15559e285384c742db52316802e24b0bdAl Viro	unsigned long addr;
3277b2c99d15559e285384c742db52316802e24b0bdAl Viro	int n;
3287b2c99d15559e285384c742db52316802e24b0bdAl Viro	int res;
3297b2c99d15559e285384c742db52316802e24b0bdAl Viro
3307b2c99d15559e285384c742db52316802e24b0bdAl Viro	len = iov->iov_len - offset;
3317b2c99d15559e285384c742db52316802e24b0bdAl Viro	if (len > i->count)
3327b2c99d15559e285384c742db52316802e24b0bdAl Viro		len = i->count;
3337b2c99d15559e285384c742db52316802e24b0bdAl Viro	if (len > maxsize)
3347b2c99d15559e285384c742db52316802e24b0bdAl Viro		len = maxsize;
3357b2c99d15559e285384c742db52316802e24b0bdAl Viro	addr = (unsigned long)iov->iov_base + offset;
3367b2c99d15559e285384c742db52316802e24b0bdAl Viro	len += *start = addr & (PAGE_SIZE - 1);
3377b2c99d15559e285384c742db52316802e24b0bdAl Viro	addr &= ~(PAGE_SIZE - 1);
3387b2c99d15559e285384c742db52316802e24b0bdAl Viro	n = (len + PAGE_SIZE - 1) / PAGE_SIZE;
3397b2c99d15559e285384c742db52316802e24b0bdAl Viro	res = get_user_pages_fast(addr, n, (i->type & WRITE) != WRITE, pages);
3407b2c99d15559e285384c742db52316802e24b0bdAl Viro	if (unlikely(res < 0))
3417b2c99d15559e285384c742db52316802e24b0bdAl Viro		return res;
3427b2c99d15559e285384c742db52316802e24b0bdAl Viro	return (res == n ? len : res * PAGE_SIZE) - *start;
3437b2c99d15559e285384c742db52316802e24b0bdAl Viro}
3447b2c99d15559e285384c742db52316802e24b0bdAl ViroEXPORT_SYMBOL(iov_iter_get_pages);
345f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro
34691f79c43d1b54d7154b118860d81b39bad07dfffAl Virossize_t iov_iter_get_pages_alloc(struct iov_iter *i,
34791f79c43d1b54d7154b118860d81b39bad07dfffAl Viro		   struct page ***pages, size_t maxsize,
34891f79c43d1b54d7154b118860d81b39bad07dfffAl Viro		   size_t *start)
34991f79c43d1b54d7154b118860d81b39bad07dfffAl Viro{
35091f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	size_t offset = i->iov_offset;
35191f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	const struct iovec *iov = i->iov;
35291f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	size_t len;
35391f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	unsigned long addr;
35491f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	void *p;
35591f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	int n;
35691f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	int res;
35791f79c43d1b54d7154b118860d81b39bad07dfffAl Viro
35891f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	len = iov->iov_len - offset;
35991f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	if (len > i->count)
36091f79c43d1b54d7154b118860d81b39bad07dfffAl Viro		len = i->count;
36191f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	if (len > maxsize)
36291f79c43d1b54d7154b118860d81b39bad07dfffAl Viro		len = maxsize;
36391f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	addr = (unsigned long)iov->iov_base + offset;
36491f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	len += *start = addr & (PAGE_SIZE - 1);
36591f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	addr &= ~(PAGE_SIZE - 1);
36691f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	n = (len + PAGE_SIZE - 1) / PAGE_SIZE;
36791f79c43d1b54d7154b118860d81b39bad07dfffAl Viro
36891f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	p = kmalloc(n * sizeof(struct page *), GFP_KERNEL);
36991f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	if (!p)
37091f79c43d1b54d7154b118860d81b39bad07dfffAl Viro		p = vmalloc(n * sizeof(struct page *));
37191f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	if (!p)
37291f79c43d1b54d7154b118860d81b39bad07dfffAl Viro		return -ENOMEM;
37391f79c43d1b54d7154b118860d81b39bad07dfffAl Viro
37491f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	res = get_user_pages_fast(addr, n, (i->type & WRITE) != WRITE, p);
37591f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	if (unlikely(res < 0)) {
37691f79c43d1b54d7154b118860d81b39bad07dfffAl Viro		kvfree(p);
37791f79c43d1b54d7154b118860d81b39bad07dfffAl Viro		return res;
37891f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	}
37991f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	*pages = p;
38091f79c43d1b54d7154b118860d81b39bad07dfffAl Viro	return (res == n ? len : res * PAGE_SIZE) - *start;
38191f79c43d1b54d7154b118860d81b39bad07dfffAl Viro}
38291f79c43d1b54d7154b118860d81b39bad07dfffAl ViroEXPORT_SYMBOL(iov_iter_get_pages_alloc);
38391f79c43d1b54d7154b118860d81b39bad07dfffAl Viro
384f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viroint iov_iter_npages(const struct iov_iter *i, int maxpages)
385f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro{
386f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	size_t offset = i->iov_offset;
387f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	size_t size = i->count;
388f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	const struct iovec *iov = i->iov;
389f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	int npages = 0;
390f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	int n;
391f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro
392f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	for (n = 0; size && n < i->nr_segs; n++, iov++) {
393f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		unsigned long addr = (unsigned long)iov->iov_base + offset;
394f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		size_t len = iov->iov_len - offset;
395f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		offset = 0;
396f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		if (unlikely(!len))	/* empty segment */
397f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro			continue;
398f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		if (len > size)
399f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro			len = size;
400f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		npages += (addr + len + PAGE_SIZE - 1) / PAGE_SIZE
401f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro			  - addr / PAGE_SIZE;
402f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		if (npages >= maxpages)	/* don't bother going further */
403f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro			return maxpages;
404f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		size -= len;
405f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro		offset = 0;
406f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	}
407f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro	return min(npages, maxpages);
408f67da30c1d5fc9e341bc8121708874bfd7b31e45Al Viro}
409f67da30c1d5fc9e341bc8121708874bfd7b31e45Al ViroEXPORT_SYMBOL(iov_iter_npages);
410