xref: /openbmc/linux/lib/iov_iter.c (revision 457c8996)
1457c8996SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2d879cb83SAl Viro #include <linux/export.h>
32f8b5444SChristoph Hellwig #include <linux/bvec.h>
4d879cb83SAl Viro #include <linux/uio.h>
5d879cb83SAl Viro #include <linux/pagemap.h>
6d879cb83SAl Viro #include <linux/slab.h>
7d879cb83SAl Viro #include <linux/vmalloc.h>
8241699cdSAl Viro #include <linux/splice.h>
9d879cb83SAl Viro #include <net/checksum.h>
10d05f4435SSagi Grimberg #include <linux/scatterlist.h>
11d879cb83SAl Viro 
12241699cdSAl Viro #define PIPE_PARANOIA /* for now */
13241699cdSAl Viro 
14d879cb83SAl Viro #define iterate_iovec(i, n, __v, __p, skip, STEP) {	\
15d879cb83SAl Viro 	size_t left;					\
16d879cb83SAl Viro 	size_t wanted = n;				\
17d879cb83SAl Viro 	__p = i->iov;					\
18d879cb83SAl Viro 	__v.iov_len = min(n, __p->iov_len - skip);	\
19d879cb83SAl Viro 	if (likely(__v.iov_len)) {			\
20d879cb83SAl Viro 		__v.iov_base = __p->iov_base + skip;	\
21d879cb83SAl Viro 		left = (STEP);				\
22d879cb83SAl Viro 		__v.iov_len -= left;			\
23d879cb83SAl Viro 		skip += __v.iov_len;			\
24d879cb83SAl Viro 		n -= __v.iov_len;			\
25d879cb83SAl Viro 	} else {					\
26d879cb83SAl Viro 		left = 0;				\
27d879cb83SAl Viro 	}						\
28d879cb83SAl Viro 	while (unlikely(!left && n)) {			\
29d879cb83SAl Viro 		__p++;					\
30d879cb83SAl Viro 		__v.iov_len = min(n, __p->iov_len);	\
31d879cb83SAl Viro 		if (unlikely(!__v.iov_len))		\
32d879cb83SAl Viro 			continue;			\
33d879cb83SAl Viro 		__v.iov_base = __p->iov_base;		\
34d879cb83SAl Viro 		left = (STEP);				\
35d879cb83SAl Viro 		__v.iov_len -= left;			\
36d879cb83SAl Viro 		skip = __v.iov_len;			\
37d879cb83SAl Viro 		n -= __v.iov_len;			\
38d879cb83SAl Viro 	}						\
39d879cb83SAl Viro 	n = wanted - n;					\
40d879cb83SAl Viro }
41d879cb83SAl Viro 
42d879cb83SAl Viro #define iterate_kvec(i, n, __v, __p, skip, STEP) {	\
43d879cb83SAl Viro 	size_t wanted = n;				\
44d879cb83SAl Viro 	__p = i->kvec;					\
45d879cb83SAl Viro 	__v.iov_len = min(n, __p->iov_len - skip);	\
46d879cb83SAl Viro 	if (likely(__v.iov_len)) {			\
47d879cb83SAl Viro 		__v.iov_base = __p->iov_base + skip;	\
48d879cb83SAl Viro 		(void)(STEP);				\
49d879cb83SAl Viro 		skip += __v.iov_len;			\
50d879cb83SAl Viro 		n -= __v.iov_len;			\
51d879cb83SAl Viro 	}						\
52d879cb83SAl Viro 	while (unlikely(n)) {				\
53d879cb83SAl Viro 		__p++;					\
54d879cb83SAl Viro 		__v.iov_len = min(n, __p->iov_len);	\
55d879cb83SAl Viro 		if (unlikely(!__v.iov_len))		\
56d879cb83SAl Viro 			continue;			\
57d879cb83SAl Viro 		__v.iov_base = __p->iov_base;		\
58d879cb83SAl Viro 		(void)(STEP);				\
59d879cb83SAl Viro 		skip = __v.iov_len;			\
60d879cb83SAl Viro 		n -= __v.iov_len;			\
61d879cb83SAl Viro 	}						\
62d879cb83SAl Viro 	n = wanted;					\
63d879cb83SAl Viro }
64d879cb83SAl Viro 
651bdc76aeSMing Lei #define iterate_bvec(i, n, __v, __bi, skip, STEP) {	\
661bdc76aeSMing Lei 	struct bvec_iter __start;			\
671bdc76aeSMing Lei 	__start.bi_size = n;				\
681bdc76aeSMing Lei 	__start.bi_bvec_done = skip;			\
691bdc76aeSMing Lei 	__start.bi_idx = 0;				\
701bdc76aeSMing Lei 	for_each_bvec(__v, i->bvec, __bi, __start) {	\
711bdc76aeSMing Lei 		if (!__v.bv_len)			\
72d879cb83SAl Viro 			continue;			\
73d879cb83SAl Viro 		(void)(STEP);				\
74d879cb83SAl Viro 	}						\
75d879cb83SAl Viro }
76d879cb83SAl Viro 
77d879cb83SAl Viro #define iterate_all_kinds(i, n, v, I, B, K) {			\
7833844e66SAl Viro 	if (likely(n)) {					\
79d879cb83SAl Viro 		size_t skip = i->iov_offset;			\
80d879cb83SAl Viro 		if (unlikely(i->type & ITER_BVEC)) {		\
81d879cb83SAl Viro 			struct bio_vec v;			\
821bdc76aeSMing Lei 			struct bvec_iter __bi;			\
831bdc76aeSMing Lei 			iterate_bvec(i, n, v, __bi, skip, (B))	\
84d879cb83SAl Viro 		} else if (unlikely(i->type & ITER_KVEC)) {	\
85d879cb83SAl Viro 			const struct kvec *kvec;		\
86d879cb83SAl Viro 			struct kvec v;				\
87d879cb83SAl Viro 			iterate_kvec(i, n, v, kvec, skip, (K))	\
889ea9ce04SDavid Howells 		} else if (unlikely(i->type & ITER_DISCARD)) {	\
89d879cb83SAl Viro 		} else {					\
90d879cb83SAl Viro 			const struct iovec *iov;		\
91d879cb83SAl Viro 			struct iovec v;				\
92d879cb83SAl Viro 			iterate_iovec(i, n, v, iov, skip, (I))	\
93d879cb83SAl Viro 		}						\
9433844e66SAl Viro 	}							\
95d879cb83SAl Viro }
96d879cb83SAl Viro 
97d879cb83SAl Viro #define iterate_and_advance(i, n, v, I, B, K) {			\
98dd254f5aSAl Viro 	if (unlikely(i->count < n))				\
99dd254f5aSAl Viro 		n = i->count;					\
10019f18459SAl Viro 	if (i->count) {						\
101d879cb83SAl Viro 		size_t skip = i->iov_offset;			\
102d879cb83SAl Viro 		if (unlikely(i->type & ITER_BVEC)) {		\
1031bdc76aeSMing Lei 			const struct bio_vec *bvec = i->bvec;	\
104d879cb83SAl Viro 			struct bio_vec v;			\
1051bdc76aeSMing Lei 			struct bvec_iter __bi;			\
1061bdc76aeSMing Lei 			iterate_bvec(i, n, v, __bi, skip, (B))	\
1071bdc76aeSMing Lei 			i->bvec = __bvec_iter_bvec(i->bvec, __bi);	\
1081bdc76aeSMing Lei 			i->nr_segs -= i->bvec - bvec;		\
1091bdc76aeSMing Lei 			skip = __bi.bi_bvec_done;		\
110d879cb83SAl Viro 		} else if (unlikely(i->type & ITER_KVEC)) {	\
111d879cb83SAl Viro 			const struct kvec *kvec;		\
112d879cb83SAl Viro 			struct kvec v;				\
113d879cb83SAl Viro 			iterate_kvec(i, n, v, kvec, skip, (K))	\
114d879cb83SAl Viro 			if (skip == kvec->iov_len) {		\
115d879cb83SAl Viro 				kvec++;				\
116d879cb83SAl Viro 				skip = 0;			\
117d879cb83SAl Viro 			}					\
118d879cb83SAl Viro 			i->nr_segs -= kvec - i->kvec;		\
119d879cb83SAl Viro 			i->kvec = kvec;				\
1209ea9ce04SDavid Howells 		} else if (unlikely(i->type & ITER_DISCARD)) {	\
1219ea9ce04SDavid Howells 			skip += n;				\
122d879cb83SAl Viro 		} else {					\
123d879cb83SAl Viro 			const struct iovec *iov;		\
124d879cb83SAl Viro 			struct iovec v;				\
125d879cb83SAl Viro 			iterate_iovec(i, n, v, iov, skip, (I))	\
126d879cb83SAl Viro 			if (skip == iov->iov_len) {		\
127d879cb83SAl Viro 				iov++;				\
128d879cb83SAl Viro 				skip = 0;			\
129d879cb83SAl Viro 			}					\
130d879cb83SAl Viro 			i->nr_segs -= iov - i->iov;		\
131d879cb83SAl Viro 			i->iov = iov;				\
132d879cb83SAl Viro 		}						\
133d879cb83SAl Viro 		i->count -= n;					\
134d879cb83SAl Viro 		i->iov_offset = skip;				\
135dd254f5aSAl Viro 	}							\
136d879cb83SAl Viro }
137d879cb83SAl Viro 
13809fc68dcSAl Viro static int copyout(void __user *to, const void *from, size_t n)
13909fc68dcSAl Viro {
14096d4f267SLinus Torvalds 	if (access_ok(to, n)) {
14109fc68dcSAl Viro 		kasan_check_read(from, n);
14209fc68dcSAl Viro 		n = raw_copy_to_user(to, from, n);
14309fc68dcSAl Viro 	}
14409fc68dcSAl Viro 	return n;
14509fc68dcSAl Viro }
14609fc68dcSAl Viro 
14709fc68dcSAl Viro static int copyin(void *to, const void __user *from, size_t n)
14809fc68dcSAl Viro {
14996d4f267SLinus Torvalds 	if (access_ok(from, n)) {
15009fc68dcSAl Viro 		kasan_check_write(to, n);
15109fc68dcSAl Viro 		n = raw_copy_from_user(to, from, n);
15209fc68dcSAl Viro 	}
15309fc68dcSAl Viro 	return n;
15409fc68dcSAl Viro }
15509fc68dcSAl Viro 
156d879cb83SAl Viro static size_t copy_page_to_iter_iovec(struct page *page, size_t offset, size_t bytes,
157d879cb83SAl Viro 			 struct iov_iter *i)
158d879cb83SAl Viro {
159d879cb83SAl Viro 	size_t skip, copy, left, wanted;
160d879cb83SAl Viro 	const struct iovec *iov;
161d879cb83SAl Viro 	char __user *buf;
162d879cb83SAl Viro 	void *kaddr, *from;
163d879cb83SAl Viro 
164d879cb83SAl Viro 	if (unlikely(bytes > i->count))
165d879cb83SAl Viro 		bytes = i->count;
166d879cb83SAl Viro 
167d879cb83SAl Viro 	if (unlikely(!bytes))
168d879cb83SAl Viro 		return 0;
169d879cb83SAl Viro 
17009fc68dcSAl Viro 	might_fault();
171d879cb83SAl Viro 	wanted = bytes;
172d879cb83SAl Viro 	iov = i->iov;
173d879cb83SAl Viro 	skip = i->iov_offset;
174d879cb83SAl Viro 	buf = iov->iov_base + skip;
175d879cb83SAl Viro 	copy = min(bytes, iov->iov_len - skip);
176d879cb83SAl Viro 
1773fa6c507SMikulas Patocka 	if (IS_ENABLED(CONFIG_HIGHMEM) && !fault_in_pages_writeable(buf, copy)) {
178d879cb83SAl Viro 		kaddr = kmap_atomic(page);
179d879cb83SAl Viro 		from = kaddr + offset;
180d879cb83SAl Viro 
181d879cb83SAl Viro 		/* first chunk, usually the only one */
18209fc68dcSAl Viro 		left = copyout(buf, from, copy);
183d879cb83SAl Viro 		copy -= left;
184d879cb83SAl Viro 		skip += copy;
185d879cb83SAl Viro 		from += copy;
186d879cb83SAl Viro 		bytes -= copy;
187d879cb83SAl Viro 
188d879cb83SAl Viro 		while (unlikely(!left && bytes)) {
189d879cb83SAl Viro 			iov++;
190d879cb83SAl Viro 			buf = iov->iov_base;
191d879cb83SAl Viro 			copy = min(bytes, iov->iov_len);
19209fc68dcSAl Viro 			left = copyout(buf, from, copy);
193d879cb83SAl Viro 			copy -= left;
194d879cb83SAl Viro 			skip = copy;
195d879cb83SAl Viro 			from += copy;
196d879cb83SAl Viro 			bytes -= copy;
197d879cb83SAl Viro 		}
198d879cb83SAl Viro 		if (likely(!bytes)) {
199d879cb83SAl Viro 			kunmap_atomic(kaddr);
200d879cb83SAl Viro 			goto done;
201d879cb83SAl Viro 		}
202d879cb83SAl Viro 		offset = from - kaddr;
203d879cb83SAl Viro 		buf += copy;
204d879cb83SAl Viro 		kunmap_atomic(kaddr);
205d879cb83SAl Viro 		copy = min(bytes, iov->iov_len - skip);
206d879cb83SAl Viro 	}
207d879cb83SAl Viro 	/* Too bad - revert to non-atomic kmap */
2083fa6c507SMikulas Patocka 
209d879cb83SAl Viro 	kaddr = kmap(page);
210d879cb83SAl Viro 	from = kaddr + offset;
21109fc68dcSAl Viro 	left = copyout(buf, from, copy);
212d879cb83SAl Viro 	copy -= left;
213d879cb83SAl Viro 	skip += copy;
214d879cb83SAl Viro 	from += copy;
215d879cb83SAl Viro 	bytes -= copy;
216d879cb83SAl Viro 	while (unlikely(!left && bytes)) {
217d879cb83SAl Viro 		iov++;
218d879cb83SAl Viro 		buf = iov->iov_base;
219d879cb83SAl Viro 		copy = min(bytes, iov->iov_len);
22009fc68dcSAl Viro 		left = copyout(buf, from, copy);
221d879cb83SAl Viro 		copy -= left;
222d879cb83SAl Viro 		skip = copy;
223d879cb83SAl Viro 		from += copy;
224d879cb83SAl Viro 		bytes -= copy;
225d879cb83SAl Viro 	}
226d879cb83SAl Viro 	kunmap(page);
2273fa6c507SMikulas Patocka 
228d879cb83SAl Viro done:
229d879cb83SAl Viro 	if (skip == iov->iov_len) {
230d879cb83SAl Viro 		iov++;
231d879cb83SAl Viro 		skip = 0;
232d879cb83SAl Viro 	}
233d879cb83SAl Viro 	i->count -= wanted - bytes;
234d879cb83SAl Viro 	i->nr_segs -= iov - i->iov;
235d879cb83SAl Viro 	i->iov = iov;
236d879cb83SAl Viro 	i->iov_offset = skip;
237d879cb83SAl Viro 	return wanted - bytes;
238d879cb83SAl Viro }
239d879cb83SAl Viro 
240d879cb83SAl Viro static size_t copy_page_from_iter_iovec(struct page *page, size_t offset, size_t bytes,
241d879cb83SAl Viro 			 struct iov_iter *i)
242d879cb83SAl Viro {
243d879cb83SAl Viro 	size_t skip, copy, left, wanted;
244d879cb83SAl Viro 	const struct iovec *iov;
245d879cb83SAl Viro 	char __user *buf;
246d879cb83SAl Viro 	void *kaddr, *to;
247d879cb83SAl Viro 
248d879cb83SAl Viro 	if (unlikely(bytes > i->count))
249d879cb83SAl Viro 		bytes = i->count;
250d879cb83SAl Viro 
251d879cb83SAl Viro 	if (unlikely(!bytes))
252d879cb83SAl Viro 		return 0;
253d879cb83SAl Viro 
25409fc68dcSAl Viro 	might_fault();
255d879cb83SAl Viro 	wanted = bytes;
256d879cb83SAl Viro 	iov = i->iov;
257d879cb83SAl Viro 	skip = i->iov_offset;
258d879cb83SAl Viro 	buf = iov->iov_base + skip;
259d879cb83SAl Viro 	copy = min(bytes, iov->iov_len - skip);
260d879cb83SAl Viro 
2613fa6c507SMikulas Patocka 	if (IS_ENABLED(CONFIG_HIGHMEM) && !fault_in_pages_readable(buf, copy)) {
262d879cb83SAl Viro 		kaddr = kmap_atomic(page);
263d879cb83SAl Viro 		to = kaddr + offset;
264d879cb83SAl Viro 
265d879cb83SAl Viro 		/* first chunk, usually the only one */
26609fc68dcSAl Viro 		left = copyin(to, buf, copy);
267d879cb83SAl Viro 		copy -= left;
268d879cb83SAl Viro 		skip += copy;
269d879cb83SAl Viro 		to += copy;
270d879cb83SAl Viro 		bytes -= copy;
271d879cb83SAl Viro 
272d879cb83SAl Viro 		while (unlikely(!left && bytes)) {
273d879cb83SAl Viro 			iov++;
274d879cb83SAl Viro 			buf = iov->iov_base;
275d879cb83SAl Viro 			copy = min(bytes, iov->iov_len);
27609fc68dcSAl Viro 			left = copyin(to, buf, copy);
277d879cb83SAl Viro 			copy -= left;
278d879cb83SAl Viro 			skip = copy;
279d879cb83SAl Viro 			to += copy;
280d879cb83SAl Viro 			bytes -= copy;
281d879cb83SAl Viro 		}
282d879cb83SAl Viro 		if (likely(!bytes)) {
283d879cb83SAl Viro 			kunmap_atomic(kaddr);
284d879cb83SAl Viro 			goto done;
285d879cb83SAl Viro 		}
286d879cb83SAl Viro 		offset = to - kaddr;
287d879cb83SAl Viro 		buf += copy;
288d879cb83SAl Viro 		kunmap_atomic(kaddr);
289d879cb83SAl Viro 		copy = min(bytes, iov->iov_len - skip);
290d879cb83SAl Viro 	}
291d879cb83SAl Viro 	/* Too bad - revert to non-atomic kmap */
2923fa6c507SMikulas Patocka 
293d879cb83SAl Viro 	kaddr = kmap(page);
294d879cb83SAl Viro 	to = kaddr + offset;
29509fc68dcSAl Viro 	left = copyin(to, buf, copy);
296d879cb83SAl Viro 	copy -= left;
297d879cb83SAl Viro 	skip += copy;
298d879cb83SAl Viro 	to += copy;
299d879cb83SAl Viro 	bytes -= copy;
300d879cb83SAl Viro 	while (unlikely(!left && bytes)) {
301d879cb83SAl Viro 		iov++;
302d879cb83SAl Viro 		buf = iov->iov_base;
303d879cb83SAl Viro 		copy = min(bytes, iov->iov_len);
30409fc68dcSAl Viro 		left = copyin(to, buf, copy);
305d879cb83SAl Viro 		copy -= left;
306d879cb83SAl Viro 		skip = copy;
307d879cb83SAl Viro 		to += copy;
308d879cb83SAl Viro 		bytes -= copy;
309d879cb83SAl Viro 	}
310d879cb83SAl Viro 	kunmap(page);
3113fa6c507SMikulas Patocka 
312d879cb83SAl Viro done:
313d879cb83SAl Viro 	if (skip == iov->iov_len) {
314d879cb83SAl Viro 		iov++;
315d879cb83SAl Viro 		skip = 0;
316d879cb83SAl Viro 	}
317d879cb83SAl Viro 	i->count -= wanted - bytes;
318d879cb83SAl Viro 	i->nr_segs -= iov - i->iov;
319d879cb83SAl Viro 	i->iov = iov;
320d879cb83SAl Viro 	i->iov_offset = skip;
321d879cb83SAl Viro 	return wanted - bytes;
322d879cb83SAl Viro }
323d879cb83SAl Viro 
324241699cdSAl Viro #ifdef PIPE_PARANOIA
325241699cdSAl Viro static bool sanity(const struct iov_iter *i)
326241699cdSAl Viro {
327241699cdSAl Viro 	struct pipe_inode_info *pipe = i->pipe;
328241699cdSAl Viro 	int idx = i->idx;
329241699cdSAl Viro 	int next = pipe->curbuf + pipe->nrbufs;
330241699cdSAl Viro 	if (i->iov_offset) {
331241699cdSAl Viro 		struct pipe_buffer *p;
332241699cdSAl Viro 		if (unlikely(!pipe->nrbufs))
333241699cdSAl Viro 			goto Bad;	// pipe must be non-empty
334241699cdSAl Viro 		if (unlikely(idx != ((next - 1) & (pipe->buffers - 1))))
335241699cdSAl Viro 			goto Bad;	// must be at the last buffer...
336241699cdSAl Viro 
337241699cdSAl Viro 		p = &pipe->bufs[idx];
338241699cdSAl Viro 		if (unlikely(p->offset + p->len != i->iov_offset))
339241699cdSAl Viro 			goto Bad;	// ... at the end of segment
340241699cdSAl Viro 	} else {
341241699cdSAl Viro 		if (idx != (next & (pipe->buffers - 1)))
342241699cdSAl Viro 			goto Bad;	// must be right after the last buffer
343241699cdSAl Viro 	}
344241699cdSAl Viro 	return true;
345241699cdSAl Viro Bad:
346241699cdSAl Viro 	printk(KERN_ERR "idx = %d, offset = %zd\n", i->idx, i->iov_offset);
347241699cdSAl Viro 	printk(KERN_ERR "curbuf = %d, nrbufs = %d, buffers = %d\n",
348241699cdSAl Viro 			pipe->curbuf, pipe->nrbufs, pipe->buffers);
349241699cdSAl Viro 	for (idx = 0; idx < pipe->buffers; idx++)
350241699cdSAl Viro 		printk(KERN_ERR "[%p %p %d %d]\n",
351241699cdSAl Viro 			pipe->bufs[idx].ops,
352241699cdSAl Viro 			pipe->bufs[idx].page,
353241699cdSAl Viro 			pipe->bufs[idx].offset,
354241699cdSAl Viro 			pipe->bufs[idx].len);
355241699cdSAl Viro 	WARN_ON(1);
356241699cdSAl Viro 	return false;
357241699cdSAl Viro }
358241699cdSAl Viro #else
359241699cdSAl Viro #define sanity(i) true
360241699cdSAl Viro #endif
361241699cdSAl Viro 
362241699cdSAl Viro static inline int next_idx(int idx, struct pipe_inode_info *pipe)
363241699cdSAl Viro {
364241699cdSAl Viro 	return (idx + 1) & (pipe->buffers - 1);
365241699cdSAl Viro }
366241699cdSAl Viro 
367241699cdSAl Viro static size_t copy_page_to_iter_pipe(struct page *page, size_t offset, size_t bytes,
368241699cdSAl Viro 			 struct iov_iter *i)
369241699cdSAl Viro {
370241699cdSAl Viro 	struct pipe_inode_info *pipe = i->pipe;
371241699cdSAl Viro 	struct pipe_buffer *buf;
372241699cdSAl Viro 	size_t off;
373241699cdSAl Viro 	int idx;
374241699cdSAl Viro 
375241699cdSAl Viro 	if (unlikely(bytes > i->count))
376241699cdSAl Viro 		bytes = i->count;
377241699cdSAl Viro 
378241699cdSAl Viro 	if (unlikely(!bytes))
379241699cdSAl Viro 		return 0;
380241699cdSAl Viro 
381241699cdSAl Viro 	if (!sanity(i))
382241699cdSAl Viro 		return 0;
383241699cdSAl Viro 
384241699cdSAl Viro 	off = i->iov_offset;
385241699cdSAl Viro 	idx = i->idx;
386241699cdSAl Viro 	buf = &pipe->bufs[idx];
387241699cdSAl Viro 	if (off) {
388241699cdSAl Viro 		if (offset == off && buf->page == page) {
389241699cdSAl Viro 			/* merge with the last one */
390241699cdSAl Viro 			buf->len += bytes;
391241699cdSAl Viro 			i->iov_offset += bytes;
392241699cdSAl Viro 			goto out;
393241699cdSAl Viro 		}
394241699cdSAl Viro 		idx = next_idx(idx, pipe);
395241699cdSAl Viro 		buf = &pipe->bufs[idx];
396241699cdSAl Viro 	}
397241699cdSAl Viro 	if (idx == pipe->curbuf && pipe->nrbufs)
398241699cdSAl Viro 		return 0;
399241699cdSAl Viro 	pipe->nrbufs++;
400241699cdSAl Viro 	buf->ops = &page_cache_pipe_buf_ops;
401241699cdSAl Viro 	get_page(buf->page = page);
402241699cdSAl Viro 	buf->offset = offset;
403241699cdSAl Viro 	buf->len = bytes;
404241699cdSAl Viro 	i->iov_offset = offset + bytes;
405241699cdSAl Viro 	i->idx = idx;
406241699cdSAl Viro out:
407241699cdSAl Viro 	i->count -= bytes;
408241699cdSAl Viro 	return bytes;
409241699cdSAl Viro }
410241699cdSAl Viro 
411d879cb83SAl Viro /*
412171a0203SAnton Altaparmakov  * Fault in one or more iovecs of the given iov_iter, to a maximum length of
413171a0203SAnton Altaparmakov  * bytes.  For each iovec, fault in each page that constitutes the iovec.
414171a0203SAnton Altaparmakov  *
415171a0203SAnton Altaparmakov  * Return 0 on success, or non-zero if the memory could not be accessed (i.e.
416171a0203SAnton Altaparmakov  * because it is an invalid address).
417171a0203SAnton Altaparmakov  */
418d4690f1eSAl Viro int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes)
419171a0203SAnton Altaparmakov {
420171a0203SAnton Altaparmakov 	size_t skip = i->iov_offset;
421171a0203SAnton Altaparmakov 	const struct iovec *iov;
422171a0203SAnton Altaparmakov 	int err;
423171a0203SAnton Altaparmakov 	struct iovec v;
424171a0203SAnton Altaparmakov 
425171a0203SAnton Altaparmakov 	if (!(i->type & (ITER_BVEC|ITER_KVEC))) {
426171a0203SAnton Altaparmakov 		iterate_iovec(i, bytes, v, iov, skip, ({
4274bce9f6eSAl Viro 			err = fault_in_pages_readable(v.iov_base, v.iov_len);
428171a0203SAnton Altaparmakov 			if (unlikely(err))
429171a0203SAnton Altaparmakov 			return err;
430171a0203SAnton Altaparmakov 		0;}))
431171a0203SAnton Altaparmakov 	}
432171a0203SAnton Altaparmakov 	return 0;
433171a0203SAnton Altaparmakov }
434d4690f1eSAl Viro EXPORT_SYMBOL(iov_iter_fault_in_readable);
435171a0203SAnton Altaparmakov 
436aa563d7bSDavid Howells void iov_iter_init(struct iov_iter *i, unsigned int direction,
437d879cb83SAl Viro 			const struct iovec *iov, unsigned long nr_segs,
438d879cb83SAl Viro 			size_t count)
439d879cb83SAl Viro {
440aa563d7bSDavid Howells 	WARN_ON(direction & ~(READ | WRITE));
441aa563d7bSDavid Howells 	direction &= READ | WRITE;
442aa563d7bSDavid Howells 
443d879cb83SAl Viro 	/* It will get better.  Eventually... */
444db68ce10SAl Viro 	if (uaccess_kernel()) {
445aa563d7bSDavid Howells 		i->type = ITER_KVEC | direction;
446d879cb83SAl Viro 		i->kvec = (struct kvec *)iov;
447d879cb83SAl Viro 	} else {
448aa563d7bSDavid Howells 		i->type = ITER_IOVEC | direction;
449d879cb83SAl Viro 		i->iov = iov;
450d879cb83SAl Viro 	}
451d879cb83SAl Viro 	i->nr_segs = nr_segs;
452d879cb83SAl Viro 	i->iov_offset = 0;
453d879cb83SAl Viro 	i->count = count;
454d879cb83SAl Viro }
455d879cb83SAl Viro EXPORT_SYMBOL(iov_iter_init);
456d879cb83SAl Viro 
457d879cb83SAl Viro static void memcpy_from_page(char *to, struct page *page, size_t offset, size_t len)
458d879cb83SAl Viro {
459d879cb83SAl Viro 	char *from = kmap_atomic(page);
460d879cb83SAl Viro 	memcpy(to, from + offset, len);
461d879cb83SAl Viro 	kunmap_atomic(from);
462d879cb83SAl Viro }
463d879cb83SAl Viro 
46436f7a8a4SAl Viro static void memcpy_to_page(struct page *page, size_t offset, const char *from, size_t len)
465d879cb83SAl Viro {
466d879cb83SAl Viro 	char *to = kmap_atomic(page);
467d879cb83SAl Viro 	memcpy(to + offset, from, len);
468d879cb83SAl Viro 	kunmap_atomic(to);
469d879cb83SAl Viro }
470d879cb83SAl Viro 
471d879cb83SAl Viro static void memzero_page(struct page *page, size_t offset, size_t len)
472d879cb83SAl Viro {
473d879cb83SAl Viro 	char *addr = kmap_atomic(page);
474d879cb83SAl Viro 	memset(addr + offset, 0, len);
475d879cb83SAl Viro 	kunmap_atomic(addr);
476d879cb83SAl Viro }
477d879cb83SAl Viro 
478241699cdSAl Viro static inline bool allocated(struct pipe_buffer *buf)
479241699cdSAl Viro {
480241699cdSAl Viro 	return buf->ops == &default_pipe_buf_ops;
481241699cdSAl Viro }
482241699cdSAl Viro 
483241699cdSAl Viro static inline void data_start(const struct iov_iter *i, int *idxp, size_t *offp)
484241699cdSAl Viro {
485241699cdSAl Viro 	size_t off = i->iov_offset;
486241699cdSAl Viro 	int idx = i->idx;
487241699cdSAl Viro 	if (off && (!allocated(&i->pipe->bufs[idx]) || off == PAGE_SIZE)) {
488241699cdSAl Viro 		idx = next_idx(idx, i->pipe);
489241699cdSAl Viro 		off = 0;
490241699cdSAl Viro 	}
491241699cdSAl Viro 	*idxp = idx;
492241699cdSAl Viro 	*offp = off;
493241699cdSAl Viro }
494241699cdSAl Viro 
495241699cdSAl Viro static size_t push_pipe(struct iov_iter *i, size_t size,
496241699cdSAl Viro 			int *idxp, size_t *offp)
497241699cdSAl Viro {
498241699cdSAl Viro 	struct pipe_inode_info *pipe = i->pipe;
499241699cdSAl Viro 	size_t off;
500241699cdSAl Viro 	int idx;
501241699cdSAl Viro 	ssize_t left;
502241699cdSAl Viro 
503241699cdSAl Viro 	if (unlikely(size > i->count))
504241699cdSAl Viro 		size = i->count;
505241699cdSAl Viro 	if (unlikely(!size))
506241699cdSAl Viro 		return 0;
507241699cdSAl Viro 
508241699cdSAl Viro 	left = size;
509241699cdSAl Viro 	data_start(i, &idx, &off);
510241699cdSAl Viro 	*idxp = idx;
511241699cdSAl Viro 	*offp = off;
512241699cdSAl Viro 	if (off) {
513241699cdSAl Viro 		left -= PAGE_SIZE - off;
514241699cdSAl Viro 		if (left <= 0) {
515241699cdSAl Viro 			pipe->bufs[idx].len += size;
516241699cdSAl Viro 			return size;
517241699cdSAl Viro 		}
518241699cdSAl Viro 		pipe->bufs[idx].len = PAGE_SIZE;
519241699cdSAl Viro 		idx = next_idx(idx, pipe);
520241699cdSAl Viro 	}
521241699cdSAl Viro 	while (idx != pipe->curbuf || !pipe->nrbufs) {
522241699cdSAl Viro 		struct page *page = alloc_page(GFP_USER);
523241699cdSAl Viro 		if (!page)
524241699cdSAl Viro 			break;
525241699cdSAl Viro 		pipe->nrbufs++;
526241699cdSAl Viro 		pipe->bufs[idx].ops = &default_pipe_buf_ops;
527241699cdSAl Viro 		pipe->bufs[idx].page = page;
528241699cdSAl Viro 		pipe->bufs[idx].offset = 0;
529241699cdSAl Viro 		if (left <= PAGE_SIZE) {
530241699cdSAl Viro 			pipe->bufs[idx].len = left;
531241699cdSAl Viro 			return size;
532241699cdSAl Viro 		}
533241699cdSAl Viro 		pipe->bufs[idx].len = PAGE_SIZE;
534241699cdSAl Viro 		left -= PAGE_SIZE;
535241699cdSAl Viro 		idx = next_idx(idx, pipe);
536241699cdSAl Viro 	}
537241699cdSAl Viro 	return size - left;
538241699cdSAl Viro }
539241699cdSAl Viro 
540241699cdSAl Viro static size_t copy_pipe_to_iter(const void *addr, size_t bytes,
541241699cdSAl Viro 				struct iov_iter *i)
542241699cdSAl Viro {
543241699cdSAl Viro 	struct pipe_inode_info *pipe = i->pipe;
544241699cdSAl Viro 	size_t n, off;
545241699cdSAl Viro 	int idx;
546241699cdSAl Viro 
547241699cdSAl Viro 	if (!sanity(i))
548241699cdSAl Viro 		return 0;
549241699cdSAl Viro 
550241699cdSAl Viro 	bytes = n = push_pipe(i, bytes, &idx, &off);
551241699cdSAl Viro 	if (unlikely(!n))
552241699cdSAl Viro 		return 0;
553241699cdSAl Viro 	for ( ; n; idx = next_idx(idx, pipe), off = 0) {
554241699cdSAl Viro 		size_t chunk = min_t(size_t, n, PAGE_SIZE - off);
555241699cdSAl Viro 		memcpy_to_page(pipe->bufs[idx].page, off, addr, chunk);
556241699cdSAl Viro 		i->idx = idx;
557241699cdSAl Viro 		i->iov_offset = off + chunk;
558241699cdSAl Viro 		n -= chunk;
559241699cdSAl Viro 		addr += chunk;
560241699cdSAl Viro 	}
561241699cdSAl Viro 	i->count -= bytes;
562241699cdSAl Viro 	return bytes;
563241699cdSAl Viro }
564241699cdSAl Viro 
565f9152895SAl Viro static __wsum csum_and_memcpy(void *to, const void *from, size_t len,
566f9152895SAl Viro 			      __wsum sum, size_t off)
567f9152895SAl Viro {
568f9152895SAl Viro 	__wsum next = csum_partial_copy_nocheck(from, to, len, 0);
569f9152895SAl Viro 	return csum_block_add(sum, next, off);
570f9152895SAl Viro }
571f9152895SAl Viro 
57278e1f386SAl Viro static size_t csum_and_copy_to_pipe_iter(const void *addr, size_t bytes,
57378e1f386SAl Viro 				__wsum *csum, struct iov_iter *i)
57478e1f386SAl Viro {
57578e1f386SAl Viro 	struct pipe_inode_info *pipe = i->pipe;
57678e1f386SAl Viro 	size_t n, r;
57778e1f386SAl Viro 	size_t off = 0;
578f9152895SAl Viro 	__wsum sum = *csum;
57978e1f386SAl Viro 	int idx;
58078e1f386SAl Viro 
58178e1f386SAl Viro 	if (!sanity(i))
58278e1f386SAl Viro 		return 0;
58378e1f386SAl Viro 
58478e1f386SAl Viro 	bytes = n = push_pipe(i, bytes, &idx, &r);
58578e1f386SAl Viro 	if (unlikely(!n))
58678e1f386SAl Viro 		return 0;
58778e1f386SAl Viro 	for ( ; n; idx = next_idx(idx, pipe), r = 0) {
58878e1f386SAl Viro 		size_t chunk = min_t(size_t, n, PAGE_SIZE - r);
58978e1f386SAl Viro 		char *p = kmap_atomic(pipe->bufs[idx].page);
590f9152895SAl Viro 		sum = csum_and_memcpy(p + r, addr, chunk, sum, off);
59178e1f386SAl Viro 		kunmap_atomic(p);
59278e1f386SAl Viro 		i->idx = idx;
59378e1f386SAl Viro 		i->iov_offset = r + chunk;
59478e1f386SAl Viro 		n -= chunk;
59578e1f386SAl Viro 		off += chunk;
59678e1f386SAl Viro 		addr += chunk;
59778e1f386SAl Viro 	}
59878e1f386SAl Viro 	i->count -= bytes;
59978e1f386SAl Viro 	*csum = sum;
60078e1f386SAl Viro 	return bytes;
60178e1f386SAl Viro }
60278e1f386SAl Viro 
603aa28de27SAl Viro size_t _copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i)
604d879cb83SAl Viro {
60536f7a8a4SAl Viro 	const char *from = addr;
60600e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i)))
607241699cdSAl Viro 		return copy_pipe_to_iter(addr, bytes, i);
60809fc68dcSAl Viro 	if (iter_is_iovec(i))
60909fc68dcSAl Viro 		might_fault();
610d879cb83SAl Viro 	iterate_and_advance(i, bytes, v,
61109fc68dcSAl Viro 		copyout(v.iov_base, (from += v.iov_len) - v.iov_len, v.iov_len),
612d879cb83SAl Viro 		memcpy_to_page(v.bv_page, v.bv_offset,
613d879cb83SAl Viro 			       (from += v.bv_len) - v.bv_len, v.bv_len),
614d879cb83SAl Viro 		memcpy(v.iov_base, (from += v.iov_len) - v.iov_len, v.iov_len)
615d879cb83SAl Viro 	)
616d879cb83SAl Viro 
617d879cb83SAl Viro 	return bytes;
618d879cb83SAl Viro }
619aa28de27SAl Viro EXPORT_SYMBOL(_copy_to_iter);
620d879cb83SAl Viro 
6218780356eSDan Williams #ifdef CONFIG_ARCH_HAS_UACCESS_MCSAFE
6228780356eSDan Williams static int copyout_mcsafe(void __user *to, const void *from, size_t n)
6238780356eSDan Williams {
62496d4f267SLinus Torvalds 	if (access_ok(to, n)) {
6258780356eSDan Williams 		kasan_check_read(from, n);
6268780356eSDan Williams 		n = copy_to_user_mcsafe((__force void *) to, from, n);
6278780356eSDan Williams 	}
6288780356eSDan Williams 	return n;
6298780356eSDan Williams }
6308780356eSDan Williams 
6318780356eSDan Williams static unsigned long memcpy_mcsafe_to_page(struct page *page, size_t offset,
6328780356eSDan Williams 		const char *from, size_t len)
6338780356eSDan Williams {
6348780356eSDan Williams 	unsigned long ret;
6358780356eSDan Williams 	char *to;
6368780356eSDan Williams 
6378780356eSDan Williams 	to = kmap_atomic(page);
6388780356eSDan Williams 	ret = memcpy_mcsafe(to + offset, from, len);
6398780356eSDan Williams 	kunmap_atomic(to);
6408780356eSDan Williams 
6418780356eSDan Williams 	return ret;
6428780356eSDan Williams }
6438780356eSDan Williams 
644ca146f6fSDan Williams static size_t copy_pipe_to_iter_mcsafe(const void *addr, size_t bytes,
645ca146f6fSDan Williams 				struct iov_iter *i)
646ca146f6fSDan Williams {
647ca146f6fSDan Williams 	struct pipe_inode_info *pipe = i->pipe;
648ca146f6fSDan Williams 	size_t n, off, xfer = 0;
649ca146f6fSDan Williams 	int idx;
650ca146f6fSDan Williams 
651ca146f6fSDan Williams 	if (!sanity(i))
652ca146f6fSDan Williams 		return 0;
653ca146f6fSDan Williams 
654ca146f6fSDan Williams 	bytes = n = push_pipe(i, bytes, &idx, &off);
655ca146f6fSDan Williams 	if (unlikely(!n))
656ca146f6fSDan Williams 		return 0;
657ca146f6fSDan Williams 	for ( ; n; idx = next_idx(idx, pipe), off = 0) {
658ca146f6fSDan Williams 		size_t chunk = min_t(size_t, n, PAGE_SIZE - off);
659ca146f6fSDan Williams 		unsigned long rem;
660ca146f6fSDan Williams 
661ca146f6fSDan Williams 		rem = memcpy_mcsafe_to_page(pipe->bufs[idx].page, off, addr,
662ca146f6fSDan Williams 				chunk);
663ca146f6fSDan Williams 		i->idx = idx;
664ca146f6fSDan Williams 		i->iov_offset = off + chunk - rem;
665ca146f6fSDan Williams 		xfer += chunk - rem;
666ca146f6fSDan Williams 		if (rem)
667ca146f6fSDan Williams 			break;
668ca146f6fSDan Williams 		n -= chunk;
669ca146f6fSDan Williams 		addr += chunk;
670ca146f6fSDan Williams 	}
671ca146f6fSDan Williams 	i->count -= xfer;
672ca146f6fSDan Williams 	return xfer;
673ca146f6fSDan Williams }
674ca146f6fSDan Williams 
675bf3eeb9bSDan Williams /**
676bf3eeb9bSDan Williams  * _copy_to_iter_mcsafe - copy to user with source-read error exception handling
677bf3eeb9bSDan Williams  * @addr: source kernel address
678bf3eeb9bSDan Williams  * @bytes: total transfer length
679bf3eeb9bSDan Williams  * @iter: destination iterator
680bf3eeb9bSDan Williams  *
681bf3eeb9bSDan Williams  * The pmem driver arranges for filesystem-dax to use this facility via
682bf3eeb9bSDan Williams  * dax_copy_to_iter() for protecting read/write to persistent memory.
683bf3eeb9bSDan Williams  * Unless / until an architecture can guarantee identical performance
684bf3eeb9bSDan Williams  * between _copy_to_iter_mcsafe() and _copy_to_iter() it would be a
685bf3eeb9bSDan Williams  * performance regression to switch more users to the mcsafe version.
686bf3eeb9bSDan Williams  *
687bf3eeb9bSDan Williams  * Otherwise, the main differences between this and typical _copy_to_iter().
688bf3eeb9bSDan Williams  *
689bf3eeb9bSDan Williams  * * Typical tail/residue handling after a fault retries the copy
690bf3eeb9bSDan Williams  *   byte-by-byte until the fault happens again. Re-triggering machine
691bf3eeb9bSDan Williams  *   checks is potentially fatal so the implementation uses source
692bf3eeb9bSDan Williams  *   alignment and poison alignment assumptions to avoid re-triggering
693bf3eeb9bSDan Williams  *   hardware exceptions.
694bf3eeb9bSDan Williams  *
695bf3eeb9bSDan Williams  * * ITER_KVEC, ITER_PIPE, and ITER_BVEC can return short copies.
696bf3eeb9bSDan Williams  *   Compare to copy_to_iter() where only ITER_IOVEC attempts might return
697bf3eeb9bSDan Williams  *   a short copy.
698bf3eeb9bSDan Williams  *
699bf3eeb9bSDan Williams  * See MCSAFE_TEST for self-test.
700bf3eeb9bSDan Williams  */
7018780356eSDan Williams size_t _copy_to_iter_mcsafe(const void *addr, size_t bytes, struct iov_iter *i)
7028780356eSDan Williams {
7038780356eSDan Williams 	const char *from = addr;
7048780356eSDan Williams 	unsigned long rem, curr_addr, s_addr = (unsigned long) addr;
7058780356eSDan Williams 
70600e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i)))
707ca146f6fSDan Williams 		return copy_pipe_to_iter_mcsafe(addr, bytes, i);
7088780356eSDan Williams 	if (iter_is_iovec(i))
7098780356eSDan Williams 		might_fault();
7108780356eSDan Williams 	iterate_and_advance(i, bytes, v,
7118780356eSDan Williams 		copyout_mcsafe(v.iov_base, (from += v.iov_len) - v.iov_len, v.iov_len),
7128780356eSDan Williams 		({
7138780356eSDan Williams 		rem = memcpy_mcsafe_to_page(v.bv_page, v.bv_offset,
7148780356eSDan Williams                                (from += v.bv_len) - v.bv_len, v.bv_len);
7158780356eSDan Williams 		if (rem) {
7168780356eSDan Williams 			curr_addr = (unsigned long) from;
7178780356eSDan Williams 			bytes = curr_addr - s_addr - rem;
7188780356eSDan Williams 			return bytes;
7198780356eSDan Williams 		}
7208780356eSDan Williams 		}),
7218780356eSDan Williams 		({
7228780356eSDan Williams 		rem = memcpy_mcsafe(v.iov_base, (from += v.iov_len) - v.iov_len,
7238780356eSDan Williams 				v.iov_len);
7248780356eSDan Williams 		if (rem) {
7258780356eSDan Williams 			curr_addr = (unsigned long) from;
7268780356eSDan Williams 			bytes = curr_addr - s_addr - rem;
7278780356eSDan Williams 			return bytes;
7288780356eSDan Williams 		}
7298780356eSDan Williams 		})
7308780356eSDan Williams 	)
7318780356eSDan Williams 
7328780356eSDan Williams 	return bytes;
7338780356eSDan Williams }
7348780356eSDan Williams EXPORT_SYMBOL_GPL(_copy_to_iter_mcsafe);
7358780356eSDan Williams #endif /* CONFIG_ARCH_HAS_UACCESS_MCSAFE */
7368780356eSDan Williams 
737aa28de27SAl Viro size_t _copy_from_iter(void *addr, size_t bytes, struct iov_iter *i)
738d879cb83SAl Viro {
739d879cb83SAl Viro 	char *to = addr;
74000e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i))) {
741241699cdSAl Viro 		WARN_ON(1);
742241699cdSAl Viro 		return 0;
743241699cdSAl Viro 	}
74409fc68dcSAl Viro 	if (iter_is_iovec(i))
74509fc68dcSAl Viro 		might_fault();
746d879cb83SAl Viro 	iterate_and_advance(i, bytes, v,
74709fc68dcSAl Viro 		copyin((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len),
748d879cb83SAl Viro 		memcpy_from_page((to += v.bv_len) - v.bv_len, v.bv_page,
749d879cb83SAl Viro 				 v.bv_offset, v.bv_len),
750d879cb83SAl Viro 		memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len)
751d879cb83SAl Viro 	)
752d879cb83SAl Viro 
753d879cb83SAl Viro 	return bytes;
754d879cb83SAl Viro }
755aa28de27SAl Viro EXPORT_SYMBOL(_copy_from_iter);
756d879cb83SAl Viro 
757aa28de27SAl Viro bool _copy_from_iter_full(void *addr, size_t bytes, struct iov_iter *i)
758cbbd26b8SAl Viro {
759cbbd26b8SAl Viro 	char *to = addr;
76000e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i))) {
761cbbd26b8SAl Viro 		WARN_ON(1);
762cbbd26b8SAl Viro 		return false;
763cbbd26b8SAl Viro 	}
76433844e66SAl Viro 	if (unlikely(i->count < bytes))
765cbbd26b8SAl Viro 		return false;
766cbbd26b8SAl Viro 
76709fc68dcSAl Viro 	if (iter_is_iovec(i))
76809fc68dcSAl Viro 		might_fault();
769cbbd26b8SAl Viro 	iterate_all_kinds(i, bytes, v, ({
77009fc68dcSAl Viro 		if (copyin((to += v.iov_len) - v.iov_len,
771cbbd26b8SAl Viro 				      v.iov_base, v.iov_len))
772cbbd26b8SAl Viro 			return false;
773cbbd26b8SAl Viro 		0;}),
774cbbd26b8SAl Viro 		memcpy_from_page((to += v.bv_len) - v.bv_len, v.bv_page,
775cbbd26b8SAl Viro 				 v.bv_offset, v.bv_len),
776cbbd26b8SAl Viro 		memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len)
777cbbd26b8SAl Viro 	)
778cbbd26b8SAl Viro 
779cbbd26b8SAl Viro 	iov_iter_advance(i, bytes);
780cbbd26b8SAl Viro 	return true;
781cbbd26b8SAl Viro }
782aa28de27SAl Viro EXPORT_SYMBOL(_copy_from_iter_full);
783cbbd26b8SAl Viro 
784aa28de27SAl Viro size_t _copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i)
785d879cb83SAl Viro {
786d879cb83SAl Viro 	char *to = addr;
78700e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i))) {
788241699cdSAl Viro 		WARN_ON(1);
789241699cdSAl Viro 		return 0;
790241699cdSAl Viro 	}
791d879cb83SAl Viro 	iterate_and_advance(i, bytes, v,
7923f763453SAl Viro 		__copy_from_user_inatomic_nocache((to += v.iov_len) - v.iov_len,
793d879cb83SAl Viro 					 v.iov_base, v.iov_len),
794d879cb83SAl Viro 		memcpy_from_page((to += v.bv_len) - v.bv_len, v.bv_page,
795d879cb83SAl Viro 				 v.bv_offset, v.bv_len),
796d879cb83SAl Viro 		memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len)
797d879cb83SAl Viro 	)
798d879cb83SAl Viro 
799d879cb83SAl Viro 	return bytes;
800d879cb83SAl Viro }
801aa28de27SAl Viro EXPORT_SYMBOL(_copy_from_iter_nocache);
802d879cb83SAl Viro 
8030aed55afSDan Williams #ifdef CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE
804abd08d7dSDan Williams /**
805abd08d7dSDan Williams  * _copy_from_iter_flushcache - write destination through cpu cache
806abd08d7dSDan Williams  * @addr: destination kernel address
807abd08d7dSDan Williams  * @bytes: total transfer length
808abd08d7dSDan Williams  * @iter: source iterator
809abd08d7dSDan Williams  *
810abd08d7dSDan Williams  * The pmem driver arranges for filesystem-dax to use this facility via
811abd08d7dSDan Williams  * dax_copy_from_iter() for ensuring that writes to persistent memory
812abd08d7dSDan Williams  * are flushed through the CPU cache. It is differentiated from
813abd08d7dSDan Williams  * _copy_from_iter_nocache() in that guarantees all data is flushed for
814abd08d7dSDan Williams  * all iterator types. The _copy_from_iter_nocache() only attempts to
815abd08d7dSDan Williams  * bypass the cache for the ITER_IOVEC case, and on some archs may use
816abd08d7dSDan Williams  * instructions that strand dirty-data in the cache.
817abd08d7dSDan Williams  */
8186a37e940SLinus Torvalds size_t _copy_from_iter_flushcache(void *addr, size_t bytes, struct iov_iter *i)
8190aed55afSDan Williams {
8200aed55afSDan Williams 	char *to = addr;
82100e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i))) {
8220aed55afSDan Williams 		WARN_ON(1);
8230aed55afSDan Williams 		return 0;
8240aed55afSDan Williams 	}
8250aed55afSDan Williams 	iterate_and_advance(i, bytes, v,
8260aed55afSDan Williams 		__copy_from_user_flushcache((to += v.iov_len) - v.iov_len,
8270aed55afSDan Williams 					 v.iov_base, v.iov_len),
8280aed55afSDan Williams 		memcpy_page_flushcache((to += v.bv_len) - v.bv_len, v.bv_page,
8290aed55afSDan Williams 				 v.bv_offset, v.bv_len),
8300aed55afSDan Williams 		memcpy_flushcache((to += v.iov_len) - v.iov_len, v.iov_base,
8310aed55afSDan Williams 			v.iov_len)
8320aed55afSDan Williams 	)
8330aed55afSDan Williams 
8340aed55afSDan Williams 	return bytes;
8350aed55afSDan Williams }
8366a37e940SLinus Torvalds EXPORT_SYMBOL_GPL(_copy_from_iter_flushcache);
8370aed55afSDan Williams #endif
8380aed55afSDan Williams 
839aa28de27SAl Viro bool _copy_from_iter_full_nocache(void *addr, size_t bytes, struct iov_iter *i)
840cbbd26b8SAl Viro {
841cbbd26b8SAl Viro 	char *to = addr;
84200e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i))) {
843cbbd26b8SAl Viro 		WARN_ON(1);
844cbbd26b8SAl Viro 		return false;
845cbbd26b8SAl Viro 	}
84633844e66SAl Viro 	if (unlikely(i->count < bytes))
847cbbd26b8SAl Viro 		return false;
848cbbd26b8SAl Viro 	iterate_all_kinds(i, bytes, v, ({
8493f763453SAl Viro 		if (__copy_from_user_inatomic_nocache((to += v.iov_len) - v.iov_len,
850cbbd26b8SAl Viro 					     v.iov_base, v.iov_len))
851cbbd26b8SAl Viro 			return false;
852cbbd26b8SAl Viro 		0;}),
853cbbd26b8SAl Viro 		memcpy_from_page((to += v.bv_len) - v.bv_len, v.bv_page,
854cbbd26b8SAl Viro 				 v.bv_offset, v.bv_len),
855cbbd26b8SAl Viro 		memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len)
856cbbd26b8SAl Viro 	)
857cbbd26b8SAl Viro 
858cbbd26b8SAl Viro 	iov_iter_advance(i, bytes);
859cbbd26b8SAl Viro 	return true;
860cbbd26b8SAl Viro }
861aa28de27SAl Viro EXPORT_SYMBOL(_copy_from_iter_full_nocache);
862cbbd26b8SAl Viro 
86372e809edSAl Viro static inline bool page_copy_sane(struct page *page, size_t offset, size_t n)
86472e809edSAl Viro {
8656daef95bSEric Dumazet 	struct page *head;
8666daef95bSEric Dumazet 	size_t v = n + offset;
8676daef95bSEric Dumazet 
8686daef95bSEric Dumazet 	/*
8696daef95bSEric Dumazet 	 * The general case needs to access the page order in order
8706daef95bSEric Dumazet 	 * to compute the page size.
8716daef95bSEric Dumazet 	 * However, we mostly deal with order-0 pages and thus can
8726daef95bSEric Dumazet 	 * avoid a possible cache line miss for requests that fit all
8736daef95bSEric Dumazet 	 * page orders.
8746daef95bSEric Dumazet 	 */
8756daef95bSEric Dumazet 	if (n <= v && v <= PAGE_SIZE)
8766daef95bSEric Dumazet 		return true;
8776daef95bSEric Dumazet 
8786daef95bSEric Dumazet 	head = compound_head(page);
8796daef95bSEric Dumazet 	v += (page - head) << PAGE_SHIFT;
880a90bcb86SPetar Penkov 
881a90bcb86SPetar Penkov 	if (likely(n <= v && v <= (PAGE_SIZE << compound_order(head))))
88272e809edSAl Viro 		return true;
88372e809edSAl Viro 	WARN_ON(1);
88472e809edSAl Viro 	return false;
88572e809edSAl Viro }
886d879cb83SAl Viro 
887d879cb83SAl Viro size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
888d879cb83SAl Viro 			 struct iov_iter *i)
889d879cb83SAl Viro {
89072e809edSAl Viro 	if (unlikely(!page_copy_sane(page, offset, bytes)))
89172e809edSAl Viro 		return 0;
892d879cb83SAl Viro 	if (i->type & (ITER_BVEC|ITER_KVEC)) {
893d879cb83SAl Viro 		void *kaddr = kmap_atomic(page);
894d879cb83SAl Viro 		size_t wanted = copy_to_iter(kaddr + offset, bytes, i);
895d879cb83SAl Viro 		kunmap_atomic(kaddr);
896d879cb83SAl Viro 		return wanted;
8979ea9ce04SDavid Howells 	} else if (unlikely(iov_iter_is_discard(i)))
8989ea9ce04SDavid Howells 		return bytes;
8999ea9ce04SDavid Howells 	else if (likely(!iov_iter_is_pipe(i)))
900d879cb83SAl Viro 		return copy_page_to_iter_iovec(page, offset, bytes, i);
901241699cdSAl Viro 	else
902241699cdSAl Viro 		return copy_page_to_iter_pipe(page, offset, bytes, i);
903d879cb83SAl Viro }
904d879cb83SAl Viro EXPORT_SYMBOL(copy_page_to_iter);
905d879cb83SAl Viro 
906d879cb83SAl Viro size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes,
907d879cb83SAl Viro 			 struct iov_iter *i)
908d879cb83SAl Viro {
90972e809edSAl Viro 	if (unlikely(!page_copy_sane(page, offset, bytes)))
91072e809edSAl Viro 		return 0;
9119ea9ce04SDavid Howells 	if (unlikely(iov_iter_is_pipe(i) || iov_iter_is_discard(i))) {
912241699cdSAl Viro 		WARN_ON(1);
913241699cdSAl Viro 		return 0;
914241699cdSAl Viro 	}
915d879cb83SAl Viro 	if (i->type & (ITER_BVEC|ITER_KVEC)) {
916d879cb83SAl Viro 		void *kaddr = kmap_atomic(page);
917aa28de27SAl Viro 		size_t wanted = _copy_from_iter(kaddr + offset, bytes, i);
918d879cb83SAl Viro 		kunmap_atomic(kaddr);
919d879cb83SAl Viro 		return wanted;
920d879cb83SAl Viro 	} else
921d879cb83SAl Viro 		return copy_page_from_iter_iovec(page, offset, bytes, i);
922d879cb83SAl Viro }
923d879cb83SAl Viro EXPORT_SYMBOL(copy_page_from_iter);
924d879cb83SAl Viro 
925241699cdSAl Viro static size_t pipe_zero(size_t bytes, struct iov_iter *i)
926241699cdSAl Viro {
927241699cdSAl Viro 	struct pipe_inode_info *pipe = i->pipe;
928241699cdSAl Viro 	size_t n, off;
929241699cdSAl Viro 	int idx;
930241699cdSAl Viro 
931241699cdSAl Viro 	if (!sanity(i))
932241699cdSAl Viro 		return 0;
933241699cdSAl Viro 
934241699cdSAl Viro 	bytes = n = push_pipe(i, bytes, &idx, &off);
935241699cdSAl Viro 	if (unlikely(!n))
936241699cdSAl Viro 		return 0;
937241699cdSAl Viro 
938241699cdSAl Viro 	for ( ; n; idx = next_idx(idx, pipe), off = 0) {
939241699cdSAl Viro 		size_t chunk = min_t(size_t, n, PAGE_SIZE - off);
940241699cdSAl Viro 		memzero_page(pipe->bufs[idx].page, off, chunk);
941241699cdSAl Viro 		i->idx = idx;
942241699cdSAl Viro 		i->iov_offset = off + chunk;
943241699cdSAl Viro 		n -= chunk;
944241699cdSAl Viro 	}
945241699cdSAl Viro 	i->count -= bytes;
946241699cdSAl Viro 	return bytes;
947241699cdSAl Viro }
948241699cdSAl Viro 
949d879cb83SAl Viro size_t iov_iter_zero(size_t bytes, struct iov_iter *i)
950d879cb83SAl Viro {
95100e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i)))
952241699cdSAl Viro 		return pipe_zero(bytes, i);
953d879cb83SAl Viro 	iterate_and_advance(i, bytes, v,
95409fc68dcSAl Viro 		clear_user(v.iov_base, v.iov_len),
955d879cb83SAl Viro 		memzero_page(v.bv_page, v.bv_offset, v.bv_len),
956d879cb83SAl Viro 		memset(v.iov_base, 0, v.iov_len)
957d879cb83SAl Viro 	)
958d879cb83SAl Viro 
959d879cb83SAl Viro 	return bytes;
960d879cb83SAl Viro }
961d879cb83SAl Viro EXPORT_SYMBOL(iov_iter_zero);
962d879cb83SAl Viro 
963d879cb83SAl Viro size_t iov_iter_copy_from_user_atomic(struct page *page,
964d879cb83SAl Viro 		struct iov_iter *i, unsigned long offset, size_t bytes)
965d879cb83SAl Viro {
966d879cb83SAl Viro 	char *kaddr = kmap_atomic(page), *p = kaddr + offset;
96772e809edSAl Viro 	if (unlikely(!page_copy_sane(page, offset, bytes))) {
96872e809edSAl Viro 		kunmap_atomic(kaddr);
96972e809edSAl Viro 		return 0;
97072e809edSAl Viro 	}
9719ea9ce04SDavid Howells 	if (unlikely(iov_iter_is_pipe(i) || iov_iter_is_discard(i))) {
972241699cdSAl Viro 		kunmap_atomic(kaddr);
973241699cdSAl Viro 		WARN_ON(1);
974241699cdSAl Viro 		return 0;
975241699cdSAl Viro 	}
976d879cb83SAl Viro 	iterate_all_kinds(i, bytes, v,
97709fc68dcSAl Viro 		copyin((p += v.iov_len) - v.iov_len, v.iov_base, v.iov_len),
978d879cb83SAl Viro 		memcpy_from_page((p += v.bv_len) - v.bv_len, v.bv_page,
979d879cb83SAl Viro 				 v.bv_offset, v.bv_len),
980d879cb83SAl Viro 		memcpy((p += v.iov_len) - v.iov_len, v.iov_base, v.iov_len)
981d879cb83SAl Viro 	)
982d879cb83SAl Viro 	kunmap_atomic(kaddr);
983d879cb83SAl Viro 	return bytes;
984d879cb83SAl Viro }
985d879cb83SAl Viro EXPORT_SYMBOL(iov_iter_copy_from_user_atomic);
986d879cb83SAl Viro 
987b9dc6f65SAl Viro static inline void pipe_truncate(struct iov_iter *i)
988241699cdSAl Viro {
989241699cdSAl Viro 	struct pipe_inode_info *pipe = i->pipe;
990241699cdSAl Viro 	if (pipe->nrbufs) {
991b9dc6f65SAl Viro 		size_t off = i->iov_offset;
992b9dc6f65SAl Viro 		int idx = i->idx;
993b9dc6f65SAl Viro 		int nrbufs = (idx - pipe->curbuf) & (pipe->buffers - 1);
994b9dc6f65SAl Viro 		if (off) {
995b9dc6f65SAl Viro 			pipe->bufs[idx].len = off - pipe->bufs[idx].offset;
996b9dc6f65SAl Viro 			idx = next_idx(idx, pipe);
997b9dc6f65SAl Viro 			nrbufs++;
998b9dc6f65SAl Viro 		}
999b9dc6f65SAl Viro 		while (pipe->nrbufs > nrbufs) {
1000a779638cSMiklos Szeredi 			pipe_buf_release(pipe, &pipe->bufs[idx]);
1001241699cdSAl Viro 			idx = next_idx(idx, pipe);
1002241699cdSAl Viro 			pipe->nrbufs--;
1003241699cdSAl Viro 		}
1004241699cdSAl Viro 	}
1005b9dc6f65SAl Viro }
1006b9dc6f65SAl Viro 
1007b9dc6f65SAl Viro static void pipe_advance(struct iov_iter *i, size_t size)
1008b9dc6f65SAl Viro {
1009b9dc6f65SAl Viro 	struct pipe_inode_info *pipe = i->pipe;
1010b9dc6f65SAl Viro 	if (unlikely(i->count < size))
1011b9dc6f65SAl Viro 		size = i->count;
1012b9dc6f65SAl Viro 	if (size) {
1013b9dc6f65SAl Viro 		struct pipe_buffer *buf;
1014b9dc6f65SAl Viro 		size_t off = i->iov_offset, left = size;
1015b9dc6f65SAl Viro 		int idx = i->idx;
1016b9dc6f65SAl Viro 		if (off) /* make it relative to the beginning of buffer */
1017b9dc6f65SAl Viro 			left += off - pipe->bufs[idx].offset;
1018b9dc6f65SAl Viro 		while (1) {
1019b9dc6f65SAl Viro 			buf = &pipe->bufs[idx];
1020b9dc6f65SAl Viro 			if (left <= buf->len)
1021b9dc6f65SAl Viro 				break;
1022b9dc6f65SAl Viro 			left -= buf->len;
1023b9dc6f65SAl Viro 			idx = next_idx(idx, pipe);
1024b9dc6f65SAl Viro 		}
1025b9dc6f65SAl Viro 		i->idx = idx;
1026b9dc6f65SAl Viro 		i->iov_offset = buf->offset + left;
1027b9dc6f65SAl Viro 	}
1028b9dc6f65SAl Viro 	i->count -= size;
1029b9dc6f65SAl Viro 	/* ... and discard everything past that point */
1030b9dc6f65SAl Viro 	pipe_truncate(i);
1031241699cdSAl Viro }
1032241699cdSAl Viro 
1033d879cb83SAl Viro void iov_iter_advance(struct iov_iter *i, size_t size)
1034d879cb83SAl Viro {
103500e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i))) {
1036241699cdSAl Viro 		pipe_advance(i, size);
1037241699cdSAl Viro 		return;
1038241699cdSAl Viro 	}
10399ea9ce04SDavid Howells 	if (unlikely(iov_iter_is_discard(i))) {
10409ea9ce04SDavid Howells 		i->count -= size;
10419ea9ce04SDavid Howells 		return;
10429ea9ce04SDavid Howells 	}
1043d879cb83SAl Viro 	iterate_and_advance(i, size, v, 0, 0, 0)
1044d879cb83SAl Viro }
1045d879cb83SAl Viro EXPORT_SYMBOL(iov_iter_advance);
1046d879cb83SAl Viro 
104727c0e374SAl Viro void iov_iter_revert(struct iov_iter *i, size_t unroll)
104827c0e374SAl Viro {
104927c0e374SAl Viro 	if (!unroll)
105027c0e374SAl Viro 		return;
10515b47d59aSAl Viro 	if (WARN_ON(unroll > MAX_RW_COUNT))
10525b47d59aSAl Viro 		return;
105327c0e374SAl Viro 	i->count += unroll;
105400e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i))) {
105527c0e374SAl Viro 		struct pipe_inode_info *pipe = i->pipe;
105627c0e374SAl Viro 		int idx = i->idx;
105727c0e374SAl Viro 		size_t off = i->iov_offset;
105827c0e374SAl Viro 		while (1) {
105927c0e374SAl Viro 			size_t n = off - pipe->bufs[idx].offset;
106027c0e374SAl Viro 			if (unroll < n) {
10614fa55cefSAl Viro 				off -= unroll;
106227c0e374SAl Viro 				break;
106327c0e374SAl Viro 			}
106427c0e374SAl Viro 			unroll -= n;
106527c0e374SAl Viro 			if (!unroll && idx == i->start_idx) {
106627c0e374SAl Viro 				off = 0;
106727c0e374SAl Viro 				break;
106827c0e374SAl Viro 			}
106927c0e374SAl Viro 			if (!idx--)
107027c0e374SAl Viro 				idx = pipe->buffers - 1;
107127c0e374SAl Viro 			off = pipe->bufs[idx].offset + pipe->bufs[idx].len;
107227c0e374SAl Viro 		}
107327c0e374SAl Viro 		i->iov_offset = off;
107427c0e374SAl Viro 		i->idx = idx;
107527c0e374SAl Viro 		pipe_truncate(i);
107627c0e374SAl Viro 		return;
107727c0e374SAl Viro 	}
10789ea9ce04SDavid Howells 	if (unlikely(iov_iter_is_discard(i)))
10799ea9ce04SDavid Howells 		return;
108027c0e374SAl Viro 	if (unroll <= i->iov_offset) {
108127c0e374SAl Viro 		i->iov_offset -= unroll;
108227c0e374SAl Viro 		return;
108327c0e374SAl Viro 	}
108427c0e374SAl Viro 	unroll -= i->iov_offset;
108500e23707SDavid Howells 	if (iov_iter_is_bvec(i)) {
108627c0e374SAl Viro 		const struct bio_vec *bvec = i->bvec;
108727c0e374SAl Viro 		while (1) {
108827c0e374SAl Viro 			size_t n = (--bvec)->bv_len;
108927c0e374SAl Viro 			i->nr_segs++;
109027c0e374SAl Viro 			if (unroll <= n) {
109127c0e374SAl Viro 				i->bvec = bvec;
109227c0e374SAl Viro 				i->iov_offset = n - unroll;
109327c0e374SAl Viro 				return;
109427c0e374SAl Viro 			}
109527c0e374SAl Viro 			unroll -= n;
109627c0e374SAl Viro 		}
109727c0e374SAl Viro 	} else { /* same logics for iovec and kvec */
109827c0e374SAl Viro 		const struct iovec *iov = i->iov;
109927c0e374SAl Viro 		while (1) {
110027c0e374SAl Viro 			size_t n = (--iov)->iov_len;
110127c0e374SAl Viro 			i->nr_segs++;
110227c0e374SAl Viro 			if (unroll <= n) {
110327c0e374SAl Viro 				i->iov = iov;
110427c0e374SAl Viro 				i->iov_offset = n - unroll;
110527c0e374SAl Viro 				return;
110627c0e374SAl Viro 			}
110727c0e374SAl Viro 			unroll -= n;
110827c0e374SAl Viro 		}
110927c0e374SAl Viro 	}
111027c0e374SAl Viro }
111127c0e374SAl Viro EXPORT_SYMBOL(iov_iter_revert);
111227c0e374SAl Viro 
1113d879cb83SAl Viro /*
1114d879cb83SAl Viro  * Return the count of just the current iov_iter segment.
1115d879cb83SAl Viro  */
1116d879cb83SAl Viro size_t iov_iter_single_seg_count(const struct iov_iter *i)
1117d879cb83SAl Viro {
111800e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i)))
1119241699cdSAl Viro 		return i->count;	// it is a silly place, anyway
1120d879cb83SAl Viro 	if (i->nr_segs == 1)
1121d879cb83SAl Viro 		return i->count;
11229ea9ce04SDavid Howells 	if (unlikely(iov_iter_is_discard(i)))
11239ea9ce04SDavid Howells 		return i->count;
112400e23707SDavid Howells 	else if (iov_iter_is_bvec(i))
1125d879cb83SAl Viro 		return min(i->count, i->bvec->bv_len - i->iov_offset);
1126d879cb83SAl Viro 	else
1127d879cb83SAl Viro 		return min(i->count, i->iov->iov_len - i->iov_offset);
1128d879cb83SAl Viro }
1129d879cb83SAl Viro EXPORT_SYMBOL(iov_iter_single_seg_count);
1130d879cb83SAl Viro 
1131aa563d7bSDavid Howells void iov_iter_kvec(struct iov_iter *i, unsigned int direction,
1132d879cb83SAl Viro 			const struct kvec *kvec, unsigned long nr_segs,
1133d879cb83SAl Viro 			size_t count)
1134d879cb83SAl Viro {
1135aa563d7bSDavid Howells 	WARN_ON(direction & ~(READ | WRITE));
1136aa563d7bSDavid Howells 	i->type = ITER_KVEC | (direction & (READ | WRITE));
1137d879cb83SAl Viro 	i->kvec = kvec;
1138d879cb83SAl Viro 	i->nr_segs = nr_segs;
1139d879cb83SAl Viro 	i->iov_offset = 0;
1140d879cb83SAl Viro 	i->count = count;
1141d879cb83SAl Viro }
1142d879cb83SAl Viro EXPORT_SYMBOL(iov_iter_kvec);
1143d879cb83SAl Viro 
1144aa563d7bSDavid Howells void iov_iter_bvec(struct iov_iter *i, unsigned int direction,
1145d879cb83SAl Viro 			const struct bio_vec *bvec, unsigned long nr_segs,
1146d879cb83SAl Viro 			size_t count)
1147d879cb83SAl Viro {
1148aa563d7bSDavid Howells 	WARN_ON(direction & ~(READ | WRITE));
1149aa563d7bSDavid Howells 	i->type = ITER_BVEC | (direction & (READ | WRITE));
1150d879cb83SAl Viro 	i->bvec = bvec;
1151d879cb83SAl Viro 	i->nr_segs = nr_segs;
1152d879cb83SAl Viro 	i->iov_offset = 0;
1153d879cb83SAl Viro 	i->count = count;
1154d879cb83SAl Viro }
1155d879cb83SAl Viro EXPORT_SYMBOL(iov_iter_bvec);
1156d879cb83SAl Viro 
1157aa563d7bSDavid Howells void iov_iter_pipe(struct iov_iter *i, unsigned int direction,
1158241699cdSAl Viro 			struct pipe_inode_info *pipe,
1159241699cdSAl Viro 			size_t count)
1160241699cdSAl Viro {
1161aa563d7bSDavid Howells 	BUG_ON(direction != READ);
1162b9dc6f65SAl Viro 	WARN_ON(pipe->nrbufs == pipe->buffers);
1163aa563d7bSDavid Howells 	i->type = ITER_PIPE | READ;
1164241699cdSAl Viro 	i->pipe = pipe;
1165241699cdSAl Viro 	i->idx = (pipe->curbuf + pipe->nrbufs) & (pipe->buffers - 1);
1166241699cdSAl Viro 	i->iov_offset = 0;
1167241699cdSAl Viro 	i->count = count;
116827c0e374SAl Viro 	i->start_idx = i->idx;
1169241699cdSAl Viro }
1170241699cdSAl Viro EXPORT_SYMBOL(iov_iter_pipe);
1171241699cdSAl Viro 
11729ea9ce04SDavid Howells /**
11739ea9ce04SDavid Howells  * iov_iter_discard - Initialise an I/O iterator that discards data
11749ea9ce04SDavid Howells  * @i: The iterator to initialise.
11759ea9ce04SDavid Howells  * @direction: The direction of the transfer.
11769ea9ce04SDavid Howells  * @count: The size of the I/O buffer in bytes.
11779ea9ce04SDavid Howells  *
11789ea9ce04SDavid Howells  * Set up an I/O iterator that just discards everything that's written to it.
11799ea9ce04SDavid Howells  * It's only available as a READ iterator.
11809ea9ce04SDavid Howells  */
11819ea9ce04SDavid Howells void iov_iter_discard(struct iov_iter *i, unsigned int direction, size_t count)
11829ea9ce04SDavid Howells {
11839ea9ce04SDavid Howells 	BUG_ON(direction != READ);
11849ea9ce04SDavid Howells 	i->type = ITER_DISCARD | READ;
11859ea9ce04SDavid Howells 	i->count = count;
11869ea9ce04SDavid Howells 	i->iov_offset = 0;
11879ea9ce04SDavid Howells }
11889ea9ce04SDavid Howells EXPORT_SYMBOL(iov_iter_discard);
11899ea9ce04SDavid Howells 
1190d879cb83SAl Viro unsigned long iov_iter_alignment(const struct iov_iter *i)
1191d879cb83SAl Viro {
1192d879cb83SAl Viro 	unsigned long res = 0;
1193d879cb83SAl Viro 	size_t size = i->count;
1194d879cb83SAl Viro 
119500e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i))) {
119633844e66SAl Viro 		if (size && i->iov_offset && allocated(&i->pipe->bufs[i->idx]))
1197241699cdSAl Viro 			return size | i->iov_offset;
1198241699cdSAl Viro 		return size;
1199241699cdSAl Viro 	}
1200d879cb83SAl Viro 	iterate_all_kinds(i, size, v,
1201d879cb83SAl Viro 		(res |= (unsigned long)v.iov_base | v.iov_len, 0),
1202d879cb83SAl Viro 		res |= v.bv_offset | v.bv_len,
1203d879cb83SAl Viro 		res |= (unsigned long)v.iov_base | v.iov_len
1204d879cb83SAl Viro 	)
1205d879cb83SAl Viro 	return res;
1206d879cb83SAl Viro }
1207d879cb83SAl Viro EXPORT_SYMBOL(iov_iter_alignment);
1208d879cb83SAl Viro 
1209357f435dSAl Viro unsigned long iov_iter_gap_alignment(const struct iov_iter *i)
1210357f435dSAl Viro {
1211357f435dSAl Viro 	unsigned long res = 0;
1212357f435dSAl Viro 	size_t size = i->count;
1213357f435dSAl Viro 
12149ea9ce04SDavid Howells 	if (unlikely(iov_iter_is_pipe(i) || iov_iter_is_discard(i))) {
1215241699cdSAl Viro 		WARN_ON(1);
1216241699cdSAl Viro 		return ~0U;
1217241699cdSAl Viro 	}
1218241699cdSAl Viro 
1219357f435dSAl Viro 	iterate_all_kinds(i, size, v,
1220357f435dSAl Viro 		(res |= (!res ? 0 : (unsigned long)v.iov_base) |
1221357f435dSAl Viro 			(size != v.iov_len ? size : 0), 0),
1222357f435dSAl Viro 		(res |= (!res ? 0 : (unsigned long)v.bv_offset) |
1223357f435dSAl Viro 			(size != v.bv_len ? size : 0)),
1224357f435dSAl Viro 		(res |= (!res ? 0 : (unsigned long)v.iov_base) |
1225357f435dSAl Viro 			(size != v.iov_len ? size : 0))
1226357f435dSAl Viro 		);
1227357f435dSAl Viro 	return res;
1228357f435dSAl Viro }
1229357f435dSAl Viro EXPORT_SYMBOL(iov_iter_gap_alignment);
1230357f435dSAl Viro 
1231e76b6312SIlya Dryomov static inline ssize_t __pipe_get_pages(struct iov_iter *i,
1232241699cdSAl Viro 				size_t maxsize,
1233241699cdSAl Viro 				struct page **pages,
1234241699cdSAl Viro 				int idx,
1235241699cdSAl Viro 				size_t *start)
1236241699cdSAl Viro {
1237241699cdSAl Viro 	struct pipe_inode_info *pipe = i->pipe;
12381689c73aSAl Viro 	ssize_t n = push_pipe(i, maxsize, &idx, start);
1239241699cdSAl Viro 	if (!n)
1240241699cdSAl Viro 		return -EFAULT;
1241241699cdSAl Viro 
1242241699cdSAl Viro 	maxsize = n;
1243241699cdSAl Viro 	n += *start;
12441689c73aSAl Viro 	while (n > 0) {
1245241699cdSAl Viro 		get_page(*pages++ = pipe->bufs[idx].page);
1246241699cdSAl Viro 		idx = next_idx(idx, pipe);
1247241699cdSAl Viro 		n -= PAGE_SIZE;
1248241699cdSAl Viro 	}
1249241699cdSAl Viro 
1250241699cdSAl Viro 	return maxsize;
1251241699cdSAl Viro }
1252241699cdSAl Viro 
1253241699cdSAl Viro static ssize_t pipe_get_pages(struct iov_iter *i,
1254241699cdSAl Viro 		   struct page **pages, size_t maxsize, unsigned maxpages,
1255241699cdSAl Viro 		   size_t *start)
1256241699cdSAl Viro {
1257241699cdSAl Viro 	unsigned npages;
1258241699cdSAl Viro 	size_t capacity;
1259241699cdSAl Viro 	int idx;
1260241699cdSAl Viro 
126133844e66SAl Viro 	if (!maxsize)
126233844e66SAl Viro 		return 0;
126333844e66SAl Viro 
1264241699cdSAl Viro 	if (!sanity(i))
1265241699cdSAl Viro 		return -EFAULT;
1266241699cdSAl Viro 
1267241699cdSAl Viro 	data_start(i, &idx, start);
1268241699cdSAl Viro 	/* some of this one + all after this one */
1269241699cdSAl Viro 	npages = ((i->pipe->curbuf - idx - 1) & (i->pipe->buffers - 1)) + 1;
1270241699cdSAl Viro 	capacity = min(npages,maxpages) * PAGE_SIZE - *start;
1271241699cdSAl Viro 
1272241699cdSAl Viro 	return __pipe_get_pages(i, min(maxsize, capacity), pages, idx, start);
1273241699cdSAl Viro }
1274241699cdSAl Viro 
1275d879cb83SAl Viro ssize_t iov_iter_get_pages(struct iov_iter *i,
1276d879cb83SAl Viro 		   struct page **pages, size_t maxsize, unsigned maxpages,
1277d879cb83SAl Viro 		   size_t *start)
1278d879cb83SAl Viro {
1279d879cb83SAl Viro 	if (maxsize > i->count)
1280d879cb83SAl Viro 		maxsize = i->count;
1281d879cb83SAl Viro 
128200e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i)))
1283241699cdSAl Viro 		return pipe_get_pages(i, pages, maxsize, maxpages, start);
12849ea9ce04SDavid Howells 	if (unlikely(iov_iter_is_discard(i)))
12859ea9ce04SDavid Howells 		return -EFAULT;
12869ea9ce04SDavid Howells 
1287d879cb83SAl Viro 	iterate_all_kinds(i, maxsize, v, ({
1288d879cb83SAl Viro 		unsigned long addr = (unsigned long)v.iov_base;
1289d879cb83SAl Viro 		size_t len = v.iov_len + (*start = addr & (PAGE_SIZE - 1));
1290d879cb83SAl Viro 		int n;
1291d879cb83SAl Viro 		int res;
1292d879cb83SAl Viro 
1293d879cb83SAl Viro 		if (len > maxpages * PAGE_SIZE)
1294d879cb83SAl Viro 			len = maxpages * PAGE_SIZE;
1295d879cb83SAl Viro 		addr &= ~(PAGE_SIZE - 1);
1296d879cb83SAl Viro 		n = DIV_ROUND_UP(len, PAGE_SIZE);
129773b0140bSIra Weiny 		res = get_user_pages_fast(addr, n,
129873b0140bSIra Weiny 				iov_iter_rw(i) != WRITE ?  FOLL_WRITE : 0,
129973b0140bSIra Weiny 				pages);
1300d879cb83SAl Viro 		if (unlikely(res < 0))
1301d879cb83SAl Viro 			return res;
1302d879cb83SAl Viro 		return (res == n ? len : res * PAGE_SIZE) - *start;
1303d879cb83SAl Viro 	0;}),({
1304d879cb83SAl Viro 		/* can't be more than PAGE_SIZE */
1305d879cb83SAl Viro 		*start = v.bv_offset;
1306d879cb83SAl Viro 		get_page(*pages = v.bv_page);
1307d879cb83SAl Viro 		return v.bv_len;
1308d879cb83SAl Viro 	}),({
1309d879cb83SAl Viro 		return -EFAULT;
1310d879cb83SAl Viro 	})
1311d879cb83SAl Viro 	)
1312d879cb83SAl Viro 	return 0;
1313d879cb83SAl Viro }
1314d879cb83SAl Viro EXPORT_SYMBOL(iov_iter_get_pages);
1315d879cb83SAl Viro 
1316d879cb83SAl Viro static struct page **get_pages_array(size_t n)
1317d879cb83SAl Viro {
1318752ade68SMichal Hocko 	return kvmalloc_array(n, sizeof(struct page *), GFP_KERNEL);
1319d879cb83SAl Viro }
1320d879cb83SAl Viro 
1321241699cdSAl Viro static ssize_t pipe_get_pages_alloc(struct iov_iter *i,
1322241699cdSAl Viro 		   struct page ***pages, size_t maxsize,
1323241699cdSAl Viro 		   size_t *start)
1324241699cdSAl Viro {
1325241699cdSAl Viro 	struct page **p;
1326d7760d63SIlya Dryomov 	ssize_t n;
1327241699cdSAl Viro 	int idx;
1328241699cdSAl Viro 	int npages;
1329241699cdSAl Viro 
133033844e66SAl Viro 	if (!maxsize)
133133844e66SAl Viro 		return 0;
133233844e66SAl Viro 
1333241699cdSAl Viro 	if (!sanity(i))
1334241699cdSAl Viro 		return -EFAULT;
1335241699cdSAl Viro 
1336241699cdSAl Viro 	data_start(i, &idx, start);
1337241699cdSAl Viro 	/* some of this one + all after this one */
1338241699cdSAl Viro 	npages = ((i->pipe->curbuf - idx - 1) & (i->pipe->buffers - 1)) + 1;
1339241699cdSAl Viro 	n = npages * PAGE_SIZE - *start;
1340241699cdSAl Viro 	if (maxsize > n)
1341241699cdSAl Viro 		maxsize = n;
1342241699cdSAl Viro 	else
1343241699cdSAl Viro 		npages = DIV_ROUND_UP(maxsize + *start, PAGE_SIZE);
1344241699cdSAl Viro 	p = get_pages_array(npages);
1345241699cdSAl Viro 	if (!p)
1346241699cdSAl Viro 		return -ENOMEM;
1347241699cdSAl Viro 	n = __pipe_get_pages(i, maxsize, p, idx, start);
1348241699cdSAl Viro 	if (n > 0)
1349241699cdSAl Viro 		*pages = p;
1350241699cdSAl Viro 	else
1351241699cdSAl Viro 		kvfree(p);
1352241699cdSAl Viro 	return n;
1353241699cdSAl Viro }
1354241699cdSAl Viro 
1355d879cb83SAl Viro ssize_t iov_iter_get_pages_alloc(struct iov_iter *i,
1356d879cb83SAl Viro 		   struct page ***pages, size_t maxsize,
1357d879cb83SAl Viro 		   size_t *start)
1358d879cb83SAl Viro {
1359d879cb83SAl Viro 	struct page **p;
1360d879cb83SAl Viro 
1361d879cb83SAl Viro 	if (maxsize > i->count)
1362d879cb83SAl Viro 		maxsize = i->count;
1363d879cb83SAl Viro 
136400e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i)))
1365241699cdSAl Viro 		return pipe_get_pages_alloc(i, pages, maxsize, start);
13669ea9ce04SDavid Howells 	if (unlikely(iov_iter_is_discard(i)))
13679ea9ce04SDavid Howells 		return -EFAULT;
13689ea9ce04SDavid Howells 
1369d879cb83SAl Viro 	iterate_all_kinds(i, maxsize, v, ({
1370d879cb83SAl Viro 		unsigned long addr = (unsigned long)v.iov_base;
1371d879cb83SAl Viro 		size_t len = v.iov_len + (*start = addr & (PAGE_SIZE - 1));
1372d879cb83SAl Viro 		int n;
1373d879cb83SAl Viro 		int res;
1374d879cb83SAl Viro 
1375d879cb83SAl Viro 		addr &= ~(PAGE_SIZE - 1);
1376d879cb83SAl Viro 		n = DIV_ROUND_UP(len, PAGE_SIZE);
1377d879cb83SAl Viro 		p = get_pages_array(n);
1378d879cb83SAl Viro 		if (!p)
1379d879cb83SAl Viro 			return -ENOMEM;
138073b0140bSIra Weiny 		res = get_user_pages_fast(addr, n,
138173b0140bSIra Weiny 				iov_iter_rw(i) != WRITE ?  FOLL_WRITE : 0, p);
1382d879cb83SAl Viro 		if (unlikely(res < 0)) {
1383d879cb83SAl Viro 			kvfree(p);
1384d879cb83SAl Viro 			return res;
1385d879cb83SAl Viro 		}
1386d879cb83SAl Viro 		*pages = p;
1387d879cb83SAl Viro 		return (res == n ? len : res * PAGE_SIZE) - *start;
1388d879cb83SAl Viro 	0;}),({
1389d879cb83SAl Viro 		/* can't be more than PAGE_SIZE */
1390d879cb83SAl Viro 		*start = v.bv_offset;
1391d879cb83SAl Viro 		*pages = p = get_pages_array(1);
1392d879cb83SAl Viro 		if (!p)
1393d879cb83SAl Viro 			return -ENOMEM;
1394d879cb83SAl Viro 		get_page(*p = v.bv_page);
1395d879cb83SAl Viro 		return v.bv_len;
1396d879cb83SAl Viro 	}),({
1397d879cb83SAl Viro 		return -EFAULT;
1398d879cb83SAl Viro 	})
1399d879cb83SAl Viro 	)
1400d879cb83SAl Viro 	return 0;
1401d879cb83SAl Viro }
1402d879cb83SAl Viro EXPORT_SYMBOL(iov_iter_get_pages_alloc);
1403d879cb83SAl Viro 
1404d879cb83SAl Viro size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum,
1405d879cb83SAl Viro 			       struct iov_iter *i)
1406d879cb83SAl Viro {
1407d879cb83SAl Viro 	char *to = addr;
1408d879cb83SAl Viro 	__wsum sum, next;
1409d879cb83SAl Viro 	size_t off = 0;
1410d879cb83SAl Viro 	sum = *csum;
14119ea9ce04SDavid Howells 	if (unlikely(iov_iter_is_pipe(i) || iov_iter_is_discard(i))) {
1412241699cdSAl Viro 		WARN_ON(1);
1413241699cdSAl Viro 		return 0;
1414241699cdSAl Viro 	}
1415d879cb83SAl Viro 	iterate_and_advance(i, bytes, v, ({
1416d879cb83SAl Viro 		int err = 0;
1417d879cb83SAl Viro 		next = csum_and_copy_from_user(v.iov_base,
1418d879cb83SAl Viro 					       (to += v.iov_len) - v.iov_len,
1419d879cb83SAl Viro 					       v.iov_len, 0, &err);
1420d879cb83SAl Viro 		if (!err) {
1421d879cb83SAl Viro 			sum = csum_block_add(sum, next, off);
1422d879cb83SAl Viro 			off += v.iov_len;
1423d879cb83SAl Viro 		}
1424d879cb83SAl Viro 		err ? v.iov_len : 0;
1425d879cb83SAl Viro 	}), ({
1426d879cb83SAl Viro 		char *p = kmap_atomic(v.bv_page);
1427f9152895SAl Viro 		sum = csum_and_memcpy((to += v.bv_len) - v.bv_len,
1428f9152895SAl Viro 				      p + v.bv_offset, v.bv_len,
1429f9152895SAl Viro 				      sum, off);
1430d879cb83SAl Viro 		kunmap_atomic(p);
1431d879cb83SAl Viro 		off += v.bv_len;
1432d879cb83SAl Viro 	}),({
1433f9152895SAl Viro 		sum = csum_and_memcpy((to += v.iov_len) - v.iov_len,
1434f9152895SAl Viro 				      v.iov_base, v.iov_len,
1435f9152895SAl Viro 				      sum, off);
1436d879cb83SAl Viro 		off += v.iov_len;
1437d879cb83SAl Viro 	})
1438d879cb83SAl Viro 	)
1439d879cb83SAl Viro 	*csum = sum;
1440d879cb83SAl Viro 	return bytes;
1441d879cb83SAl Viro }
1442d879cb83SAl Viro EXPORT_SYMBOL(csum_and_copy_from_iter);
1443d879cb83SAl Viro 
1444cbbd26b8SAl Viro bool csum_and_copy_from_iter_full(void *addr, size_t bytes, __wsum *csum,
1445cbbd26b8SAl Viro 			       struct iov_iter *i)
1446cbbd26b8SAl Viro {
1447cbbd26b8SAl Viro 	char *to = addr;
1448cbbd26b8SAl Viro 	__wsum sum, next;
1449cbbd26b8SAl Viro 	size_t off = 0;
1450cbbd26b8SAl Viro 	sum = *csum;
14519ea9ce04SDavid Howells 	if (unlikely(iov_iter_is_pipe(i) || iov_iter_is_discard(i))) {
1452cbbd26b8SAl Viro 		WARN_ON(1);
1453cbbd26b8SAl Viro 		return false;
1454cbbd26b8SAl Viro 	}
1455cbbd26b8SAl Viro 	if (unlikely(i->count < bytes))
1456cbbd26b8SAl Viro 		return false;
1457cbbd26b8SAl Viro 	iterate_all_kinds(i, bytes, v, ({
1458cbbd26b8SAl Viro 		int err = 0;
1459cbbd26b8SAl Viro 		next = csum_and_copy_from_user(v.iov_base,
1460cbbd26b8SAl Viro 					       (to += v.iov_len) - v.iov_len,
1461cbbd26b8SAl Viro 					       v.iov_len, 0, &err);
1462cbbd26b8SAl Viro 		if (err)
1463cbbd26b8SAl Viro 			return false;
1464cbbd26b8SAl Viro 		sum = csum_block_add(sum, next, off);
1465cbbd26b8SAl Viro 		off += v.iov_len;
1466cbbd26b8SAl Viro 		0;
1467cbbd26b8SAl Viro 	}), ({
1468cbbd26b8SAl Viro 		char *p = kmap_atomic(v.bv_page);
1469f9152895SAl Viro 		sum = csum_and_memcpy((to += v.bv_len) - v.bv_len,
1470f9152895SAl Viro 				      p + v.bv_offset, v.bv_len,
1471f9152895SAl Viro 				      sum, off);
1472cbbd26b8SAl Viro 		kunmap_atomic(p);
1473cbbd26b8SAl Viro 		off += v.bv_len;
1474cbbd26b8SAl Viro 	}),({
1475f9152895SAl Viro 		sum = csum_and_memcpy((to += v.iov_len) - v.iov_len,
1476f9152895SAl Viro 				      v.iov_base, v.iov_len,
1477f9152895SAl Viro 				      sum, off);
1478cbbd26b8SAl Viro 		off += v.iov_len;
1479cbbd26b8SAl Viro 	})
1480cbbd26b8SAl Viro 	)
1481cbbd26b8SAl Viro 	*csum = sum;
1482cbbd26b8SAl Viro 	iov_iter_advance(i, bytes);
1483cbbd26b8SAl Viro 	return true;
1484cbbd26b8SAl Viro }
1485cbbd26b8SAl Viro EXPORT_SYMBOL(csum_and_copy_from_iter_full);
1486cbbd26b8SAl Viro 
1487cb002d07SSagi Grimberg size_t csum_and_copy_to_iter(const void *addr, size_t bytes, void *csump,
1488d879cb83SAl Viro 			     struct iov_iter *i)
1489d879cb83SAl Viro {
149036f7a8a4SAl Viro 	const char *from = addr;
1491cb002d07SSagi Grimberg 	__wsum *csum = csump;
1492d879cb83SAl Viro 	__wsum sum, next;
1493d879cb83SAl Viro 	size_t off = 0;
149478e1f386SAl Viro 
149578e1f386SAl Viro 	if (unlikely(iov_iter_is_pipe(i)))
149678e1f386SAl Viro 		return csum_and_copy_to_pipe_iter(addr, bytes, csum, i);
149778e1f386SAl Viro 
1498d879cb83SAl Viro 	sum = *csum;
149978e1f386SAl Viro 	if (unlikely(iov_iter_is_discard(i))) {
1500241699cdSAl Viro 		WARN_ON(1);	/* for now */
1501241699cdSAl Viro 		return 0;
1502241699cdSAl Viro 	}
1503d879cb83SAl Viro 	iterate_and_advance(i, bytes, v, ({
1504d879cb83SAl Viro 		int err = 0;
1505d879cb83SAl Viro 		next = csum_and_copy_to_user((from += v.iov_len) - v.iov_len,
1506d879cb83SAl Viro 					     v.iov_base,
1507d879cb83SAl Viro 					     v.iov_len, 0, &err);
1508d879cb83SAl Viro 		if (!err) {
1509d879cb83SAl Viro 			sum = csum_block_add(sum, next, off);
1510d879cb83SAl Viro 			off += v.iov_len;
1511d879cb83SAl Viro 		}
1512d879cb83SAl Viro 		err ? v.iov_len : 0;
1513d879cb83SAl Viro 	}), ({
1514d879cb83SAl Viro 		char *p = kmap_atomic(v.bv_page);
1515f9152895SAl Viro 		sum = csum_and_memcpy(p + v.bv_offset,
1516f9152895SAl Viro 				      (from += v.bv_len) - v.bv_len,
1517f9152895SAl Viro 				      v.bv_len, sum, off);
1518d879cb83SAl Viro 		kunmap_atomic(p);
1519d879cb83SAl Viro 		off += v.bv_len;
1520d879cb83SAl Viro 	}),({
1521f9152895SAl Viro 		sum = csum_and_memcpy(v.iov_base,
1522f9152895SAl Viro 				     (from += v.iov_len) - v.iov_len,
1523f9152895SAl Viro 				     v.iov_len, sum, off);
1524d879cb83SAl Viro 		off += v.iov_len;
1525d879cb83SAl Viro 	})
1526d879cb83SAl Viro 	)
1527d879cb83SAl Viro 	*csum = sum;
1528d879cb83SAl Viro 	return bytes;
1529d879cb83SAl Viro }
1530d879cb83SAl Viro EXPORT_SYMBOL(csum_and_copy_to_iter);
1531d879cb83SAl Viro 
1532d05f4435SSagi Grimberg size_t hash_and_copy_to_iter(const void *addr, size_t bytes, void *hashp,
1533d05f4435SSagi Grimberg 		struct iov_iter *i)
1534d05f4435SSagi Grimberg {
153527fad74aSYueHaibing #ifdef CONFIG_CRYPTO
1536d05f4435SSagi Grimberg 	struct ahash_request *hash = hashp;
1537d05f4435SSagi Grimberg 	struct scatterlist sg;
1538d05f4435SSagi Grimberg 	size_t copied;
1539d05f4435SSagi Grimberg 
1540d05f4435SSagi Grimberg 	copied = copy_to_iter(addr, bytes, i);
1541d05f4435SSagi Grimberg 	sg_init_one(&sg, addr, copied);
1542d05f4435SSagi Grimberg 	ahash_request_set_crypt(hash, &sg, NULL, copied);
1543d05f4435SSagi Grimberg 	crypto_ahash_update(hash);
1544d05f4435SSagi Grimberg 	return copied;
154527fad74aSYueHaibing #else
154627fad74aSYueHaibing 	return 0;
154727fad74aSYueHaibing #endif
1548d05f4435SSagi Grimberg }
1549d05f4435SSagi Grimberg EXPORT_SYMBOL(hash_and_copy_to_iter);
1550d05f4435SSagi Grimberg 
1551d879cb83SAl Viro int iov_iter_npages(const struct iov_iter *i, int maxpages)
1552d879cb83SAl Viro {
1553d879cb83SAl Viro 	size_t size = i->count;
1554d879cb83SAl Viro 	int npages = 0;
1555d879cb83SAl Viro 
1556d879cb83SAl Viro 	if (!size)
1557d879cb83SAl Viro 		return 0;
15589ea9ce04SDavid Howells 	if (unlikely(iov_iter_is_discard(i)))
15599ea9ce04SDavid Howells 		return 0;
1560d879cb83SAl Viro 
156100e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(i))) {
1562241699cdSAl Viro 		struct pipe_inode_info *pipe = i->pipe;
1563241699cdSAl Viro 		size_t off;
1564241699cdSAl Viro 		int idx;
1565241699cdSAl Viro 
1566241699cdSAl Viro 		if (!sanity(i))
1567241699cdSAl Viro 			return 0;
1568241699cdSAl Viro 
1569241699cdSAl Viro 		data_start(i, &idx, &off);
1570241699cdSAl Viro 		/* some of this one + all after this one */
1571241699cdSAl Viro 		npages = ((pipe->curbuf - idx - 1) & (pipe->buffers - 1)) + 1;
1572241699cdSAl Viro 		if (npages >= maxpages)
1573241699cdSAl Viro 			return maxpages;
1574241699cdSAl Viro 	} else iterate_all_kinds(i, size, v, ({
1575d879cb83SAl Viro 		unsigned long p = (unsigned long)v.iov_base;
1576d879cb83SAl Viro 		npages += DIV_ROUND_UP(p + v.iov_len, PAGE_SIZE)
1577d879cb83SAl Viro 			- p / PAGE_SIZE;
1578d879cb83SAl Viro 		if (npages >= maxpages)
1579d879cb83SAl Viro 			return maxpages;
1580d879cb83SAl Viro 	0;}),({
1581d879cb83SAl Viro 		npages++;
1582d879cb83SAl Viro 		if (npages >= maxpages)
1583d879cb83SAl Viro 			return maxpages;
1584d879cb83SAl Viro 	}),({
1585d879cb83SAl Viro 		unsigned long p = (unsigned long)v.iov_base;
1586d879cb83SAl Viro 		npages += DIV_ROUND_UP(p + v.iov_len, PAGE_SIZE)
1587d879cb83SAl Viro 			- p / PAGE_SIZE;
1588d879cb83SAl Viro 		if (npages >= maxpages)
1589d879cb83SAl Viro 			return maxpages;
1590d879cb83SAl Viro 	})
1591d879cb83SAl Viro 	)
1592d879cb83SAl Viro 	return npages;
1593d879cb83SAl Viro }
1594d879cb83SAl Viro EXPORT_SYMBOL(iov_iter_npages);
1595d879cb83SAl Viro 
1596d879cb83SAl Viro const void *dup_iter(struct iov_iter *new, struct iov_iter *old, gfp_t flags)
1597d879cb83SAl Viro {
1598d879cb83SAl Viro 	*new = *old;
159900e23707SDavid Howells 	if (unlikely(iov_iter_is_pipe(new))) {
1600241699cdSAl Viro 		WARN_ON(1);
1601241699cdSAl Viro 		return NULL;
1602241699cdSAl Viro 	}
16039ea9ce04SDavid Howells 	if (unlikely(iov_iter_is_discard(new)))
16049ea9ce04SDavid Howells 		return NULL;
160500e23707SDavid Howells 	if (iov_iter_is_bvec(new))
1606d879cb83SAl Viro 		return new->bvec = kmemdup(new->bvec,
1607d879cb83SAl Viro 				    new->nr_segs * sizeof(struct bio_vec),
1608d879cb83SAl Viro 				    flags);
1609d879cb83SAl Viro 	else
1610d879cb83SAl Viro 		/* iovec and kvec have identical layout */
1611d879cb83SAl Viro 		return new->iov = kmemdup(new->iov,
1612d879cb83SAl Viro 				   new->nr_segs * sizeof(struct iovec),
1613d879cb83SAl Viro 				   flags);
1614d879cb83SAl Viro }
1615d879cb83SAl Viro EXPORT_SYMBOL(dup_iter);
1616bc917be8SAl Viro 
1617ffecee4fSVegard Nossum /**
1618ffecee4fSVegard Nossum  * import_iovec() - Copy an array of &struct iovec from userspace
1619ffecee4fSVegard Nossum  *     into the kernel, check that it is valid, and initialize a new
1620ffecee4fSVegard Nossum  *     &struct iov_iter iterator to access it.
1621ffecee4fSVegard Nossum  *
1622ffecee4fSVegard Nossum  * @type: One of %READ or %WRITE.
1623ffecee4fSVegard Nossum  * @uvector: Pointer to the userspace array.
1624ffecee4fSVegard Nossum  * @nr_segs: Number of elements in userspace array.
1625ffecee4fSVegard Nossum  * @fast_segs: Number of elements in @iov.
1626ffecee4fSVegard Nossum  * @iov: (input and output parameter) Pointer to pointer to (usually small
1627ffecee4fSVegard Nossum  *     on-stack) kernel array.
1628ffecee4fSVegard Nossum  * @i: Pointer to iterator that will be initialized on success.
1629ffecee4fSVegard Nossum  *
1630ffecee4fSVegard Nossum  * If the array pointed to by *@iov is large enough to hold all @nr_segs,
1631ffecee4fSVegard Nossum  * then this function places %NULL in *@iov on return. Otherwise, a new
1632ffecee4fSVegard Nossum  * array will be allocated and the result placed in *@iov. This means that
1633ffecee4fSVegard Nossum  * the caller may call kfree() on *@iov regardless of whether the small
1634ffecee4fSVegard Nossum  * on-stack array was used or not (and regardless of whether this function
1635ffecee4fSVegard Nossum  * returns an error or not).
1636ffecee4fSVegard Nossum  *
1637ffecee4fSVegard Nossum  * Return: 0 on success or negative error code on error.
1638ffecee4fSVegard Nossum  */
1639bc917be8SAl Viro int import_iovec(int type, const struct iovec __user * uvector,
1640bc917be8SAl Viro 		 unsigned nr_segs, unsigned fast_segs,
1641bc917be8SAl Viro 		 struct iovec **iov, struct iov_iter *i)
1642bc917be8SAl Viro {
1643bc917be8SAl Viro 	ssize_t n;
1644bc917be8SAl Viro 	struct iovec *p;
1645bc917be8SAl Viro 	n = rw_copy_check_uvector(type, uvector, nr_segs, fast_segs,
1646bc917be8SAl Viro 				  *iov, &p);
1647bc917be8SAl Viro 	if (n < 0) {
1648bc917be8SAl Viro 		if (p != *iov)
1649bc917be8SAl Viro 			kfree(p);
1650bc917be8SAl Viro 		*iov = NULL;
1651bc917be8SAl Viro 		return n;
1652bc917be8SAl Viro 	}
1653bc917be8SAl Viro 	iov_iter_init(i, type, p, nr_segs, n);
1654bc917be8SAl Viro 	*iov = p == *iov ? NULL : p;
1655bc917be8SAl Viro 	return 0;
1656bc917be8SAl Viro }
1657bc917be8SAl Viro EXPORT_SYMBOL(import_iovec);
1658bc917be8SAl Viro 
1659bc917be8SAl Viro #ifdef CONFIG_COMPAT
1660bc917be8SAl Viro #include <linux/compat.h>
1661bc917be8SAl Viro 
1662bc917be8SAl Viro int compat_import_iovec(int type, const struct compat_iovec __user * uvector,
1663bc917be8SAl Viro 		 unsigned nr_segs, unsigned fast_segs,
1664bc917be8SAl Viro 		 struct iovec **iov, struct iov_iter *i)
1665bc917be8SAl Viro {
1666bc917be8SAl Viro 	ssize_t n;
1667bc917be8SAl Viro 	struct iovec *p;
1668bc917be8SAl Viro 	n = compat_rw_copy_check_uvector(type, uvector, nr_segs, fast_segs,
1669bc917be8SAl Viro 				  *iov, &p);
1670bc917be8SAl Viro 	if (n < 0) {
1671bc917be8SAl Viro 		if (p != *iov)
1672bc917be8SAl Viro 			kfree(p);
1673bc917be8SAl Viro 		*iov = NULL;
1674bc917be8SAl Viro 		return n;
1675bc917be8SAl Viro 	}
1676bc917be8SAl Viro 	iov_iter_init(i, type, p, nr_segs, n);
1677bc917be8SAl Viro 	*iov = p == *iov ? NULL : p;
1678bc917be8SAl Viro 	return 0;
1679bc917be8SAl Viro }
1680bc917be8SAl Viro #endif
1681bc917be8SAl Viro 
1682bc917be8SAl Viro int import_single_range(int rw, void __user *buf, size_t len,
1683bc917be8SAl Viro 		 struct iovec *iov, struct iov_iter *i)
1684bc917be8SAl Viro {
1685bc917be8SAl Viro 	if (len > MAX_RW_COUNT)
1686bc917be8SAl Viro 		len = MAX_RW_COUNT;
168796d4f267SLinus Torvalds 	if (unlikely(!access_ok(buf, len)))
1688bc917be8SAl Viro 		return -EFAULT;
1689bc917be8SAl Viro 
1690bc917be8SAl Viro 	iov->iov_base = buf;
1691bc917be8SAl Viro 	iov->iov_len = len;
1692bc917be8SAl Viro 	iov_iter_init(i, rw, iov, 1, len);
1693bc917be8SAl Viro 	return 0;
1694bc917be8SAl Viro }
1695e1267585SAl Viro EXPORT_SYMBOL(import_single_range);
169609cf698aSAl Viro 
169709cf698aSAl Viro int iov_iter_for_each_range(struct iov_iter *i, size_t bytes,
169809cf698aSAl Viro 			    int (*f)(struct kvec *vec, void *context),
169909cf698aSAl Viro 			    void *context)
170009cf698aSAl Viro {
170109cf698aSAl Viro 	struct kvec w;
170209cf698aSAl Viro 	int err = -EINVAL;
170309cf698aSAl Viro 	if (!bytes)
170409cf698aSAl Viro 		return 0;
170509cf698aSAl Viro 
170609cf698aSAl Viro 	iterate_all_kinds(i, bytes, v, -EINVAL, ({
170709cf698aSAl Viro 		w.iov_base = kmap(v.bv_page) + v.bv_offset;
170809cf698aSAl Viro 		w.iov_len = v.bv_len;
170909cf698aSAl Viro 		err = f(&w, context);
171009cf698aSAl Viro 		kunmap(v.bv_page);
171109cf698aSAl Viro 		err;}), ({
171209cf698aSAl Viro 		w = v;
171309cf698aSAl Viro 		err = f(&w, context);})
171409cf698aSAl Viro 	)
171509cf698aSAl Viro 	return err;
171609cf698aSAl Viro }
171709cf698aSAl Viro EXPORT_SYMBOL(iov_iter_for_each_range);
1718