Blame view

lib/iov_iter.c 40.9 KB
457c89965   Thomas Gleixner   treewide: Add SPD...
1
  // SPDX-License-Identifier: GPL-2.0-only
4f18cd317   Al Viro   take iov_iter stu...
2
  #include <linux/export.h>
2f8b54447   Christoph Hellwig   block,fs: untangl...
3
  #include <linux/bvec.h>
4f18cd317   Al Viro   take iov_iter stu...
4
5
  #include <linux/uio.h>
  #include <linux/pagemap.h>
91f79c43d   Al Viro   new helper: iov_i...
6
7
  #include <linux/slab.h>
  #include <linux/vmalloc.h>
241699cd7   Al Viro   new iov_iter flav...
8
  #include <linux/splice.h>
a604ec7e9   Al Viro   csum_and_copy_......
9
  #include <net/checksum.h>
d05f44355   Sagi Grimberg   iov_iter: introdu...
10
  #include <linux/scatterlist.h>
4f18cd317   Al Viro   take iov_iter stu...
11

241699cd7   Al Viro   new iov_iter flav...
12
  #define PIPE_PARANOIA /* for now */
04a311655   Al Viro   iov_iter.c: macro...
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  #define iterate_iovec(i, n, __v, __p, skip, STEP) {	\
  	size_t left;					\
  	size_t wanted = n;				\
  	__p = i->iov;					\
  	__v.iov_len = min(n, __p->iov_len - skip);	\
  	if (likely(__v.iov_len)) {			\
  		__v.iov_base = __p->iov_base + skip;	\
  		left = (STEP);				\
  		__v.iov_len -= left;			\
  		skip += __v.iov_len;			\
  		n -= __v.iov_len;			\
  	} else {					\
  		left = 0;				\
  	}						\
  	while (unlikely(!left && n)) {			\
  		__p++;					\
  		__v.iov_len = min(n, __p->iov_len);	\
  		if (unlikely(!__v.iov_len))		\
  			continue;			\
  		__v.iov_base = __p->iov_base;		\
  		left = (STEP);				\
  		__v.iov_len -= left;			\
  		skip = __v.iov_len;			\
  		n -= __v.iov_len;			\
  	}						\
  	n = wanted - n;					\
  }
a280455fa   Al Viro   iov_iter.c: handl...
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
  #define iterate_kvec(i, n, __v, __p, skip, STEP) {	\
  	size_t wanted = n;				\
  	__p = i->kvec;					\
  	__v.iov_len = min(n, __p->iov_len - skip);	\
  	if (likely(__v.iov_len)) {			\
  		__v.iov_base = __p->iov_base + skip;	\
  		(void)(STEP);				\
  		skip += __v.iov_len;			\
  		n -= __v.iov_len;			\
  	}						\
  	while (unlikely(n)) {				\
  		__p++;					\
  		__v.iov_len = min(n, __p->iov_len);	\
  		if (unlikely(!__v.iov_len))		\
  			continue;			\
  		__v.iov_base = __p->iov_base;		\
  		(void)(STEP);				\
  		skip = __v.iov_len;			\
  		n -= __v.iov_len;			\
  	}						\
  	n = wanted;					\
  }
1bdc76aea   Ming Lei   iov_iter: use bve...
62
63
64
65
66
67
68
  #define iterate_bvec(i, n, __v, __bi, skip, STEP) {	\
  	struct bvec_iter __start;			\
  	__start.bi_size = n;				\
  	__start.bi_bvec_done = skip;			\
  	__start.bi_idx = 0;				\
  	for_each_bvec(__v, i->bvec, __bi, __start) {	\
  		if (!__v.bv_len)			\
04a311655   Al Viro   iov_iter.c: macro...
69
  			continue;			\
04a311655   Al Viro   iov_iter.c: macro...
70
  		(void)(STEP);				\
04a311655   Al Viro   iov_iter.c: macro...
71
  	}						\
04a311655   Al Viro   iov_iter.c: macro...
72
  }
a280455fa   Al Viro   iov_iter.c: handl...
73
  #define iterate_all_kinds(i, n, v, I, B, K) {			\
33844e665   Al Viro   [iov_iter] fix it...
74
75
76
77
78
79
80
81
82
83
  	if (likely(n)) {					\
  		size_t skip = i->iov_offset;			\
  		if (unlikely(i->type & ITER_BVEC)) {		\
  			struct bio_vec v;			\
  			struct bvec_iter __bi;			\
  			iterate_bvec(i, n, v, __bi, skip, (B))	\
  		} else if (unlikely(i->type & ITER_KVEC)) {	\
  			const struct kvec *kvec;		\
  			struct kvec v;				\
  			iterate_kvec(i, n, v, kvec, skip, (K))	\
9ea9ce042   David Howells   iov_iter: Add I/O...
84
  		} else if (unlikely(i->type & ITER_DISCARD)) {	\
33844e665   Al Viro   [iov_iter] fix it...
85
86
87
88
89
  		} else {					\
  			const struct iovec *iov;		\
  			struct iovec v;				\
  			iterate_iovec(i, n, v, iov, skip, (I))	\
  		}						\
04a311655   Al Viro   iov_iter.c: macro...
90
91
  	}							\
  }
a280455fa   Al Viro   iov_iter.c: handl...
92
  #define iterate_and_advance(i, n, v, I, B, K) {			\
dd254f5a3   Al Viro   fold checks into ...
93
94
  	if (unlikely(i->count < n))				\
  		n = i->count;					\
19f184593   Al Viro   do "fold checks i...
95
  	if (i->count) {						\
dd254f5a3   Al Viro   fold checks into ...
96
97
  		size_t skip = i->iov_offset;			\
  		if (unlikely(i->type & ITER_BVEC)) {		\
1bdc76aea   Ming Lei   iov_iter: use bve...
98
  			const struct bio_vec *bvec = i->bvec;	\
dd254f5a3   Al Viro   fold checks into ...
99
  			struct bio_vec v;			\
1bdc76aea   Ming Lei   iov_iter: use bve...
100
101
102
103
104
  			struct bvec_iter __bi;			\
  			iterate_bvec(i, n, v, __bi, skip, (B))	\
  			i->bvec = __bvec_iter_bvec(i->bvec, __bi);	\
  			i->nr_segs -= i->bvec - bvec;		\
  			skip = __bi.bi_bvec_done;		\
dd254f5a3   Al Viro   fold checks into ...
105
106
107
108
109
110
111
112
113
114
  		} else if (unlikely(i->type & ITER_KVEC)) {	\
  			const struct kvec *kvec;		\
  			struct kvec v;				\
  			iterate_kvec(i, n, v, kvec, skip, (K))	\
  			if (skip == kvec->iov_len) {		\
  				kvec++;				\
  				skip = 0;			\
  			}					\
  			i->nr_segs -= kvec - i->kvec;		\
  			i->kvec = kvec;				\
9ea9ce042   David Howells   iov_iter: Add I/O...
115
116
  		} else if (unlikely(i->type & ITER_DISCARD)) {	\
  			skip += n;				\
dd254f5a3   Al Viro   fold checks into ...
117
118
119
120
121
122
123
124
125
126
  		} else {					\
  			const struct iovec *iov;		\
  			struct iovec v;				\
  			iterate_iovec(i, n, v, iov, skip, (I))	\
  			if (skip == iov->iov_len) {		\
  				iov++;				\
  				skip = 0;			\
  			}					\
  			i->nr_segs -= iov - i->iov;		\
  			i->iov = iov;				\
7ce2a91e5   Al Viro   iov_iter.c: itera...
127
  		}						\
dd254f5a3   Al Viro   fold checks into ...
128
129
  		i->count -= n;					\
  		i->iov_offset = skip;				\
7ce2a91e5   Al Viro   iov_iter.c: itera...
130
  	}							\
7ce2a91e5   Al Viro   iov_iter.c: itera...
131
  }
09fc68dc6   Al Viro   iov_iter: saner c...
132
133
  static int copyout(void __user *to, const void *from, size_t n)
  {
96d4f267e   Linus Torvalds   Remove 'type' arg...
134
  	if (access_ok(to, n)) {
09fc68dc6   Al Viro   iov_iter: saner c...
135
136
137
138
139
140
141
142
  		kasan_check_read(from, n);
  		n = raw_copy_to_user(to, from, n);
  	}
  	return n;
  }
  
  static int copyin(void *to, const void __user *from, size_t n)
  {
96d4f267e   Linus Torvalds   Remove 'type' arg...
143
  	if (access_ok(from, n)) {
09fc68dc6   Al Viro   iov_iter: saner c...
144
145
146
147
148
  		kasan_check_write(to, n);
  		n = raw_copy_from_user(to, from, n);
  	}
  	return n;
  }
62a8067a7   Al Viro   bio_vec-backed io...
149
  static size_t copy_page_to_iter_iovec(struct page *page, size_t offset, size_t bytes,
4f18cd317   Al Viro   take iov_iter stu...
150
151
152
153
154
155
156
157
158
159
160
161
  			 struct iov_iter *i)
  {
  	size_t skip, copy, left, wanted;
  	const struct iovec *iov;
  	char __user *buf;
  	void *kaddr, *from;
  
  	if (unlikely(bytes > i->count))
  		bytes = i->count;
  
  	if (unlikely(!bytes))
  		return 0;
09fc68dc6   Al Viro   iov_iter: saner c...
162
  	might_fault();
4f18cd317   Al Viro   take iov_iter stu...
163
164
165
166
167
  	wanted = bytes;
  	iov = i->iov;
  	skip = i->iov_offset;
  	buf = iov->iov_base + skip;
  	copy = min(bytes, iov->iov_len - skip);
3fa6c5073   Mikulas Patocka   mm: optimize copy...
168
  	if (IS_ENABLED(CONFIG_HIGHMEM) && !fault_in_pages_writeable(buf, copy)) {
4f18cd317   Al Viro   take iov_iter stu...
169
170
171
172
  		kaddr = kmap_atomic(page);
  		from = kaddr + offset;
  
  		/* first chunk, usually the only one */
09fc68dc6   Al Viro   iov_iter: saner c...
173
  		left = copyout(buf, from, copy);
4f18cd317   Al Viro   take iov_iter stu...
174
175
176
177
178
179
180
181
182
  		copy -= left;
  		skip += copy;
  		from += copy;
  		bytes -= copy;
  
  		while (unlikely(!left && bytes)) {
  			iov++;
  			buf = iov->iov_base;
  			copy = min(bytes, iov->iov_len);
09fc68dc6   Al Viro   iov_iter: saner c...
183
  			left = copyout(buf, from, copy);
4f18cd317   Al Viro   take iov_iter stu...
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
  			copy -= left;
  			skip = copy;
  			from += copy;
  			bytes -= copy;
  		}
  		if (likely(!bytes)) {
  			kunmap_atomic(kaddr);
  			goto done;
  		}
  		offset = from - kaddr;
  		buf += copy;
  		kunmap_atomic(kaddr);
  		copy = min(bytes, iov->iov_len - skip);
  	}
  	/* Too bad - revert to non-atomic kmap */
3fa6c5073   Mikulas Patocka   mm: optimize copy...
199

4f18cd317   Al Viro   take iov_iter stu...
200
201
  	kaddr = kmap(page);
  	from = kaddr + offset;
09fc68dc6   Al Viro   iov_iter: saner c...
202
  	left = copyout(buf, from, copy);
4f18cd317   Al Viro   take iov_iter stu...
203
204
205
206
207
208
209
210
  	copy -= left;
  	skip += copy;
  	from += copy;
  	bytes -= copy;
  	while (unlikely(!left && bytes)) {
  		iov++;
  		buf = iov->iov_base;
  		copy = min(bytes, iov->iov_len);
09fc68dc6   Al Viro   iov_iter: saner c...
211
  		left = copyout(buf, from, copy);
4f18cd317   Al Viro   take iov_iter stu...
212
213
214
215
216
217
  		copy -= left;
  		skip = copy;
  		from += copy;
  		bytes -= copy;
  	}
  	kunmap(page);
3fa6c5073   Mikulas Patocka   mm: optimize copy...
218

4f18cd317   Al Viro   take iov_iter stu...
219
  done:
81055e584   Al Viro   optimize copy_pag...
220
221
222
223
  	if (skip == iov->iov_len) {
  		iov++;
  		skip = 0;
  	}
4f18cd317   Al Viro   take iov_iter stu...
224
225
226
227
228
229
  	i->count -= wanted - bytes;
  	i->nr_segs -= iov - i->iov;
  	i->iov = iov;
  	i->iov_offset = skip;
  	return wanted - bytes;
  }
4f18cd317   Al Viro   take iov_iter stu...
230

62a8067a7   Al Viro   bio_vec-backed io...
231
  static size_t copy_page_from_iter_iovec(struct page *page, size_t offset, size_t bytes,
f0d1bec9d   Al Viro   new helper: copy_...
232
233
234
235
236
237
238
239
240
241
242
243
  			 struct iov_iter *i)
  {
  	size_t skip, copy, left, wanted;
  	const struct iovec *iov;
  	char __user *buf;
  	void *kaddr, *to;
  
  	if (unlikely(bytes > i->count))
  		bytes = i->count;
  
  	if (unlikely(!bytes))
  		return 0;
09fc68dc6   Al Viro   iov_iter: saner c...
244
  	might_fault();
f0d1bec9d   Al Viro   new helper: copy_...
245
246
247
248
249
  	wanted = bytes;
  	iov = i->iov;
  	skip = i->iov_offset;
  	buf = iov->iov_base + skip;
  	copy = min(bytes, iov->iov_len - skip);
3fa6c5073   Mikulas Patocka   mm: optimize copy...
250
  	if (IS_ENABLED(CONFIG_HIGHMEM) && !fault_in_pages_readable(buf, copy)) {
f0d1bec9d   Al Viro   new helper: copy_...
251
252
253
254
  		kaddr = kmap_atomic(page);
  		to = kaddr + offset;
  
  		/* first chunk, usually the only one */
09fc68dc6   Al Viro   iov_iter: saner c...
255
  		left = copyin(to, buf, copy);
f0d1bec9d   Al Viro   new helper: copy_...
256
257
258
259
260
261
262
263
264
  		copy -= left;
  		skip += copy;
  		to += copy;
  		bytes -= copy;
  
  		while (unlikely(!left && bytes)) {
  			iov++;
  			buf = iov->iov_base;
  			copy = min(bytes, iov->iov_len);
09fc68dc6   Al Viro   iov_iter: saner c...
265
  			left = copyin(to, buf, copy);
f0d1bec9d   Al Viro   new helper: copy_...
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
  			copy -= left;
  			skip = copy;
  			to += copy;
  			bytes -= copy;
  		}
  		if (likely(!bytes)) {
  			kunmap_atomic(kaddr);
  			goto done;
  		}
  		offset = to - kaddr;
  		buf += copy;
  		kunmap_atomic(kaddr);
  		copy = min(bytes, iov->iov_len - skip);
  	}
  	/* Too bad - revert to non-atomic kmap */
3fa6c5073   Mikulas Patocka   mm: optimize copy...
281

f0d1bec9d   Al Viro   new helper: copy_...
282
283
  	kaddr = kmap(page);
  	to = kaddr + offset;
09fc68dc6   Al Viro   iov_iter: saner c...
284
  	left = copyin(to, buf, copy);
f0d1bec9d   Al Viro   new helper: copy_...
285
286
287
288
289
290
291
292
  	copy -= left;
  	skip += copy;
  	to += copy;
  	bytes -= copy;
  	while (unlikely(!left && bytes)) {
  		iov++;
  		buf = iov->iov_base;
  		copy = min(bytes, iov->iov_len);
09fc68dc6   Al Viro   iov_iter: saner c...
293
  		left = copyin(to, buf, copy);
f0d1bec9d   Al Viro   new helper: copy_...
294
295
296
297
298
299
  		copy -= left;
  		skip = copy;
  		to += copy;
  		bytes -= copy;
  	}
  	kunmap(page);
3fa6c5073   Mikulas Patocka   mm: optimize copy...
300

f0d1bec9d   Al Viro   new helper: copy_...
301
  done:
81055e584   Al Viro   optimize copy_pag...
302
303
304
305
  	if (skip == iov->iov_len) {
  		iov++;
  		skip = 0;
  	}
f0d1bec9d   Al Viro   new helper: copy_...
306
307
308
309
310
311
  	i->count -= wanted - bytes;
  	i->nr_segs -= iov - i->iov;
  	i->iov = iov;
  	i->iov_offset = skip;
  	return wanted - bytes;
  }
f0d1bec9d   Al Viro   new helper: copy_...
312

241699cd7   Al Viro   new iov_iter flav...
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
  #ifdef PIPE_PARANOIA
  static bool sanity(const struct iov_iter *i)
  {
  	struct pipe_inode_info *pipe = i->pipe;
  	int idx = i->idx;
  	int next = pipe->curbuf + pipe->nrbufs;
  	if (i->iov_offset) {
  		struct pipe_buffer *p;
  		if (unlikely(!pipe->nrbufs))
  			goto Bad;	// pipe must be non-empty
  		if (unlikely(idx != ((next - 1) & (pipe->buffers - 1))))
  			goto Bad;	// must be at the last buffer...
  
  		p = &pipe->bufs[idx];
  		if (unlikely(p->offset + p->len != i->iov_offset))
  			goto Bad;	// ... at the end of segment
  	} else {
  		if (idx != (next & (pipe->buffers - 1)))
  			goto Bad;	// must be right after the last buffer
  	}
  	return true;
  Bad:
  	printk(KERN_ERR "idx = %d, offset = %zd
  ", i->idx, i->iov_offset);
  	printk(KERN_ERR "curbuf = %d, nrbufs = %d, buffers = %d
  ",
  			pipe->curbuf, pipe->nrbufs, pipe->buffers);
  	for (idx = 0; idx < pipe->buffers; idx++)
  		printk(KERN_ERR "[%p %p %d %d]
  ",
  			pipe->bufs[idx].ops,
  			pipe->bufs[idx].page,
  			pipe->bufs[idx].offset,
  			pipe->bufs[idx].len);
  	WARN_ON(1);
  	return false;
  }
  #else
  #define sanity(i) true
  #endif
  
  static inline int next_idx(int idx, struct pipe_inode_info *pipe)
  {
  	return (idx + 1) & (pipe->buffers - 1);
  }
  
  static size_t copy_page_to_iter_pipe(struct page *page, size_t offset, size_t bytes,
  			 struct iov_iter *i)
  {
  	struct pipe_inode_info *pipe = i->pipe;
  	struct pipe_buffer *buf;
  	size_t off;
  	int idx;
  
  	if (unlikely(bytes > i->count))
  		bytes = i->count;
  
  	if (unlikely(!bytes))
  		return 0;
  
  	if (!sanity(i))
  		return 0;
  
  	off = i->iov_offset;
  	idx = i->idx;
  	buf = &pipe->bufs[idx];
  	if (off) {
  		if (offset == off && buf->page == page) {
  			/* merge with the last one */
  			buf->len += bytes;
  			i->iov_offset += bytes;
  			goto out;
  		}
  		idx = next_idx(idx, pipe);
  		buf = &pipe->bufs[idx];
  	}
  	if (idx == pipe->curbuf && pipe->nrbufs)
  		return 0;
  	pipe->nrbufs++;
  	buf->ops = &page_cache_pipe_buf_ops;
  	get_page(buf->page = page);
  	buf->offset = offset;
  	buf->len = bytes;
  	i->iov_offset = offset + bytes;
  	i->idx = idx;
  out:
  	i->count -= bytes;
  	return bytes;
  }
4f18cd317   Al Viro   take iov_iter stu...
402
  /*
171a02032   Anton Altaparmakov   VFS: Add iov_iter...
403
404
405
406
407
408
   * Fault in one or more iovecs of the given iov_iter, to a maximum length of
   * bytes.  For each iovec, fault in each page that constitutes the iovec.
   *
   * Return 0 on success, or non-zero if the memory could not be accessed (i.e.
   * because it is an invalid address).
   */
d4690f1e1   Al Viro   fix iov_iter_faul...
409
  int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes)
171a02032   Anton Altaparmakov   VFS: Add iov_iter...
410
411
412
413
414
415
416
417
  {
  	size_t skip = i->iov_offset;
  	const struct iovec *iov;
  	int err;
  	struct iovec v;
  
  	if (!(i->type & (ITER_BVEC|ITER_KVEC))) {
  		iterate_iovec(i, bytes, v, iov, skip, ({
4bce9f6ee   Al Viro   get rid of separa...
418
  			err = fault_in_pages_readable(v.iov_base, v.iov_len);
171a02032   Anton Altaparmakov   VFS: Add iov_iter...
419
420
421
422
423
424
  			if (unlikely(err))
  			return err;
  		0;}))
  	}
  	return 0;
  }
d4690f1e1   Al Viro   fix iov_iter_faul...
425
  EXPORT_SYMBOL(iov_iter_fault_in_readable);
171a02032   Anton Altaparmakov   VFS: Add iov_iter...
426

aa563d7bc   David Howells   iov_iter: Separat...
427
  void iov_iter_init(struct iov_iter *i, unsigned int direction,
71d8e532b   Al Viro   start adding the ...
428
429
430
  			const struct iovec *iov, unsigned long nr_segs,
  			size_t count)
  {
aa563d7bc   David Howells   iov_iter: Separat...
431
432
  	WARN_ON(direction & ~(READ | WRITE));
  	direction &= READ | WRITE;
71d8e532b   Al Viro   start adding the ...
433
  	/* It will get better.  Eventually... */
db68ce10c   Al Viro   new helper: uacce...
434
  	if (uaccess_kernel()) {
aa563d7bc   David Howells   iov_iter: Separat...
435
  		i->type = ITER_KVEC | direction;
a280455fa   Al Viro   iov_iter.c: handl...
436
437
  		i->kvec = (struct kvec *)iov;
  	} else {
aa563d7bc   David Howells   iov_iter: Separat...
438
  		i->type = ITER_IOVEC | direction;
a280455fa   Al Viro   iov_iter.c: handl...
439
440
  		i->iov = iov;
  	}
71d8e532b   Al Viro   start adding the ...
441
442
443
444
445
  	i->nr_segs = nr_segs;
  	i->iov_offset = 0;
  	i->count = count;
  }
  EXPORT_SYMBOL(iov_iter_init);
7b2c99d15   Al Viro   new helper: iov_i...
446

62a8067a7   Al Viro   bio_vec-backed io...
447
448
449
450
451
452
  static void memcpy_from_page(char *to, struct page *page, size_t offset, size_t len)
  {
  	char *from = kmap_atomic(page);
  	memcpy(to, from + offset, len);
  	kunmap_atomic(from);
  }
36f7a8a4c   Al Viro   iov_iter: constif...
453
  static void memcpy_to_page(struct page *page, size_t offset, const char *from, size_t len)
62a8067a7   Al Viro   bio_vec-backed io...
454
455
456
457
458
  {
  	char *to = kmap_atomic(page);
  	memcpy(to + offset, from, len);
  	kunmap_atomic(to);
  }
c35e02480   Matthew Wilcox   Add copy_to_iter(...
459
460
461
462
463
464
  static void memzero_page(struct page *page, size_t offset, size_t len)
  {
  	char *addr = kmap_atomic(page);
  	memset(addr + offset, 0, len);
  	kunmap_atomic(addr);
  }
241699cd7   Al Viro   new iov_iter flav...
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
  static inline bool allocated(struct pipe_buffer *buf)
  {
  	return buf->ops == &default_pipe_buf_ops;
  }
  
  static inline void data_start(const struct iov_iter *i, int *idxp, size_t *offp)
  {
  	size_t off = i->iov_offset;
  	int idx = i->idx;
  	if (off && (!allocated(&i->pipe->bufs[idx]) || off == PAGE_SIZE)) {
  		idx = next_idx(idx, i->pipe);
  		off = 0;
  	}
  	*idxp = idx;
  	*offp = off;
  }
  
  static size_t push_pipe(struct iov_iter *i, size_t size,
  			int *idxp, size_t *offp)
  {
  	struct pipe_inode_info *pipe = i->pipe;
  	size_t off;
  	int idx;
  	ssize_t left;
  
  	if (unlikely(size > i->count))
  		size = i->count;
  	if (unlikely(!size))
  		return 0;
  
  	left = size;
  	data_start(i, &idx, &off);
  	*idxp = idx;
  	*offp = off;
  	if (off) {
  		left -= PAGE_SIZE - off;
  		if (left <= 0) {
  			pipe->bufs[idx].len += size;
  			return size;
  		}
  		pipe->bufs[idx].len = PAGE_SIZE;
  		idx = next_idx(idx, pipe);
  	}
  	while (idx != pipe->curbuf || !pipe->nrbufs) {
  		struct page *page = alloc_page(GFP_USER);
  		if (!page)
  			break;
  		pipe->nrbufs++;
  		pipe->bufs[idx].ops = &default_pipe_buf_ops;
  		pipe->bufs[idx].page = page;
  		pipe->bufs[idx].offset = 0;
  		if (left <= PAGE_SIZE) {
  			pipe->bufs[idx].len = left;
  			return size;
  		}
  		pipe->bufs[idx].len = PAGE_SIZE;
  		left -= PAGE_SIZE;
  		idx = next_idx(idx, pipe);
  	}
  	return size - left;
  }
  
  static size_t copy_pipe_to_iter(const void *addr, size_t bytes,
  				struct iov_iter *i)
  {
  	struct pipe_inode_info *pipe = i->pipe;
  	size_t n, off;
  	int idx;
  
  	if (!sanity(i))
  		return 0;
  
  	bytes = n = push_pipe(i, bytes, &idx, &off);
  	if (unlikely(!n))
  		return 0;
  	for ( ; n; idx = next_idx(idx, pipe), off = 0) {
  		size_t chunk = min_t(size_t, n, PAGE_SIZE - off);
  		memcpy_to_page(pipe->bufs[idx].page, off, addr, chunk);
  		i->idx = idx;
  		i->iov_offset = off + chunk;
  		n -= chunk;
  		addr += chunk;
  	}
  	i->count -= bytes;
  	return bytes;
  }
f91528955   Al Viro   iov_iter: reduce ...
551
552
553
554
555
556
  static __wsum csum_and_memcpy(void *to, const void *from, size_t len,
  			      __wsum sum, size_t off)
  {
  	__wsum next = csum_partial_copy_nocheck(from, to, len, 0);
  	return csum_block_add(sum, next, off);
  }
78e1f3861   Al Viro   iov_iter: teach c...
557
558
559
560
561
562
  static size_t csum_and_copy_to_pipe_iter(const void *addr, size_t bytes,
  				__wsum *csum, struct iov_iter *i)
  {
  	struct pipe_inode_info *pipe = i->pipe;
  	size_t n, r;
  	size_t off = 0;
f91528955   Al Viro   iov_iter: reduce ...
563
  	__wsum sum = *csum;
78e1f3861   Al Viro   iov_iter: teach c...
564
565
566
567
568
569
570
571
572
573
574
  	int idx;
  
  	if (!sanity(i))
  		return 0;
  
  	bytes = n = push_pipe(i, bytes, &idx, &r);
  	if (unlikely(!n))
  		return 0;
  	for ( ; n; idx = next_idx(idx, pipe), r = 0) {
  		size_t chunk = min_t(size_t, n, PAGE_SIZE - r);
  		char *p = kmap_atomic(pipe->bufs[idx].page);
f91528955   Al Viro   iov_iter: reduce ...
575
  		sum = csum_and_memcpy(p + r, addr, chunk, sum, off);
78e1f3861   Al Viro   iov_iter: teach c...
576
577
578
579
580
581
582
583
584
585
586
  		kunmap_atomic(p);
  		i->idx = idx;
  		i->iov_offset = r + chunk;
  		n -= chunk;
  		off += chunk;
  		addr += chunk;
  	}
  	i->count -= bytes;
  	*csum = sum;
  	return bytes;
  }
aa28de275   Al Viro   iov_iter/hardenin...
587
  size_t _copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i)
62a8067a7   Al Viro   bio_vec-backed io...
588
  {
36f7a8a4c   Al Viro   iov_iter: constif...
589
  	const char *from = addr;
00e237074   David Howells   iov_iter: Use acc...
590
  	if (unlikely(iov_iter_is_pipe(i)))
241699cd7   Al Viro   new iov_iter flav...
591
  		return copy_pipe_to_iter(addr, bytes, i);
09fc68dc6   Al Viro   iov_iter: saner c...
592
593
  	if (iter_is_iovec(i))
  		might_fault();
3d4d3e482   Al Viro   iov_iter.c: conve...
594
  	iterate_and_advance(i, bytes, v,
09fc68dc6   Al Viro   iov_iter: saner c...
595
  		copyout(v.iov_base, (from += v.iov_len) - v.iov_len, v.iov_len),
3d4d3e482   Al Viro   iov_iter.c: conve...
596
  		memcpy_to_page(v.bv_page, v.bv_offset,
a280455fa   Al Viro   iov_iter.c: handl...
597
598
  			       (from += v.bv_len) - v.bv_len, v.bv_len),
  		memcpy(v.iov_base, (from += v.iov_len) - v.iov_len, v.iov_len)
3d4d3e482   Al Viro   iov_iter.c: conve...
599
  	)
62a8067a7   Al Viro   bio_vec-backed io...
600

3d4d3e482   Al Viro   iov_iter.c: conve...
601
  	return bytes;
c35e02480   Matthew Wilcox   Add copy_to_iter(...
602
  }
aa28de275   Al Viro   iov_iter/hardenin...
603
  EXPORT_SYMBOL(_copy_to_iter);
c35e02480   Matthew Wilcox   Add copy_to_iter(...
604

8780356ef   Dan Williams   x86/asm/memcpy_mc...
605
606
607
  #ifdef CONFIG_ARCH_HAS_UACCESS_MCSAFE
  static int copyout_mcsafe(void __user *to, const void *from, size_t n)
  {
96d4f267e   Linus Torvalds   Remove 'type' arg...
608
  	if (access_ok(to, n)) {
8780356ef   Dan Williams   x86/asm/memcpy_mc...
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
  		kasan_check_read(from, n);
  		n = copy_to_user_mcsafe((__force void *) to, from, n);
  	}
  	return n;
  }
  
  static unsigned long memcpy_mcsafe_to_page(struct page *page, size_t offset,
  		const char *from, size_t len)
  {
  	unsigned long ret;
  	char *to;
  
  	to = kmap_atomic(page);
  	ret = memcpy_mcsafe(to + offset, from, len);
  	kunmap_atomic(to);
  
  	return ret;
  }
ca146f6f0   Dan Williams   lib/iov_iter: Fix...
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
  static size_t copy_pipe_to_iter_mcsafe(const void *addr, size_t bytes,
  				struct iov_iter *i)
  {
  	struct pipe_inode_info *pipe = i->pipe;
  	size_t n, off, xfer = 0;
  	int idx;
  
  	if (!sanity(i))
  		return 0;
  
  	bytes = n = push_pipe(i, bytes, &idx, &off);
  	if (unlikely(!n))
  		return 0;
  	for ( ; n; idx = next_idx(idx, pipe), off = 0) {
  		size_t chunk = min_t(size_t, n, PAGE_SIZE - off);
  		unsigned long rem;
  
  		rem = memcpy_mcsafe_to_page(pipe->bufs[idx].page, off, addr,
  				chunk);
  		i->idx = idx;
  		i->iov_offset = off + chunk - rem;
  		xfer += chunk - rem;
  		if (rem)
  			break;
  		n -= chunk;
  		addr += chunk;
  	}
  	i->count -= xfer;
  	return xfer;
  }
bf3eeb9b5   Dan Williams   lib/iov_iter: Doc...
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
  /**
   * _copy_to_iter_mcsafe - copy to user with source-read error exception handling
   * @addr: source kernel address
   * @bytes: total transfer length
   * @iter: destination iterator
   *
   * The pmem driver arranges for filesystem-dax to use this facility via
   * dax_copy_to_iter() for protecting read/write to persistent memory.
   * Unless / until an architecture can guarantee identical performance
   * between _copy_to_iter_mcsafe() and _copy_to_iter() it would be a
   * performance regression to switch more users to the mcsafe version.
   *
   * Otherwise, the main differences between this and typical _copy_to_iter().
   *
   * * Typical tail/residue handling after a fault retries the copy
   *   byte-by-byte until the fault happens again. Re-triggering machine
   *   checks is potentially fatal so the implementation uses source
   *   alignment and poison alignment assumptions to avoid re-triggering
   *   hardware exceptions.
   *
   * * ITER_KVEC, ITER_PIPE, and ITER_BVEC can return short copies.
   *   Compare to copy_to_iter() where only ITER_IOVEC attempts might return
   *   a short copy.
   *
   * See MCSAFE_TEST for self-test.
   */
8780356ef   Dan Williams   x86/asm/memcpy_mc...
683
684
685
686
  size_t _copy_to_iter_mcsafe(const void *addr, size_t bytes, struct iov_iter *i)
  {
  	const char *from = addr;
  	unsigned long rem, curr_addr, s_addr = (unsigned long) addr;
00e237074   David Howells   iov_iter: Use acc...
687
  	if (unlikely(iov_iter_is_pipe(i)))
ca146f6f0   Dan Williams   lib/iov_iter: Fix...
688
  		return copy_pipe_to_iter_mcsafe(addr, bytes, i);
8780356ef   Dan Williams   x86/asm/memcpy_mc...
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
  	if (iter_is_iovec(i))
  		might_fault();
  	iterate_and_advance(i, bytes, v,
  		copyout_mcsafe(v.iov_base, (from += v.iov_len) - v.iov_len, v.iov_len),
  		({
  		rem = memcpy_mcsafe_to_page(v.bv_page, v.bv_offset,
                                 (from += v.bv_len) - v.bv_len, v.bv_len);
  		if (rem) {
  			curr_addr = (unsigned long) from;
  			bytes = curr_addr - s_addr - rem;
  			return bytes;
  		}
  		}),
  		({
  		rem = memcpy_mcsafe(v.iov_base, (from += v.iov_len) - v.iov_len,
  				v.iov_len);
  		if (rem) {
  			curr_addr = (unsigned long) from;
  			bytes = curr_addr - s_addr - rem;
  			return bytes;
  		}
  		})
  	)
  
  	return bytes;
  }
  EXPORT_SYMBOL_GPL(_copy_to_iter_mcsafe);
  #endif /* CONFIG_ARCH_HAS_UACCESS_MCSAFE */
aa28de275   Al Viro   iov_iter/hardenin...
717
  size_t _copy_from_iter(void *addr, size_t bytes, struct iov_iter *i)
c35e02480   Matthew Wilcox   Add copy_to_iter(...
718
  {
0dbca9a4b   Al Viro   iov_iter.c: conve...
719
  	char *to = addr;
00e237074   David Howells   iov_iter: Use acc...
720
  	if (unlikely(iov_iter_is_pipe(i))) {
241699cd7   Al Viro   new iov_iter flav...
721
722
723
  		WARN_ON(1);
  		return 0;
  	}
09fc68dc6   Al Viro   iov_iter: saner c...
724
725
  	if (iter_is_iovec(i))
  		might_fault();
0dbca9a4b   Al Viro   iov_iter.c: conve...
726
  	iterate_and_advance(i, bytes, v,
09fc68dc6   Al Viro   iov_iter: saner c...
727
  		copyin((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len),
0dbca9a4b   Al Viro   iov_iter.c: conve...
728
  		memcpy_from_page((to += v.bv_len) - v.bv_len, v.bv_page,
a280455fa   Al Viro   iov_iter.c: handl...
729
730
  				 v.bv_offset, v.bv_len),
  		memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len)
0dbca9a4b   Al Viro   iov_iter.c: conve...
731
732
733
  	)
  
  	return bytes;
c35e02480   Matthew Wilcox   Add copy_to_iter(...
734
  }
aa28de275   Al Viro   iov_iter/hardenin...
735
  EXPORT_SYMBOL(_copy_from_iter);
c35e02480   Matthew Wilcox   Add copy_to_iter(...
736

aa28de275   Al Viro   iov_iter/hardenin...
737
  bool _copy_from_iter_full(void *addr, size_t bytes, struct iov_iter *i)
cbbd26b8b   Al Viro   [iov_iter] new pr...
738
739
  {
  	char *to = addr;
00e237074   David Howells   iov_iter: Use acc...
740
  	if (unlikely(iov_iter_is_pipe(i))) {
cbbd26b8b   Al Viro   [iov_iter] new pr...
741
742
743
  		WARN_ON(1);
  		return false;
  	}
33844e665   Al Viro   [iov_iter] fix it...
744
  	if (unlikely(i->count < bytes))
cbbd26b8b   Al Viro   [iov_iter] new pr...
745
  		return false;
09fc68dc6   Al Viro   iov_iter: saner c...
746
747
  	if (iter_is_iovec(i))
  		might_fault();
cbbd26b8b   Al Viro   [iov_iter] new pr...
748
  	iterate_all_kinds(i, bytes, v, ({
09fc68dc6   Al Viro   iov_iter: saner c...
749
  		if (copyin((to += v.iov_len) - v.iov_len,
cbbd26b8b   Al Viro   [iov_iter] new pr...
750
751
752
753
754
755
756
757
758
759
760
  				      v.iov_base, v.iov_len))
  			return false;
  		0;}),
  		memcpy_from_page((to += v.bv_len) - v.bv_len, v.bv_page,
  				 v.bv_offset, v.bv_len),
  		memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len)
  	)
  
  	iov_iter_advance(i, bytes);
  	return true;
  }
aa28de275   Al Viro   iov_iter/hardenin...
761
  EXPORT_SYMBOL(_copy_from_iter_full);
cbbd26b8b   Al Viro   [iov_iter] new pr...
762

aa28de275   Al Viro   iov_iter/hardenin...
763
  size_t _copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i)
aa583096d   Al Viro   copy_from_iter_no...
764
765
  {
  	char *to = addr;
00e237074   David Howells   iov_iter: Use acc...
766
  	if (unlikely(iov_iter_is_pipe(i))) {
241699cd7   Al Viro   new iov_iter flav...
767
768
769
  		WARN_ON(1);
  		return 0;
  	}
aa583096d   Al Viro   copy_from_iter_no...
770
  	iterate_and_advance(i, bytes, v,
3f763453e   Al Viro   kill __copy_from_...
771
  		__copy_from_user_inatomic_nocache((to += v.iov_len) - v.iov_len,
aa583096d   Al Viro   copy_from_iter_no...
772
773
774
775
776
777
778
779
  					 v.iov_base, v.iov_len),
  		memcpy_from_page((to += v.bv_len) - v.bv_len, v.bv_page,
  				 v.bv_offset, v.bv_len),
  		memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len)
  	)
  
  	return bytes;
  }
aa28de275   Al Viro   iov_iter/hardenin...
780
  EXPORT_SYMBOL(_copy_from_iter_nocache);
aa583096d   Al Viro   copy_from_iter_no...
781

0aed55af8   Dan Williams   x86, uaccess: int...
782
  #ifdef CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE
abd08d7d2   Dan Williams   lib/iov_iter: Doc...
783
784
785
786
787
788
789
790
791
792
793
794
795
796
  /**
   * _copy_from_iter_flushcache - write destination through cpu cache
   * @addr: destination kernel address
   * @bytes: total transfer length
   * @iter: source iterator
   *
   * The pmem driver arranges for filesystem-dax to use this facility via
   * dax_copy_from_iter() for ensuring that writes to persistent memory
   * are flushed through the CPU cache. It is differentiated from
   * _copy_from_iter_nocache() in that guarantees all data is flushed for
   * all iterator types. The _copy_from_iter_nocache() only attempts to
   * bypass the cache for the ITER_IOVEC case, and on some archs may use
   * instructions that strand dirty-data in the cache.
   */
6a37e9400   Linus Torvalds   Merge branch 'uac...
797
  size_t _copy_from_iter_flushcache(void *addr, size_t bytes, struct iov_iter *i)
0aed55af8   Dan Williams   x86, uaccess: int...
798
799
  {
  	char *to = addr;
00e237074   David Howells   iov_iter: Use acc...
800
  	if (unlikely(iov_iter_is_pipe(i))) {
0aed55af8   Dan Williams   x86, uaccess: int...
801
802
803
804
805
806
807
808
809
810
811
812
813
814
  		WARN_ON(1);
  		return 0;
  	}
  	iterate_and_advance(i, bytes, v,
  		__copy_from_user_flushcache((to += v.iov_len) - v.iov_len,
  					 v.iov_base, v.iov_len),
  		memcpy_page_flushcache((to += v.bv_len) - v.bv_len, v.bv_page,
  				 v.bv_offset, v.bv_len),
  		memcpy_flushcache((to += v.iov_len) - v.iov_len, v.iov_base,
  			v.iov_len)
  	)
  
  	return bytes;
  }
6a37e9400   Linus Torvalds   Merge branch 'uac...
815
  EXPORT_SYMBOL_GPL(_copy_from_iter_flushcache);
0aed55af8   Dan Williams   x86, uaccess: int...
816
  #endif
aa28de275   Al Viro   iov_iter/hardenin...
817
  bool _copy_from_iter_full_nocache(void *addr, size_t bytes, struct iov_iter *i)
cbbd26b8b   Al Viro   [iov_iter] new pr...
818
819
  {
  	char *to = addr;
00e237074   David Howells   iov_iter: Use acc...
820
  	if (unlikely(iov_iter_is_pipe(i))) {
cbbd26b8b   Al Viro   [iov_iter] new pr...
821
822
823
  		WARN_ON(1);
  		return false;
  	}
33844e665   Al Viro   [iov_iter] fix it...
824
  	if (unlikely(i->count < bytes))
cbbd26b8b   Al Viro   [iov_iter] new pr...
825
826
  		return false;
  	iterate_all_kinds(i, bytes, v, ({
3f763453e   Al Viro   kill __copy_from_...
827
  		if (__copy_from_user_inatomic_nocache((to += v.iov_len) - v.iov_len,
cbbd26b8b   Al Viro   [iov_iter] new pr...
828
829
830
831
832
833
834
835
836
837
838
  					     v.iov_base, v.iov_len))
  			return false;
  		0;}),
  		memcpy_from_page((to += v.bv_len) - v.bv_len, v.bv_page,
  				 v.bv_offset, v.bv_len),
  		memcpy((to += v.iov_len) - v.iov_len, v.iov_base, v.iov_len)
  	)
  
  	iov_iter_advance(i, bytes);
  	return true;
  }
aa28de275   Al Viro   iov_iter/hardenin...
839
  EXPORT_SYMBOL(_copy_from_iter_full_nocache);
cbbd26b8b   Al Viro   [iov_iter] new pr...
840

72e809ed8   Al Viro   iov_iter: sanity ...
841
842
  static inline bool page_copy_sane(struct page *page, size_t offset, size_t n)
  {
6daef95b8   Eric Dumazet   iov_iter: optimiz...
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
  	struct page *head;
  	size_t v = n + offset;
  
  	/*
  	 * The general case needs to access the page order in order
  	 * to compute the page size.
  	 * However, we mostly deal with order-0 pages and thus can
  	 * avoid a possible cache line miss for requests that fit all
  	 * page orders.
  	 */
  	if (n <= v && v <= PAGE_SIZE)
  		return true;
  
  	head = compound_head(page);
  	v += (page - head) << PAGE_SHIFT;
a90bcb86a   Petar Penkov   iov_iter: fix pag...
858

a50b854e0   Matthew Wilcox (Oracle)   mm: introduce pag...
859
  	if (likely(n <= v && v <= (page_size(head))))
72e809ed8   Al Viro   iov_iter: sanity ...
860
861
862
863
  		return true;
  	WARN_ON(1);
  	return false;
  }
cbbd26b8b   Al Viro   [iov_iter] new pr...
864

62a8067a7   Al Viro   bio_vec-backed io...
865
866
867
  size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
  			 struct iov_iter *i)
  {
72e809ed8   Al Viro   iov_iter: sanity ...
868
869
  	if (unlikely(!page_copy_sane(page, offset, bytes)))
  		return 0;
d271524a3   Al Viro   iov_iter.c: get r...
870
871
872
873
874
  	if (i->type & (ITER_BVEC|ITER_KVEC)) {
  		void *kaddr = kmap_atomic(page);
  		size_t wanted = copy_to_iter(kaddr + offset, bytes, i);
  		kunmap_atomic(kaddr);
  		return wanted;
9ea9ce042   David Howells   iov_iter: Add I/O...
875
876
877
  	} else if (unlikely(iov_iter_is_discard(i)))
  		return bytes;
  	else if (likely(!iov_iter_is_pipe(i)))
62a8067a7   Al Viro   bio_vec-backed io...
878
  		return copy_page_to_iter_iovec(page, offset, bytes, i);
241699cd7   Al Viro   new iov_iter flav...
879
880
  	else
  		return copy_page_to_iter_pipe(page, offset, bytes, i);
62a8067a7   Al Viro   bio_vec-backed io...
881
882
883
884
885
886
  }
  EXPORT_SYMBOL(copy_page_to_iter);
  
  size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes,
  			 struct iov_iter *i)
  {
72e809ed8   Al Viro   iov_iter: sanity ...
887
888
  	if (unlikely(!page_copy_sane(page, offset, bytes)))
  		return 0;
9ea9ce042   David Howells   iov_iter: Add I/O...
889
  	if (unlikely(iov_iter_is_pipe(i) || iov_iter_is_discard(i))) {
241699cd7   Al Viro   new iov_iter flav...
890
891
892
  		WARN_ON(1);
  		return 0;
  	}
a280455fa   Al Viro   iov_iter.c: handl...
893
  	if (i->type & (ITER_BVEC|ITER_KVEC)) {
d271524a3   Al Viro   iov_iter.c: get r...
894
  		void *kaddr = kmap_atomic(page);
aa28de275   Al Viro   iov_iter/hardenin...
895
  		size_t wanted = _copy_from_iter(kaddr + offset, bytes, i);
d271524a3   Al Viro   iov_iter.c: get r...
896
897
898
  		kunmap_atomic(kaddr);
  		return wanted;
  	} else
62a8067a7   Al Viro   bio_vec-backed io...
899
900
901
  		return copy_page_from_iter_iovec(page, offset, bytes, i);
  }
  EXPORT_SYMBOL(copy_page_from_iter);
241699cd7   Al Viro   new iov_iter flav...
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
  static size_t pipe_zero(size_t bytes, struct iov_iter *i)
  {
  	struct pipe_inode_info *pipe = i->pipe;
  	size_t n, off;
  	int idx;
  
  	if (!sanity(i))
  		return 0;
  
  	bytes = n = push_pipe(i, bytes, &idx, &off);
  	if (unlikely(!n))
  		return 0;
  
  	for ( ; n; idx = next_idx(idx, pipe), off = 0) {
  		size_t chunk = min_t(size_t, n, PAGE_SIZE - off);
  		memzero_page(pipe->bufs[idx].page, off, chunk);
  		i->idx = idx;
  		i->iov_offset = off + chunk;
  		n -= chunk;
  	}
  	i->count -= bytes;
  	return bytes;
  }
c35e02480   Matthew Wilcox   Add copy_to_iter(...
925
926
  size_t iov_iter_zero(size_t bytes, struct iov_iter *i)
  {
00e237074   David Howells   iov_iter: Use acc...
927
  	if (unlikely(iov_iter_is_pipe(i)))
241699cd7   Al Viro   new iov_iter flav...
928
  		return pipe_zero(bytes, i);
8442fa46c   Al Viro   iov_iter.c: conve...
929
  	iterate_and_advance(i, bytes, v,
09fc68dc6   Al Viro   iov_iter: saner c...
930
  		clear_user(v.iov_base, v.iov_len),
a280455fa   Al Viro   iov_iter.c: handl...
931
932
  		memzero_page(v.bv_page, v.bv_offset, v.bv_len),
  		memset(v.iov_base, 0, v.iov_len)
8442fa46c   Al Viro   iov_iter.c: conve...
933
934
935
  	)
  
  	return bytes;
c35e02480   Matthew Wilcox   Add copy_to_iter(...
936
937
  }
  EXPORT_SYMBOL(iov_iter_zero);
62a8067a7   Al Viro   bio_vec-backed io...
938
939
940
  size_t iov_iter_copy_from_user_atomic(struct page *page,
  		struct iov_iter *i, unsigned long offset, size_t bytes)
  {
04a311655   Al Viro   iov_iter.c: macro...
941
  	char *kaddr = kmap_atomic(page), *p = kaddr + offset;
72e809ed8   Al Viro   iov_iter: sanity ...
942
943
944
945
  	if (unlikely(!page_copy_sane(page, offset, bytes))) {
  		kunmap_atomic(kaddr);
  		return 0;
  	}
9ea9ce042   David Howells   iov_iter: Add I/O...
946
  	if (unlikely(iov_iter_is_pipe(i) || iov_iter_is_discard(i))) {
241699cd7   Al Viro   new iov_iter flav...
947
948
949
950
  		kunmap_atomic(kaddr);
  		WARN_ON(1);
  		return 0;
  	}
04a311655   Al Viro   iov_iter.c: macro...
951
  	iterate_all_kinds(i, bytes, v,
09fc68dc6   Al Viro   iov_iter: saner c...
952
  		copyin((p += v.iov_len) - v.iov_len, v.iov_base, v.iov_len),
04a311655   Al Viro   iov_iter.c: macro...
953
  		memcpy_from_page((p += v.bv_len) - v.bv_len, v.bv_page,
a280455fa   Al Viro   iov_iter.c: handl...
954
955
  				 v.bv_offset, v.bv_len),
  		memcpy((p += v.iov_len) - v.iov_len, v.iov_base, v.iov_len)
04a311655   Al Viro   iov_iter.c: macro...
956
957
958
  	)
  	kunmap_atomic(kaddr);
  	return bytes;
62a8067a7   Al Viro   bio_vec-backed io...
959
960
  }
  EXPORT_SYMBOL(iov_iter_copy_from_user_atomic);
b9dc6f65b   Al Viro   fix a fencepost e...
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
  static inline void pipe_truncate(struct iov_iter *i)
  {
  	struct pipe_inode_info *pipe = i->pipe;
  	if (pipe->nrbufs) {
  		size_t off = i->iov_offset;
  		int idx = i->idx;
  		int nrbufs = (idx - pipe->curbuf) & (pipe->buffers - 1);
  		if (off) {
  			pipe->bufs[idx].len = off - pipe->bufs[idx].offset;
  			idx = next_idx(idx, pipe);
  			nrbufs++;
  		}
  		while (pipe->nrbufs > nrbufs) {
  			pipe_buf_release(pipe, &pipe->bufs[idx]);
  			idx = next_idx(idx, pipe);
  			pipe->nrbufs--;
  		}
  	}
  }
241699cd7   Al Viro   new iov_iter flav...
980
981
982
  static void pipe_advance(struct iov_iter *i, size_t size)
  {
  	struct pipe_inode_info *pipe = i->pipe;
241699cd7   Al Viro   new iov_iter flav...
983
984
  	if (unlikely(i->count < size))
  		size = i->count;
241699cd7   Al Viro   new iov_iter flav...
985
  	if (size) {
b9dc6f65b   Al Viro   fix a fencepost e...
986
987
988
  		struct pipe_buffer *buf;
  		size_t off = i->iov_offset, left = size;
  		int idx = i->idx;
241699cd7   Al Viro   new iov_iter flav...
989
  		if (off) /* make it relative to the beginning of buffer */
b9dc6f65b   Al Viro   fix a fencepost e...
990
  			left += off - pipe->bufs[idx].offset;
241699cd7   Al Viro   new iov_iter flav...
991
992
  		while (1) {
  			buf = &pipe->bufs[idx];
b9dc6f65b   Al Viro   fix a fencepost e...
993
  			if (left <= buf->len)
241699cd7   Al Viro   new iov_iter flav...
994
  				break;
b9dc6f65b   Al Viro   fix a fencepost e...
995
  			left -= buf->len;
241699cd7   Al Viro   new iov_iter flav...
996
997
  			idx = next_idx(idx, pipe);
  		}
241699cd7   Al Viro   new iov_iter flav...
998
  		i->idx = idx;
b9dc6f65b   Al Viro   fix a fencepost e...
999
  		i->iov_offset = buf->offset + left;
241699cd7   Al Viro   new iov_iter flav...
1000
  	}
b9dc6f65b   Al Viro   fix a fencepost e...
1001
1002
1003
  	i->count -= size;
  	/* ... and discard everything past that point */
  	pipe_truncate(i);
241699cd7   Al Viro   new iov_iter flav...
1004
  }
62a8067a7   Al Viro   bio_vec-backed io...
1005
1006
  void iov_iter_advance(struct iov_iter *i, size_t size)
  {
00e237074   David Howells   iov_iter: Use acc...
1007
  	if (unlikely(iov_iter_is_pipe(i))) {
241699cd7   Al Viro   new iov_iter flav...
1008
1009
1010
  		pipe_advance(i, size);
  		return;
  	}
9ea9ce042   David Howells   iov_iter: Add I/O...
1011
1012
1013
1014
  	if (unlikely(iov_iter_is_discard(i))) {
  		i->count -= size;
  		return;
  	}
a280455fa   Al Viro   iov_iter.c: handl...
1015
  	iterate_and_advance(i, size, v, 0, 0, 0)
62a8067a7   Al Viro   bio_vec-backed io...
1016
1017
  }
  EXPORT_SYMBOL(iov_iter_advance);
27c0e3748   Al Viro   [iov_iter] new pr...
1018
1019
1020
1021
  void iov_iter_revert(struct iov_iter *i, size_t unroll)
  {
  	if (!unroll)
  		return;
5b47d59af   Al Viro   fix braino in gen...
1022
1023
  	if (WARN_ON(unroll > MAX_RW_COUNT))
  		return;
27c0e3748   Al Viro   [iov_iter] new pr...
1024
  	i->count += unroll;
00e237074   David Howells   iov_iter: Use acc...
1025
  	if (unlikely(iov_iter_is_pipe(i))) {
27c0e3748   Al Viro   [iov_iter] new pr...
1026
1027
1028
1029
1030
1031
  		struct pipe_inode_info *pipe = i->pipe;
  		int idx = i->idx;
  		size_t off = i->iov_offset;
  		while (1) {
  			size_t n = off - pipe->bufs[idx].offset;
  			if (unroll < n) {
4fa55cefe   Al Viro   fix a braino in I...
1032
  				off -= unroll;
27c0e3748   Al Viro   [iov_iter] new pr...
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
  				break;
  			}
  			unroll -= n;
  			if (!unroll && idx == i->start_idx) {
  				off = 0;
  				break;
  			}
  			if (!idx--)
  				idx = pipe->buffers - 1;
  			off = pipe->bufs[idx].offset + pipe->bufs[idx].len;
  		}
  		i->iov_offset = off;
  		i->idx = idx;
  		pipe_truncate(i);
  		return;
  	}
9ea9ce042   David Howells   iov_iter: Add I/O...
1049
1050
  	if (unlikely(iov_iter_is_discard(i)))
  		return;
27c0e3748   Al Viro   [iov_iter] new pr...
1051
1052
1053
1054
1055
  	if (unroll <= i->iov_offset) {
  		i->iov_offset -= unroll;
  		return;
  	}
  	unroll -= i->iov_offset;
00e237074   David Howells   iov_iter: Use acc...
1056
  	if (iov_iter_is_bvec(i)) {
27c0e3748   Al Viro   [iov_iter] new pr...
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
  		const struct bio_vec *bvec = i->bvec;
  		while (1) {
  			size_t n = (--bvec)->bv_len;
  			i->nr_segs++;
  			if (unroll <= n) {
  				i->bvec = bvec;
  				i->iov_offset = n - unroll;
  				return;
  			}
  			unroll -= n;
  		}
  	} else { /* same logics for iovec and kvec */
  		const struct iovec *iov = i->iov;
  		while (1) {
  			size_t n = (--iov)->iov_len;
  			i->nr_segs++;
  			if (unroll <= n) {
  				i->iov = iov;
  				i->iov_offset = n - unroll;
  				return;
  			}
  			unroll -= n;
  		}
  	}
  }
  EXPORT_SYMBOL(iov_iter_revert);
62a8067a7   Al Viro   bio_vec-backed io...
1083
1084
1085
1086
1087
  /*
   * Return the count of just the current iov_iter segment.
   */
  size_t iov_iter_single_seg_count(const struct iov_iter *i)
  {
00e237074   David Howells   iov_iter: Use acc...
1088
  	if (unlikely(iov_iter_is_pipe(i)))
241699cd7   Al Viro   new iov_iter flav...
1089
  		return i->count;	// it is a silly place, anyway
62a8067a7   Al Viro   bio_vec-backed io...
1090
1091
  	if (i->nr_segs == 1)
  		return i->count;
9ea9ce042   David Howells   iov_iter: Add I/O...
1092
1093
  	if (unlikely(iov_iter_is_discard(i)))
  		return i->count;
00e237074   David Howells   iov_iter: Use acc...
1094
  	else if (iov_iter_is_bvec(i))
62a8067a7   Al Viro   bio_vec-backed io...
1095
  		return min(i->count, i->bvec->bv_len - i->iov_offset);
ad0eab929   Paul Mackerras   Fix thinko in iov...
1096
1097
  	else
  		return min(i->count, i->iov->iov_len - i->iov_offset);
62a8067a7   Al Viro   bio_vec-backed io...
1098
1099
  }
  EXPORT_SYMBOL(iov_iter_single_seg_count);
aa563d7bc   David Howells   iov_iter: Separat...
1100
  void iov_iter_kvec(struct iov_iter *i, unsigned int direction,
05afcb77e   Al Viro   new helper: iov_i...
1101
  			const struct kvec *kvec, unsigned long nr_segs,
abb78f875   Al Viro   new helper: iov_i...
1102
1103
  			size_t count)
  {
aa563d7bc   David Howells   iov_iter: Separat...
1104
1105
  	WARN_ON(direction & ~(READ | WRITE));
  	i->type = ITER_KVEC | (direction & (READ | WRITE));
05afcb77e   Al Viro   new helper: iov_i...
1106
  	i->kvec = kvec;
abb78f875   Al Viro   new helper: iov_i...
1107
1108
1109
1110
1111
  	i->nr_segs = nr_segs;
  	i->iov_offset = 0;
  	i->count = count;
  }
  EXPORT_SYMBOL(iov_iter_kvec);
aa563d7bc   David Howells   iov_iter: Separat...
1112
  void iov_iter_bvec(struct iov_iter *i, unsigned int direction,
05afcb77e   Al Viro   new helper: iov_i...
1113
1114
1115
  			const struct bio_vec *bvec, unsigned long nr_segs,
  			size_t count)
  {
aa563d7bc   David Howells   iov_iter: Separat...
1116
1117
  	WARN_ON(direction & ~(READ | WRITE));
  	i->type = ITER_BVEC | (direction & (READ | WRITE));
05afcb77e   Al Viro   new helper: iov_i...
1118
1119
1120
1121
1122
1123
  	i->bvec = bvec;
  	i->nr_segs = nr_segs;
  	i->iov_offset = 0;
  	i->count = count;
  }
  EXPORT_SYMBOL(iov_iter_bvec);
aa563d7bc   David Howells   iov_iter: Separat...
1124
  void iov_iter_pipe(struct iov_iter *i, unsigned int direction,
241699cd7   Al Viro   new iov_iter flav...
1125
1126
1127
  			struct pipe_inode_info *pipe,
  			size_t count)
  {
aa563d7bc   David Howells   iov_iter: Separat...
1128
  	BUG_ON(direction != READ);
b9dc6f65b   Al Viro   fix a fencepost e...
1129
  	WARN_ON(pipe->nrbufs == pipe->buffers);
aa563d7bc   David Howells   iov_iter: Separat...
1130
  	i->type = ITER_PIPE | READ;
241699cd7   Al Viro   new iov_iter flav...
1131
1132
1133
1134
  	i->pipe = pipe;
  	i->idx = (pipe->curbuf + pipe->nrbufs) & (pipe->buffers - 1);
  	i->iov_offset = 0;
  	i->count = count;
27c0e3748   Al Viro   [iov_iter] new pr...
1135
  	i->start_idx = i->idx;
241699cd7   Al Viro   new iov_iter flav...
1136
1137
  }
  EXPORT_SYMBOL(iov_iter_pipe);
9ea9ce042   David Howells   iov_iter: Add I/O...
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
  /**
   * iov_iter_discard - Initialise an I/O iterator that discards data
   * @i: The iterator to initialise.
   * @direction: The direction of the transfer.
   * @count: The size of the I/O buffer in bytes.
   *
   * Set up an I/O iterator that just discards everything that's written to it.
   * It's only available as a READ iterator.
   */
  void iov_iter_discard(struct iov_iter *i, unsigned int direction, size_t count)
  {
  	BUG_ON(direction != READ);
  	i->type = ITER_DISCARD | READ;
  	i->count = count;
  	i->iov_offset = 0;
  }
  EXPORT_SYMBOL(iov_iter_discard);
62a8067a7   Al Viro   bio_vec-backed io...
1155
1156
  unsigned long iov_iter_alignment(const struct iov_iter *i)
  {
04a311655   Al Viro   iov_iter.c: macro...
1157
1158
  	unsigned long res = 0;
  	size_t size = i->count;
00e237074   David Howells   iov_iter: Use acc...
1159
  	if (unlikely(iov_iter_is_pipe(i))) {
33844e665   Al Viro   [iov_iter] fix it...
1160
  		if (size && i->iov_offset && allocated(&i->pipe->bufs[i->idx]))
241699cd7   Al Viro   new iov_iter flav...
1161
1162
1163
  			return size | i->iov_offset;
  		return size;
  	}
04a311655   Al Viro   iov_iter.c: macro...
1164
1165
  	iterate_all_kinds(i, size, v,
  		(res |= (unsigned long)v.iov_base | v.iov_len, 0),
a280455fa   Al Viro   iov_iter.c: handl...
1166
1167
  		res |= v.bv_offset | v.bv_len,
  		res |= (unsigned long)v.iov_base | v.iov_len
04a311655   Al Viro   iov_iter.c: macro...
1168
1169
  	)
  	return res;
62a8067a7   Al Viro   bio_vec-backed io...
1170
1171
  }
  EXPORT_SYMBOL(iov_iter_alignment);
357f435d8   Al Viro   fix the copy vs. ...
1172
1173
  unsigned long iov_iter_gap_alignment(const struct iov_iter *i)
  {
33844e665   Al Viro   [iov_iter] fix it...
1174
  	unsigned long res = 0;
357f435d8   Al Viro   fix the copy vs. ...
1175
  	size_t size = i->count;
357f435d8   Al Viro   fix the copy vs. ...
1176

9ea9ce042   David Howells   iov_iter: Add I/O...
1177
  	if (unlikely(iov_iter_is_pipe(i) || iov_iter_is_discard(i))) {
241699cd7   Al Viro   new iov_iter flav...
1178
1179
1180
  		WARN_ON(1);
  		return ~0U;
  	}
357f435d8   Al Viro   fix the copy vs. ...
1181
1182
1183
1184
1185
1186
1187
1188
  	iterate_all_kinds(i, size, v,
  		(res |= (!res ? 0 : (unsigned long)v.iov_base) |
  			(size != v.iov_len ? size : 0), 0),
  		(res |= (!res ? 0 : (unsigned long)v.bv_offset) |
  			(size != v.bv_len ? size : 0)),
  		(res |= (!res ? 0 : (unsigned long)v.iov_base) |
  			(size != v.iov_len ? size : 0))
  		);
33844e665   Al Viro   [iov_iter] fix it...
1189
  	return res;
357f435d8   Al Viro   fix the copy vs. ...
1190
1191
  }
  EXPORT_SYMBOL(iov_iter_gap_alignment);
e76b63123   Ilya Dryomov   iov_iter: fix ret...
1192
  static inline ssize_t __pipe_get_pages(struct iov_iter *i,
241699cd7   Al Viro   new iov_iter flav...
1193
1194
1195
1196
1197
1198
  				size_t maxsize,
  				struct page **pages,
  				int idx,
  				size_t *start)
  {
  	struct pipe_inode_info *pipe = i->pipe;
1689c73a7   Al Viro   Fix off-by-one in...
1199
  	ssize_t n = push_pipe(i, maxsize, &idx, start);
241699cd7   Al Viro   new iov_iter flav...
1200
1201
1202
1203
1204
  	if (!n)
  		return -EFAULT;
  
  	maxsize = n;
  	n += *start;
1689c73a7   Al Viro   Fix off-by-one in...
1205
  	while (n > 0) {
241699cd7   Al Viro   new iov_iter flav...
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
  		get_page(*pages++ = pipe->bufs[idx].page);
  		idx = next_idx(idx, pipe);
  		n -= PAGE_SIZE;
  	}
  
  	return maxsize;
  }
  
  static ssize_t pipe_get_pages(struct iov_iter *i,
  		   struct page **pages, size_t maxsize, unsigned maxpages,
  		   size_t *start)
  {
  	unsigned npages;
  	size_t capacity;
  	int idx;
33844e665   Al Viro   [iov_iter] fix it...
1221
1222
  	if (!maxsize)
  		return 0;
241699cd7   Al Viro   new iov_iter flav...
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
  	if (!sanity(i))
  		return -EFAULT;
  
  	data_start(i, &idx, start);
  	/* some of this one + all after this one */
  	npages = ((i->pipe->curbuf - idx - 1) & (i->pipe->buffers - 1)) + 1;
  	capacity = min(npages,maxpages) * PAGE_SIZE - *start;
  
  	return __pipe_get_pages(i, min(maxsize, capacity), pages, idx, start);
  }
62a8067a7   Al Viro   bio_vec-backed io...
1233
  ssize_t iov_iter_get_pages(struct iov_iter *i,
2c80929c4   Miklos Szeredi   fuse: honour max_...
1234
  		   struct page **pages, size_t maxsize, unsigned maxpages,
62a8067a7   Al Viro   bio_vec-backed io...
1235
1236
  		   size_t *start)
  {
e5393fae3   Al Viro   iov_iter.c: conve...
1237
1238
  	if (maxsize > i->count)
  		maxsize = i->count;
00e237074   David Howells   iov_iter: Use acc...
1239
  	if (unlikely(iov_iter_is_pipe(i)))
241699cd7   Al Viro   new iov_iter flav...
1240
  		return pipe_get_pages(i, pages, maxsize, maxpages, start);
9ea9ce042   David Howells   iov_iter: Add I/O...
1241
1242
  	if (unlikely(iov_iter_is_discard(i)))
  		return -EFAULT;
e5393fae3   Al Viro   iov_iter.c: conve...
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
  	iterate_all_kinds(i, maxsize, v, ({
  		unsigned long addr = (unsigned long)v.iov_base;
  		size_t len = v.iov_len + (*start = addr & (PAGE_SIZE - 1));
  		int n;
  		int res;
  
  		if (len > maxpages * PAGE_SIZE)
  			len = maxpages * PAGE_SIZE;
  		addr &= ~(PAGE_SIZE - 1);
  		n = DIV_ROUND_UP(len, PAGE_SIZE);
73b0140bf   Ira Weiny   mm/gup: change GU...
1253
1254
1255
  		res = get_user_pages_fast(addr, n,
  				iov_iter_rw(i) != WRITE ?  FOLL_WRITE : 0,
  				pages);
e5393fae3   Al Viro   iov_iter.c: conve...
1256
1257
1258
1259
1260
1261
1262
1263
  		if (unlikely(res < 0))
  			return res;
  		return (res == n ? len : res * PAGE_SIZE) - *start;
  	0;}),({
  		/* can't be more than PAGE_SIZE */
  		*start = v.bv_offset;
  		get_page(*pages = v.bv_page);
  		return v.bv_len;
a280455fa   Al Viro   iov_iter.c: handl...
1264
1265
  	}),({
  		return -EFAULT;
e5393fae3   Al Viro   iov_iter.c: conve...
1266
1267
1268
  	})
  	)
  	return 0;
62a8067a7   Al Viro   bio_vec-backed io...
1269
1270
  }
  EXPORT_SYMBOL(iov_iter_get_pages);
1b17f1f2e   Al Viro   iov_iter.c: conve...
1271
1272
  static struct page **get_pages_array(size_t n)
  {
752ade68c   Michal Hocko   treewide: use kv[...
1273
  	return kvmalloc_array(n, sizeof(struct page *), GFP_KERNEL);
1b17f1f2e   Al Viro   iov_iter.c: conve...
1274
  }
241699cd7   Al Viro   new iov_iter flav...
1275
1276
1277
1278
1279
  static ssize_t pipe_get_pages_alloc(struct iov_iter *i,
  		   struct page ***pages, size_t maxsize,
  		   size_t *start)
  {
  	struct page **p;
d7760d638   Ilya Dryomov   iov_iter: fix mem...
1280
  	ssize_t n;
241699cd7   Al Viro   new iov_iter flav...
1281
1282
  	int idx;
  	int npages;
33844e665   Al Viro   [iov_iter] fix it...
1283
1284
  	if (!maxsize)
  		return 0;
241699cd7   Al Viro   new iov_iter flav...
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
  	if (!sanity(i))
  		return -EFAULT;
  
  	data_start(i, &idx, start);
  	/* some of this one + all after this one */
  	npages = ((i->pipe->curbuf - idx - 1) & (i->pipe->buffers - 1)) + 1;
  	n = npages * PAGE_SIZE - *start;
  	if (maxsize > n)
  		maxsize = n;
  	else
  		npages = DIV_ROUND_UP(maxsize + *start, PAGE_SIZE);
  	p = get_pages_array(npages);
  	if (!p)
  		return -ENOMEM;
  	n = __pipe_get_pages(i, maxsize, p, idx, start);
  	if (n > 0)
  		*pages = p;
  	else
  		kvfree(p);
  	return n;
  }
62a8067a7   Al Viro   bio_vec-backed io...
1306
1307
1308
1309
  ssize_t iov_iter_get_pages_alloc(struct iov_iter *i,
  		   struct page ***pages, size_t maxsize,
  		   size_t *start)
  {
1b17f1f2e   Al Viro   iov_iter.c: conve...
1310
1311
1312
1313
  	struct page **p;
  
  	if (maxsize > i->count)
  		maxsize = i->count;
00e237074   David Howells   iov_iter: Use acc...
1314
  	if (unlikely(iov_iter_is_pipe(i)))
241699cd7   Al Viro   new iov_iter flav...
1315
  		return pipe_get_pages_alloc(i, pages, maxsize, start);
9ea9ce042   David Howells   iov_iter: Add I/O...
1316
1317
  	if (unlikely(iov_iter_is_discard(i)))
  		return -EFAULT;
1b17f1f2e   Al Viro   iov_iter.c: conve...
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
  	iterate_all_kinds(i, maxsize, v, ({
  		unsigned long addr = (unsigned long)v.iov_base;
  		size_t len = v.iov_len + (*start = addr & (PAGE_SIZE - 1));
  		int n;
  		int res;
  
  		addr &= ~(PAGE_SIZE - 1);
  		n = DIV_ROUND_UP(len, PAGE_SIZE);
  		p = get_pages_array(n);
  		if (!p)
  			return -ENOMEM;
73b0140bf   Ira Weiny   mm/gup: change GU...
1329
1330
  		res = get_user_pages_fast(addr, n,
  				iov_iter_rw(i) != WRITE ?  FOLL_WRITE : 0, p);
1b17f1f2e   Al Viro   iov_iter.c: conve...
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
  		if (unlikely(res < 0)) {
  			kvfree(p);
  			return res;
  		}
  		*pages = p;
  		return (res == n ? len : res * PAGE_SIZE) - *start;
  	0;}),({
  		/* can't be more than PAGE_SIZE */
  		*start = v.bv_offset;
  		*pages = p = get_pages_array(1);
  		if (!p)
  			return -ENOMEM;
  		get_page(*p = v.bv_page);
  		return v.bv_len;
a280455fa   Al Viro   iov_iter.c: handl...
1345
1346
  	}),({
  		return -EFAULT;
1b17f1f2e   Al Viro   iov_iter.c: conve...
1347
1348
1349
  	})
  	)
  	return 0;
62a8067a7   Al Viro   bio_vec-backed io...
1350
1351
  }
  EXPORT_SYMBOL(iov_iter_get_pages_alloc);
a604ec7e9   Al Viro   csum_and_copy_......
1352
1353
1354
1355
1356
1357
  size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum,
  			       struct iov_iter *i)
  {
  	char *to = addr;
  	__wsum sum, next;
  	size_t off = 0;
a604ec7e9   Al Viro   csum_and_copy_......
1358
  	sum = *csum;
9ea9ce042   David Howells   iov_iter: Add I/O...
1359
  	if (unlikely(iov_iter_is_pipe(i) || iov_iter_is_discard(i))) {
241699cd7   Al Viro   new iov_iter flav...
1360
1361
1362
  		WARN_ON(1);
  		return 0;
  	}
a604ec7e9   Al Viro   csum_and_copy_......
1363
1364
  	iterate_and_advance(i, bytes, v, ({
  		int err = 0;
cbbd26b8b   Al Viro   [iov_iter] new pr...
1365
  		next = csum_and_copy_from_user(v.iov_base,
a604ec7e9   Al Viro   csum_and_copy_......
1366
1367
1368
1369
1370
1371
1372
1373
1374
  					       (to += v.iov_len) - v.iov_len,
  					       v.iov_len, 0, &err);
  		if (!err) {
  			sum = csum_block_add(sum, next, off);
  			off += v.iov_len;
  		}
  		err ? v.iov_len : 0;
  	}), ({
  		char *p = kmap_atomic(v.bv_page);
f91528955   Al Viro   iov_iter: reduce ...
1375
1376
1377
  		sum = csum_and_memcpy((to += v.bv_len) - v.bv_len,
  				      p + v.bv_offset, v.bv_len,
  				      sum, off);
a604ec7e9   Al Viro   csum_and_copy_......
1378
  		kunmap_atomic(p);
a604ec7e9   Al Viro   csum_and_copy_......
1379
1380
  		off += v.bv_len;
  	}),({
f91528955   Al Viro   iov_iter: reduce ...
1381
1382
1383
  		sum = csum_and_memcpy((to += v.iov_len) - v.iov_len,
  				      v.iov_base, v.iov_len,
  				      sum, off);
a604ec7e9   Al Viro   csum_and_copy_......
1384
1385
1386
1387
1388
1389
1390
  		off += v.iov_len;
  	})
  	)
  	*csum = sum;
  	return bytes;
  }
  EXPORT_SYMBOL(csum_and_copy_from_iter);
cbbd26b8b   Al Viro   [iov_iter] new pr...
1391
1392
1393
1394
1395
1396
1397
  bool csum_and_copy_from_iter_full(void *addr, size_t bytes, __wsum *csum,
  			       struct iov_iter *i)
  {
  	char *to = addr;
  	__wsum sum, next;
  	size_t off = 0;
  	sum = *csum;
9ea9ce042   David Howells   iov_iter: Add I/O...
1398
  	if (unlikely(iov_iter_is_pipe(i) || iov_iter_is_discard(i))) {
cbbd26b8b   Al Viro   [iov_iter] new pr...
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
  		WARN_ON(1);
  		return false;
  	}
  	if (unlikely(i->count < bytes))
  		return false;
  	iterate_all_kinds(i, bytes, v, ({
  		int err = 0;
  		next = csum_and_copy_from_user(v.iov_base,
  					       (to += v.iov_len) - v.iov_len,
  					       v.iov_len, 0, &err);
  		if (err)
  			return false;
  		sum = csum_block_add(sum, next, off);
  		off += v.iov_len;
  		0;
  	}), ({
  		char *p = kmap_atomic(v.bv_page);
f91528955   Al Viro   iov_iter: reduce ...
1416
1417
1418
  		sum = csum_and_memcpy((to += v.bv_len) - v.bv_len,
  				      p + v.bv_offset, v.bv_len,
  				      sum, off);
cbbd26b8b   Al Viro   [iov_iter] new pr...
1419
  		kunmap_atomic(p);
cbbd26b8b   Al Viro   [iov_iter] new pr...
1420
1421
  		off += v.bv_len;
  	}),({
f91528955   Al Viro   iov_iter: reduce ...
1422
1423
1424
  		sum = csum_and_memcpy((to += v.iov_len) - v.iov_len,
  				      v.iov_base, v.iov_len,
  				      sum, off);
cbbd26b8b   Al Viro   [iov_iter] new pr...
1425
1426
1427
1428
1429
1430
1431
1432
  		off += v.iov_len;
  	})
  	)
  	*csum = sum;
  	iov_iter_advance(i, bytes);
  	return true;
  }
  EXPORT_SYMBOL(csum_and_copy_from_iter_full);
cb002d074   Sagi Grimberg   iov_iter: pass vo...
1433
  size_t csum_and_copy_to_iter(const void *addr, size_t bytes, void *csump,
a604ec7e9   Al Viro   csum_and_copy_......
1434
1435
  			     struct iov_iter *i)
  {
36f7a8a4c   Al Viro   iov_iter: constif...
1436
  	const char *from = addr;
cb002d074   Sagi Grimberg   iov_iter: pass vo...
1437
  	__wsum *csum = csump;
a604ec7e9   Al Viro   csum_and_copy_......
1438
1439
  	__wsum sum, next;
  	size_t off = 0;
78e1f3861   Al Viro   iov_iter: teach c...
1440
1441
1442
  
  	if (unlikely(iov_iter_is_pipe(i)))
  		return csum_and_copy_to_pipe_iter(addr, bytes, csum, i);
a604ec7e9   Al Viro   csum_and_copy_......
1443
  	sum = *csum;
78e1f3861   Al Viro   iov_iter: teach c...
1444
  	if (unlikely(iov_iter_is_discard(i))) {
241699cd7   Al Viro   new iov_iter flav...
1445
1446
1447
  		WARN_ON(1);	/* for now */
  		return 0;
  	}
a604ec7e9   Al Viro   csum_and_copy_......
1448
1449
1450
  	iterate_and_advance(i, bytes, v, ({
  		int err = 0;
  		next = csum_and_copy_to_user((from += v.iov_len) - v.iov_len,
cbbd26b8b   Al Viro   [iov_iter] new pr...
1451
  					     v.iov_base,
a604ec7e9   Al Viro   csum_and_copy_......
1452
1453
1454
1455
1456
1457
1458
1459
  					     v.iov_len, 0, &err);
  		if (!err) {
  			sum = csum_block_add(sum, next, off);
  			off += v.iov_len;
  		}
  		err ? v.iov_len : 0;
  	}), ({
  		char *p = kmap_atomic(v.bv_page);
f91528955   Al Viro   iov_iter: reduce ...
1460
1461
1462
  		sum = csum_and_memcpy(p + v.bv_offset,
  				      (from += v.bv_len) - v.bv_len,
  				      v.bv_len, sum, off);
a604ec7e9   Al Viro   csum_and_copy_......
1463
  		kunmap_atomic(p);
a604ec7e9   Al Viro   csum_and_copy_......
1464
1465
  		off += v.bv_len;
  	}),({
f91528955   Al Viro   iov_iter: reduce ...
1466
1467
1468
  		sum = csum_and_memcpy(v.iov_base,
  				     (from += v.iov_len) - v.iov_len,
  				     v.iov_len, sum, off);
a604ec7e9   Al Viro   csum_and_copy_......
1469
1470
1471
1472
1473
1474
1475
  		off += v.iov_len;
  	})
  	)
  	*csum = sum;
  	return bytes;
  }
  EXPORT_SYMBOL(csum_and_copy_to_iter);
d05f44355   Sagi Grimberg   iov_iter: introdu...
1476
1477
1478
  size_t hash_and_copy_to_iter(const void *addr, size_t bytes, void *hashp,
  		struct iov_iter *i)
  {
27fad74a5   YueHaibing   iov_iter: Fix bui...
1479
  #ifdef CONFIG_CRYPTO
d05f44355   Sagi Grimberg   iov_iter: introdu...
1480
1481
1482
1483
1484
1485
1486
1487
1488
  	struct ahash_request *hash = hashp;
  	struct scatterlist sg;
  	size_t copied;
  
  	copied = copy_to_iter(addr, bytes, i);
  	sg_init_one(&sg, addr, copied);
  	ahash_request_set_crypt(hash, &sg, NULL, copied);
  	crypto_ahash_update(hash);
  	return copied;
27fad74a5   YueHaibing   iov_iter: Fix bui...
1489
1490
1491
  #else
  	return 0;
  #endif
d05f44355   Sagi Grimberg   iov_iter: introdu...
1492
1493
  }
  EXPORT_SYMBOL(hash_and_copy_to_iter);
62a8067a7   Al Viro   bio_vec-backed io...
1494
1495
  int iov_iter_npages(const struct iov_iter *i, int maxpages)
  {
e0f2dc406   Al Viro   iov_iter.c: conve...
1496
1497
1498
1499
1500
  	size_t size = i->count;
  	int npages = 0;
  
  	if (!size)
  		return 0;
9ea9ce042   David Howells   iov_iter: Add I/O...
1501
1502
  	if (unlikely(iov_iter_is_discard(i)))
  		return 0;
e0f2dc406   Al Viro   iov_iter.c: conve...
1503

00e237074   David Howells   iov_iter: Use acc...
1504
  	if (unlikely(iov_iter_is_pipe(i))) {
241699cd7   Al Viro   new iov_iter flav...
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
  		struct pipe_inode_info *pipe = i->pipe;
  		size_t off;
  		int idx;
  
  		if (!sanity(i))
  			return 0;
  
  		data_start(i, &idx, &off);
  		/* some of this one + all after this one */
  		npages = ((pipe->curbuf - idx - 1) & (pipe->buffers - 1)) + 1;
  		if (npages >= maxpages)
  			return maxpages;
  	} else iterate_all_kinds(i, size, v, ({
e0f2dc406   Al Viro   iov_iter.c: conve...
1518
1519
1520
1521
1522
1523
1524
1525
1526
  		unsigned long p = (unsigned long)v.iov_base;
  		npages += DIV_ROUND_UP(p + v.iov_len, PAGE_SIZE)
  			- p / PAGE_SIZE;
  		if (npages >= maxpages)
  			return maxpages;
  	0;}),({
  		npages++;
  		if (npages >= maxpages)
  			return maxpages;
a280455fa   Al Viro   iov_iter.c: handl...
1527
1528
1529
1530
1531
1532
  	}),({
  		unsigned long p = (unsigned long)v.iov_base;
  		npages += DIV_ROUND_UP(p + v.iov_len, PAGE_SIZE)
  			- p / PAGE_SIZE;
  		if (npages >= maxpages)
  			return maxpages;
e0f2dc406   Al Viro   iov_iter.c: conve...
1533
1534
1535
  	})
  	)
  	return npages;
62a8067a7   Al Viro   bio_vec-backed io...
1536
  }
f67da30c1   Al Viro   new helper: iov_i...
1537
  EXPORT_SYMBOL(iov_iter_npages);
4b8164b91   Al Viro   new helper: dup_i...
1538
1539
1540
1541
  
  const void *dup_iter(struct iov_iter *new, struct iov_iter *old, gfp_t flags)
  {
  	*new = *old;
00e237074   David Howells   iov_iter: Use acc...
1542
  	if (unlikely(iov_iter_is_pipe(new))) {
241699cd7   Al Viro   new iov_iter flav...
1543
1544
1545
  		WARN_ON(1);
  		return NULL;
  	}
9ea9ce042   David Howells   iov_iter: Add I/O...
1546
1547
  	if (unlikely(iov_iter_is_discard(new)))
  		return NULL;
00e237074   David Howells   iov_iter: Use acc...
1548
  	if (iov_iter_is_bvec(new))
4b8164b91   Al Viro   new helper: dup_i...
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
  		return new->bvec = kmemdup(new->bvec,
  				    new->nr_segs * sizeof(struct bio_vec),
  				    flags);
  	else
  		/* iovec and kvec have identical layout */
  		return new->iov = kmemdup(new->iov,
  				   new->nr_segs * sizeof(struct iovec),
  				   flags);
  }
  EXPORT_SYMBOL(dup_iter);
bc917be81   Al Viro   saner iov_iter in...
1559

ffecee4f2   Vegard Nossum   iov_iter: kernel-...
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
  /**
   * import_iovec() - Copy an array of &struct iovec from userspace
   *     into the kernel, check that it is valid, and initialize a new
   *     &struct iov_iter iterator to access it.
   *
   * @type: One of %READ or %WRITE.
   * @uvector: Pointer to the userspace array.
   * @nr_segs: Number of elements in userspace array.
   * @fast_segs: Number of elements in @iov.
   * @iov: (input and output parameter) Pointer to pointer to (usually small
   *     on-stack) kernel array.
   * @i: Pointer to iterator that will be initialized on success.
   *
   * If the array pointed to by *@iov is large enough to hold all @nr_segs,
   * then this function places %NULL in *@iov on return. Otherwise, a new
   * array will be allocated and the result placed in *@iov. This means that
   * the caller may call kfree() on *@iov regardless of whether the small
   * on-stack array was used or not (and regardless of whether this function
   * returns an error or not).
   *
87e5e6dab   Jens Axboe   uio: make import_...
1580
   * Return: Negative error code on error, bytes imported on success
ffecee4f2   Vegard Nossum   iov_iter: kernel-...
1581
   */
87e5e6dab   Jens Axboe   uio: make import_...
1582
  ssize_t import_iovec(int type, const struct iovec __user * uvector,
bc917be81   Al Viro   saner iov_iter in...
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
  		 unsigned nr_segs, unsigned fast_segs,
  		 struct iovec **iov, struct iov_iter *i)
  {
  	ssize_t n;
  	struct iovec *p;
  	n = rw_copy_check_uvector(type, uvector, nr_segs, fast_segs,
  				  *iov, &p);
  	if (n < 0) {
  		if (p != *iov)
  			kfree(p);
  		*iov = NULL;
  		return n;
  	}
  	iov_iter_init(i, type, p, nr_segs, n);
  	*iov = p == *iov ? NULL : p;
87e5e6dab   Jens Axboe   uio: make import_...
1598
  	return n;
bc917be81   Al Viro   saner iov_iter in...
1599
1600
1601
1602
1603
  }
  EXPORT_SYMBOL(import_iovec);
  
  #ifdef CONFIG_COMPAT
  #include <linux/compat.h>
87e5e6dab   Jens Axboe   uio: make import_...
1604
1605
1606
1607
  ssize_t compat_import_iovec(int type,
  		const struct compat_iovec __user * uvector,
  		unsigned nr_segs, unsigned fast_segs,
  		struct iovec **iov, struct iov_iter *i)
bc917be81   Al Viro   saner iov_iter in...
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
  {
  	ssize_t n;
  	struct iovec *p;
  	n = compat_rw_copy_check_uvector(type, uvector, nr_segs, fast_segs,
  				  *iov, &p);
  	if (n < 0) {
  		if (p != *iov)
  			kfree(p);
  		*iov = NULL;
  		return n;
  	}
  	iov_iter_init(i, type, p, nr_segs, n);
  	*iov = p == *iov ? NULL : p;
87e5e6dab   Jens Axboe   uio: make import_...
1621
  	return n;
bc917be81   Al Viro   saner iov_iter in...
1622
1623
1624
1625
1626
1627
1628
1629
  }
  #endif
  
  int import_single_range(int rw, void __user *buf, size_t len,
  		 struct iovec *iov, struct iov_iter *i)
  {
  	if (len > MAX_RW_COUNT)
  		len = MAX_RW_COUNT;
96d4f267e   Linus Torvalds   Remove 'type' arg...
1630
  	if (unlikely(!access_ok(buf, len)))
bc917be81   Al Viro   saner iov_iter in...
1631
1632
1633
1634
1635
1636
1637
  		return -EFAULT;
  
  	iov->iov_base = buf;
  	iov->iov_len = len;
  	iov_iter_init(i, rw, iov, 1, len);
  	return 0;
  }
e12675853   Al Viro   iov_iter: export ...
1638
  EXPORT_SYMBOL(import_single_range);
09cf698a5   Al Viro   new primitive: io...
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
  
  int iov_iter_for_each_range(struct iov_iter *i, size_t bytes,
  			    int (*f)(struct kvec *vec, void *context),
  			    void *context)
  {
  	struct kvec w;
  	int err = -EINVAL;
  	if (!bytes)
  		return 0;
  
  	iterate_all_kinds(i, bytes, v, -EINVAL, ({
  		w.iov_base = kmap(v.bv_page) + v.bv_offset;
  		w.iov_len = v.bv_len;
  		err = f(&w, context);
  		kunmap(v.bv_page);
  		err;}), ({
  		w = v;
  		err = f(&w, context);})
  	)
  	return err;
  }
  EXPORT_SYMBOL(iov_iter_for_each_range);