1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * linux/fs/read_write.c
4 *
5 * Copyright (C) 1991, 1992 Linus Torvalds
6 */
7
8 #include <linux/slab.h>
9 #include <linux/stat.h>
10 #include <linux/sched/xacct.h>
11 #include <linux/fcntl.h>
12 #include <linux/file.h>
13 #include <linux/uio.h>
14 #include <linux/fsnotify.h>
15 #include <linux/security.h>
16 #include <linux/export.h>
17 #include <linux/syscalls.h>
18 #include <linux/pagemap.h>
19 #include <linux/splice.h>
20 #include <linux/compat.h>
21 #include <linux/mount.h>
22 #include <linux/fs.h>
23 #include "internal.h"
24
25 #include <linux/uaccess.h>
26 #include <asm/unistd.h>
27
28 const struct file_operations generic_ro_fops = {
29 .llseek = generic_file_llseek,
30 .read_iter = generic_file_read_iter,
31 .mmap = generic_file_readonly_mmap,
32 .splice_read = filemap_splice_read,
33 };
34
35 EXPORT_SYMBOL(generic_ro_fops);
36
unsigned_offsets(struct file * file)37 static inline bool unsigned_offsets(struct file *file)
38 {
39 return file->f_op->fop_flags & FOP_UNSIGNED_OFFSET;
40 }
41
42 /**
43 * vfs_setpos_cookie - update the file offset for lseek and reset cookie
44 * @file: file structure in question
45 * @offset: file offset to seek to
46 * @maxsize: maximum file size
47 * @cookie: cookie to reset
48 *
49 * Update the file offset to the value specified by @offset if the given
50 * offset is valid and it is not equal to the current file offset and
51 * reset the specified cookie to indicate that a seek happened.
52 *
53 * Return the specified offset on success and -EINVAL on invalid offset.
54 */
vfs_setpos_cookie(struct file * file,loff_t offset,loff_t maxsize,u64 * cookie)55 static loff_t vfs_setpos_cookie(struct file *file, loff_t offset,
56 loff_t maxsize, u64 *cookie)
57 {
58 if (offset < 0 && !unsigned_offsets(file))
59 return -EINVAL;
60 if (offset > maxsize)
61 return -EINVAL;
62
63 if (offset != file->f_pos) {
64 file->f_pos = offset;
65 if (cookie)
66 *cookie = 0;
67 }
68 return offset;
69 }
70
71 /**
72 * vfs_setpos - update the file offset for lseek
73 * @file: file structure in question
74 * @offset: file offset to seek to
75 * @maxsize: maximum file size
76 *
77 * This is a low-level filesystem helper for updating the file offset to
78 * the value specified by @offset if the given offset is valid and it is
79 * not equal to the current file offset.
80 *
81 * Return the specified offset on success and -EINVAL on invalid offset.
82 */
vfs_setpos(struct file * file,loff_t offset,loff_t maxsize)83 loff_t vfs_setpos(struct file *file, loff_t offset, loff_t maxsize)
84 {
85 return vfs_setpos_cookie(file, offset, maxsize, NULL);
86 }
87 EXPORT_SYMBOL(vfs_setpos);
88
89 /**
90 * must_set_pos - check whether f_pos has to be updated
91 * @file: file to seek on
92 * @offset: offset to use
93 * @whence: type of seek operation
94 * @eof: end of file
95 *
96 * Check whether f_pos needs to be updated and update @offset according
97 * to @whence.
98 *
99 * Return: 0 if f_pos doesn't need to be updated, 1 if f_pos has to be
100 * updated, and negative error code on failure.
101 */
must_set_pos(struct file * file,loff_t * offset,int whence,loff_t eof)102 static int must_set_pos(struct file *file, loff_t *offset, int whence, loff_t eof)
103 {
104 switch (whence) {
105 case SEEK_END:
106 *offset += eof;
107 break;
108 case SEEK_CUR:
109 /*
110 * Here we special-case the lseek(fd, 0, SEEK_CUR)
111 * position-querying operation. Avoid rewriting the "same"
112 * f_pos value back to the file because a concurrent read(),
113 * write() or lseek() might have altered it
114 */
115 if (*offset == 0) {
116 *offset = file->f_pos;
117 return 0;
118 }
119 break;
120 case SEEK_DATA:
121 /*
122 * In the generic case the entire file is data, so as long as
123 * offset isn't at the end of the file then the offset is data.
124 */
125 if ((unsigned long long)*offset >= eof)
126 return -ENXIO;
127 break;
128 case SEEK_HOLE:
129 /*
130 * There is a virtual hole at the end of the file, so as long as
131 * offset isn't i_size or larger, return i_size.
132 */
133 if ((unsigned long long)*offset >= eof)
134 return -ENXIO;
135 *offset = eof;
136 break;
137 }
138
139 return 1;
140 }
141
142 /**
143 * generic_file_llseek_size - generic llseek implementation for regular files
144 * @file: file structure to seek on
145 * @offset: file offset to seek to
146 * @whence: type of seek
147 * @maxsize: max size of this file in file system
148 * @eof: offset used for SEEK_END position
149 *
150 * This is a variant of generic_file_llseek that allows passing in a custom
151 * maximum file size and a custom EOF position, for e.g. hashed directories
152 *
153 * Synchronization:
154 * SEEK_SET and SEEK_END are unsynchronized (but atomic on 64bit platforms)
155 * SEEK_CUR is synchronized against other SEEK_CURs, but not read/writes.
156 * read/writes behave like SEEK_SET against seeks.
157 */
158 loff_t
generic_file_llseek_size(struct file * file,loff_t offset,int whence,loff_t maxsize,loff_t eof)159 generic_file_llseek_size(struct file *file, loff_t offset, int whence,
160 loff_t maxsize, loff_t eof)
161 {
162 int ret;
163
164 ret = must_set_pos(file, &offset, whence, eof);
165 if (ret < 0)
166 return ret;
167 if (ret == 0)
168 return offset;
169
170 if (whence == SEEK_CUR) {
171 /*
172 * f_lock protects against read/modify/write race with
173 * other SEEK_CURs. Note that parallel writes and reads
174 * behave like SEEK_SET.
175 */
176 guard(spinlock)(&file->f_lock);
177 return vfs_setpos(file, file->f_pos + offset, maxsize);
178 }
179
180 return vfs_setpos(file, offset, maxsize);
181 }
182 EXPORT_SYMBOL(generic_file_llseek_size);
183
184 /**
185 * generic_llseek_cookie - versioned llseek implementation
186 * @file: file structure to seek on
187 * @offset: file offset to seek to
188 * @whence: type of seek
189 * @cookie: cookie to update
190 *
191 * See generic_file_llseek for a general description and locking assumptions.
192 *
193 * In contrast to generic_file_llseek, this function also resets a
194 * specified cookie to indicate a seek took place.
195 */
generic_llseek_cookie(struct file * file,loff_t offset,int whence,u64 * cookie)196 loff_t generic_llseek_cookie(struct file *file, loff_t offset, int whence,
197 u64 *cookie)
198 {
199 struct inode *inode = file->f_mapping->host;
200 loff_t maxsize = inode->i_sb->s_maxbytes;
201 loff_t eof = i_size_read(inode);
202 int ret;
203
204 if (WARN_ON_ONCE(!cookie))
205 return -EINVAL;
206
207 /*
208 * Require that this is only used for directories that guarantee
209 * synchronization between readdir and seek so that an update to
210 * @cookie is correctly synchronized with concurrent readdir.
211 */
212 if (WARN_ON_ONCE(!(file->f_mode & FMODE_ATOMIC_POS)))
213 return -EINVAL;
214
215 ret = must_set_pos(file, &offset, whence, eof);
216 if (ret < 0)
217 return ret;
218 if (ret == 0)
219 return offset;
220
221 /* No need to hold f_lock because we know that f_pos_lock is held. */
222 if (whence == SEEK_CUR)
223 return vfs_setpos_cookie(file, file->f_pos + offset, maxsize, cookie);
224
225 return vfs_setpos_cookie(file, offset, maxsize, cookie);
226 }
227 EXPORT_SYMBOL(generic_llseek_cookie);
228
229 /**
230 * generic_file_llseek - generic llseek implementation for regular files
231 * @file: file structure to seek on
232 * @offset: file offset to seek to
233 * @whence: type of seek
234 *
235 * This is a generic implemenation of ->llseek useable for all normal local
236 * filesystems. It just updates the file offset to the value specified by
237 * @offset and @whence.
238 */
generic_file_llseek(struct file * file,loff_t offset,int whence)239 loff_t generic_file_llseek(struct file *file, loff_t offset, int whence)
240 {
241 struct inode *inode = file->f_mapping->host;
242
243 return generic_file_llseek_size(file, offset, whence,
244 inode->i_sb->s_maxbytes,
245 i_size_read(inode));
246 }
247 EXPORT_SYMBOL(generic_file_llseek);
248
249 /**
250 * fixed_size_llseek - llseek implementation for fixed-sized devices
251 * @file: file structure to seek on
252 * @offset: file offset to seek to
253 * @whence: type of seek
254 * @size: size of the file
255 *
256 */
fixed_size_llseek(struct file * file,loff_t offset,int whence,loff_t size)257 loff_t fixed_size_llseek(struct file *file, loff_t offset, int whence, loff_t size)
258 {
259 switch (whence) {
260 case SEEK_SET: case SEEK_CUR: case SEEK_END:
261 return generic_file_llseek_size(file, offset, whence,
262 size, size);
263 default:
264 return -EINVAL;
265 }
266 }
267 EXPORT_SYMBOL(fixed_size_llseek);
268
269 /**
270 * no_seek_end_llseek - llseek implementation for fixed-sized devices
271 * @file: file structure to seek on
272 * @offset: file offset to seek to
273 * @whence: type of seek
274 *
275 */
no_seek_end_llseek(struct file * file,loff_t offset,int whence)276 loff_t no_seek_end_llseek(struct file *file, loff_t offset, int whence)
277 {
278 switch (whence) {
279 case SEEK_SET: case SEEK_CUR:
280 return generic_file_llseek_size(file, offset, whence,
281 OFFSET_MAX, 0);
282 default:
283 return -EINVAL;
284 }
285 }
286 EXPORT_SYMBOL(no_seek_end_llseek);
287
288 /**
289 * no_seek_end_llseek_size - llseek implementation for fixed-sized devices
290 * @file: file structure to seek on
291 * @offset: file offset to seek to
292 * @whence: type of seek
293 * @size: maximal offset allowed
294 *
295 */
no_seek_end_llseek_size(struct file * file,loff_t offset,int whence,loff_t size)296 loff_t no_seek_end_llseek_size(struct file *file, loff_t offset, int whence, loff_t size)
297 {
298 switch (whence) {
299 case SEEK_SET: case SEEK_CUR:
300 return generic_file_llseek_size(file, offset, whence,
301 size, 0);
302 default:
303 return -EINVAL;
304 }
305 }
306 EXPORT_SYMBOL(no_seek_end_llseek_size);
307
308 /**
309 * noop_llseek - No Operation Performed llseek implementation
310 * @file: file structure to seek on
311 * @offset: file offset to seek to
312 * @whence: type of seek
313 *
314 * This is an implementation of ->llseek useable for the rare special case when
315 * userspace expects the seek to succeed but the (device) file is actually not
316 * able to perform the seek. In this case you use noop_llseek() instead of
317 * falling back to the default implementation of ->llseek.
318 */
noop_llseek(struct file * file,loff_t offset,int whence)319 loff_t noop_llseek(struct file *file, loff_t offset, int whence)
320 {
321 return file->f_pos;
322 }
323 EXPORT_SYMBOL(noop_llseek);
324
default_llseek(struct file * file,loff_t offset,int whence)325 loff_t default_llseek(struct file *file, loff_t offset, int whence)
326 {
327 struct inode *inode = file_inode(file);
328 loff_t retval;
329
330 inode_lock(inode);
331 switch (whence) {
332 case SEEK_END:
333 offset += i_size_read(inode);
334 break;
335 case SEEK_CUR:
336 if (offset == 0) {
337 retval = file->f_pos;
338 goto out;
339 }
340 offset += file->f_pos;
341 break;
342 case SEEK_DATA:
343 /*
344 * In the generic case the entire file is data, so as
345 * long as offset isn't at the end of the file then the
346 * offset is data.
347 */
348 if (offset >= inode->i_size) {
349 retval = -ENXIO;
350 goto out;
351 }
352 break;
353 case SEEK_HOLE:
354 /*
355 * There is a virtual hole at the end of the file, so
356 * as long as offset isn't i_size or larger, return
357 * i_size.
358 */
359 if (offset >= inode->i_size) {
360 retval = -ENXIO;
361 goto out;
362 }
363 offset = inode->i_size;
364 break;
365 }
366 retval = -EINVAL;
367 if (offset >= 0 || unsigned_offsets(file)) {
368 if (offset != file->f_pos)
369 file->f_pos = offset;
370 retval = offset;
371 }
372 out:
373 inode_unlock(inode);
374 return retval;
375 }
376 EXPORT_SYMBOL(default_llseek);
377
vfs_llseek(struct file * file,loff_t offset,int whence)378 loff_t vfs_llseek(struct file *file, loff_t offset, int whence)
379 {
380 if (!(file->f_mode & FMODE_LSEEK))
381 return -ESPIPE;
382 return file->f_op->llseek(file, offset, whence);
383 }
384 EXPORT_SYMBOL(vfs_llseek);
385
ksys_lseek(unsigned int fd,off_t offset,unsigned int whence)386 static off_t ksys_lseek(unsigned int fd, off_t offset, unsigned int whence)
387 {
388 off_t retval;
389 struct fd f = fdget_pos(fd);
390 if (!fd_file(f))
391 return -EBADF;
392
393 retval = -EINVAL;
394 if (whence <= SEEK_MAX) {
395 loff_t res = vfs_llseek(fd_file(f), offset, whence);
396 retval = res;
397 if (res != (loff_t)retval)
398 retval = -EOVERFLOW; /* LFS: should only happen on 32 bit platforms */
399 }
400 fdput_pos(f);
401 return retval;
402 }
403
SYSCALL_DEFINE3(lseek,unsigned int,fd,off_t,offset,unsigned int,whence)404 SYSCALL_DEFINE3(lseek, unsigned int, fd, off_t, offset, unsigned int, whence)
405 {
406 return ksys_lseek(fd, offset, whence);
407 }
408
409 #ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE3(lseek,unsigned int,fd,compat_off_t,offset,unsigned int,whence)410 COMPAT_SYSCALL_DEFINE3(lseek, unsigned int, fd, compat_off_t, offset, unsigned int, whence)
411 {
412 return ksys_lseek(fd, offset, whence);
413 }
414 #endif
415
416 #if !defined(CONFIG_64BIT) || defined(CONFIG_COMPAT) || \
417 defined(__ARCH_WANT_SYS_LLSEEK)
SYSCALL_DEFINE5(llseek,unsigned int,fd,unsigned long,offset_high,unsigned long,offset_low,loff_t __user *,result,unsigned int,whence)418 SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high,
419 unsigned long, offset_low, loff_t __user *, result,
420 unsigned int, whence)
421 {
422 int retval;
423 struct fd f = fdget_pos(fd);
424 loff_t offset;
425
426 if (!fd_file(f))
427 return -EBADF;
428
429 retval = -EINVAL;
430 if (whence > SEEK_MAX)
431 goto out_putf;
432
433 offset = vfs_llseek(fd_file(f), ((loff_t) offset_high << 32) | offset_low,
434 whence);
435
436 retval = (int)offset;
437 if (offset >= 0) {
438 retval = -EFAULT;
439 if (!copy_to_user(result, &offset, sizeof(offset)))
440 retval = 0;
441 }
442 out_putf:
443 fdput_pos(f);
444 return retval;
445 }
446 #endif
447
rw_verify_area(int read_write,struct file * file,const loff_t * ppos,size_t count)448 int rw_verify_area(int read_write, struct file *file, const loff_t *ppos, size_t count)
449 {
450 int mask = read_write == READ ? MAY_READ : MAY_WRITE;
451 int ret;
452
453 if (unlikely((ssize_t) count < 0))
454 return -EINVAL;
455
456 if (ppos) {
457 loff_t pos = *ppos;
458
459 if (unlikely(pos < 0)) {
460 if (!unsigned_offsets(file))
461 return -EINVAL;
462 if (count >= -pos) /* both values are in 0..LLONG_MAX */
463 return -EOVERFLOW;
464 } else if (unlikely((loff_t) (pos + count) < 0)) {
465 if (!unsigned_offsets(file))
466 return -EINVAL;
467 }
468 }
469
470 ret = security_file_permission(file, mask);
471 if (ret)
472 return ret;
473
474 return fsnotify_file_area_perm(file, mask, ppos, count);
475 }
476 EXPORT_SYMBOL(rw_verify_area);
477
new_sync_read(struct file * filp,char __user * buf,size_t len,loff_t * ppos)478 static ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
479 {
480 struct kiocb kiocb;
481 struct iov_iter iter;
482 ssize_t ret;
483
484 init_sync_kiocb(&kiocb, filp);
485 kiocb.ki_pos = (ppos ? *ppos : 0);
486 iov_iter_ubuf(&iter, ITER_DEST, buf, len);
487
488 ret = filp->f_op->read_iter(&kiocb, &iter);
489 BUG_ON(ret == -EIOCBQUEUED);
490 if (ppos)
491 *ppos = kiocb.ki_pos;
492 return ret;
493 }
494
warn_unsupported(struct file * file,const char * op)495 static int warn_unsupported(struct file *file, const char *op)
496 {
497 pr_warn_ratelimited(
498 "kernel %s not supported for file %pD4 (pid: %d comm: %.20s)\n",
499 op, file, current->pid, current->comm);
500 return -EINVAL;
501 }
502
__kernel_read(struct file * file,void * buf,size_t count,loff_t * pos)503 ssize_t __kernel_read(struct file *file, void *buf, size_t count, loff_t *pos)
504 {
505 struct kvec iov = {
506 .iov_base = buf,
507 .iov_len = min_t(size_t, count, MAX_RW_COUNT),
508 };
509 struct kiocb kiocb;
510 struct iov_iter iter;
511 ssize_t ret;
512
513 if (WARN_ON_ONCE(!(file->f_mode & FMODE_READ)))
514 return -EINVAL;
515 if (!(file->f_mode & FMODE_CAN_READ))
516 return -EINVAL;
517 /*
518 * Also fail if ->read_iter and ->read are both wired up as that
519 * implies very convoluted semantics.
520 */
521 if (unlikely(!file->f_op->read_iter || file->f_op->read))
522 return warn_unsupported(file, "read");
523
524 init_sync_kiocb(&kiocb, file);
525 kiocb.ki_pos = pos ? *pos : 0;
526 iov_iter_kvec(&iter, ITER_DEST, &iov, 1, iov.iov_len);
527 ret = file->f_op->read_iter(&kiocb, &iter);
528 if (ret > 0) {
529 if (pos)
530 *pos = kiocb.ki_pos;
531 fsnotify_access(file);
532 add_rchar(current, ret);
533 }
534 inc_syscr(current);
535 return ret;
536 }
537
kernel_read(struct file * file,void * buf,size_t count,loff_t * pos)538 ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos)
539 {
540 ssize_t ret;
541
542 ret = rw_verify_area(READ, file, pos, count);
543 if (ret)
544 return ret;
545 return __kernel_read(file, buf, count, pos);
546 }
547 EXPORT_SYMBOL(kernel_read);
548
vfs_read(struct file * file,char __user * buf,size_t count,loff_t * pos)549 ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
550 {
551 ssize_t ret;
552
553 if (!(file->f_mode & FMODE_READ))
554 return -EBADF;
555 if (!(file->f_mode & FMODE_CAN_READ))
556 return -EINVAL;
557 if (unlikely(!access_ok(buf, count)))
558 return -EFAULT;
559
560 ret = rw_verify_area(READ, file, pos, count);
561 if (ret)
562 return ret;
563 if (count > MAX_RW_COUNT)
564 count = MAX_RW_COUNT;
565
566 if (file->f_op->read)
567 ret = file->f_op->read(file, buf, count, pos);
568 else if (file->f_op->read_iter)
569 ret = new_sync_read(file, buf, count, pos);
570 else
571 ret = -EINVAL;
572 if (ret > 0) {
573 fsnotify_access(file);
574 add_rchar(current, ret);
575 }
576 inc_syscr(current);
577 return ret;
578 }
579
new_sync_write(struct file * filp,const char __user * buf,size_t len,loff_t * ppos)580 static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
581 {
582 struct kiocb kiocb;
583 struct iov_iter iter;
584 ssize_t ret;
585
586 init_sync_kiocb(&kiocb, filp);
587 kiocb.ki_pos = (ppos ? *ppos : 0);
588 iov_iter_ubuf(&iter, ITER_SOURCE, (void __user *)buf, len);
589
590 ret = filp->f_op->write_iter(&kiocb, &iter);
591 BUG_ON(ret == -EIOCBQUEUED);
592 if (ret > 0 && ppos)
593 *ppos = kiocb.ki_pos;
594 return ret;
595 }
596
597 /* caller is responsible for file_start_write/file_end_write */
__kernel_write_iter(struct file * file,struct iov_iter * from,loff_t * pos)598 ssize_t __kernel_write_iter(struct file *file, struct iov_iter *from, loff_t *pos)
599 {
600 struct kiocb kiocb;
601 ssize_t ret;
602
603 if (WARN_ON_ONCE(!(file->f_mode & FMODE_WRITE)))
604 return -EBADF;
605 if (!(file->f_mode & FMODE_CAN_WRITE))
606 return -EINVAL;
607 /*
608 * Also fail if ->write_iter and ->write are both wired up as that
609 * implies very convoluted semantics.
610 */
611 if (unlikely(!file->f_op->write_iter || file->f_op->write))
612 return warn_unsupported(file, "write");
613
614 init_sync_kiocb(&kiocb, file);
615 kiocb.ki_pos = pos ? *pos : 0;
616 ret = file->f_op->write_iter(&kiocb, from);
617 if (ret > 0) {
618 if (pos)
619 *pos = kiocb.ki_pos;
620 fsnotify_modify(file);
621 add_wchar(current, ret);
622 }
623 inc_syscw(current);
624 return ret;
625 }
626
627 /* caller is responsible for file_start_write/file_end_write */
__kernel_write(struct file * file,const void * buf,size_t count,loff_t * pos)628 ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t *pos)
629 {
630 struct kvec iov = {
631 .iov_base = (void *)buf,
632 .iov_len = min_t(size_t, count, MAX_RW_COUNT),
633 };
634 struct iov_iter iter;
635 iov_iter_kvec(&iter, ITER_SOURCE, &iov, 1, iov.iov_len);
636 return __kernel_write_iter(file, &iter, pos);
637 }
638 /*
639 * This "EXPORT_SYMBOL_GPL()" is more of a "EXPORT_SYMBOL_DONTUSE()",
640 * but autofs is one of the few internal kernel users that actually
641 * wants this _and_ can be built as a module. So we need to export
642 * this symbol for autofs, even though it really isn't appropriate
643 * for any other kernel modules.
644 */
645 EXPORT_SYMBOL_GPL(__kernel_write);
646
kernel_write(struct file * file,const void * buf,size_t count,loff_t * pos)647 ssize_t kernel_write(struct file *file, const void *buf, size_t count,
648 loff_t *pos)
649 {
650 ssize_t ret;
651
652 ret = rw_verify_area(WRITE, file, pos, count);
653 if (ret)
654 return ret;
655
656 file_start_write(file);
657 ret = __kernel_write(file, buf, count, pos);
658 file_end_write(file);
659 return ret;
660 }
661 EXPORT_SYMBOL(kernel_write);
662
vfs_write(struct file * file,const char __user * buf,size_t count,loff_t * pos)663 ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
664 {
665 ssize_t ret;
666
667 if (!(file->f_mode & FMODE_WRITE))
668 return -EBADF;
669 if (!(file->f_mode & FMODE_CAN_WRITE))
670 return -EINVAL;
671 if (unlikely(!access_ok(buf, count)))
672 return -EFAULT;
673
674 ret = rw_verify_area(WRITE, file, pos, count);
675 if (ret)
676 return ret;
677 if (count > MAX_RW_COUNT)
678 count = MAX_RW_COUNT;
679 file_start_write(file);
680 if (file->f_op->write)
681 ret = file->f_op->write(file, buf, count, pos);
682 else if (file->f_op->write_iter)
683 ret = new_sync_write(file, buf, count, pos);
684 else
685 ret = -EINVAL;
686 if (ret > 0) {
687 fsnotify_modify(file);
688 add_wchar(current, ret);
689 }
690 inc_syscw(current);
691 file_end_write(file);
692 return ret;
693 }
694
695 /* file_ppos returns &file->f_pos or NULL if file is stream */
file_ppos(struct file * file)696 static inline loff_t *file_ppos(struct file *file)
697 {
698 return file->f_mode & FMODE_STREAM ? NULL : &file->f_pos;
699 }
700
ksys_read(unsigned int fd,char __user * buf,size_t count)701 ssize_t ksys_read(unsigned int fd, char __user *buf, size_t count)
702 {
703 struct fd f = fdget_pos(fd);
704 ssize_t ret = -EBADF;
705
706 if (fd_file(f)) {
707 loff_t pos, *ppos = file_ppos(fd_file(f));
708 if (ppos) {
709 pos = *ppos;
710 ppos = &pos;
711 }
712 ret = vfs_read(fd_file(f), buf, count, ppos);
713 if (ret >= 0 && ppos)
714 fd_file(f)->f_pos = pos;
715 fdput_pos(f);
716 }
717 return ret;
718 }
719
SYSCALL_DEFINE3(read,unsigned int,fd,char __user *,buf,size_t,count)720 SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
721 {
722 return ksys_read(fd, buf, count);
723 }
724
ksys_write(unsigned int fd,const char __user * buf,size_t count)725 ssize_t ksys_write(unsigned int fd, const char __user *buf, size_t count)
726 {
727 struct fd f = fdget_pos(fd);
728 ssize_t ret = -EBADF;
729
730 if (fd_file(f)) {
731 loff_t pos, *ppos = file_ppos(fd_file(f));
732 if (ppos) {
733 pos = *ppos;
734 ppos = &pos;
735 }
736 ret = vfs_write(fd_file(f), buf, count, ppos);
737 if (ret >= 0 && ppos)
738 fd_file(f)->f_pos = pos;
739 fdput_pos(f);
740 }
741
742 return ret;
743 }
744
SYSCALL_DEFINE3(write,unsigned int,fd,const char __user *,buf,size_t,count)745 SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
746 size_t, count)
747 {
748 return ksys_write(fd, buf, count);
749 }
750
ksys_pread64(unsigned int fd,char __user * buf,size_t count,loff_t pos)751 ssize_t ksys_pread64(unsigned int fd, char __user *buf, size_t count,
752 loff_t pos)
753 {
754 struct fd f;
755 ssize_t ret = -EBADF;
756
757 if (pos < 0)
758 return -EINVAL;
759
760 f = fdget(fd);
761 if (fd_file(f)) {
762 ret = -ESPIPE;
763 if (fd_file(f)->f_mode & FMODE_PREAD)
764 ret = vfs_read(fd_file(f), buf, count, &pos);
765 fdput(f);
766 }
767
768 return ret;
769 }
770
SYSCALL_DEFINE4(pread64,unsigned int,fd,char __user *,buf,size_t,count,loff_t,pos)771 SYSCALL_DEFINE4(pread64, unsigned int, fd, char __user *, buf,
772 size_t, count, loff_t, pos)
773 {
774 return ksys_pread64(fd, buf, count, pos);
775 }
776
777 #if defined(CONFIG_COMPAT) && defined(__ARCH_WANT_COMPAT_PREAD64)
COMPAT_SYSCALL_DEFINE5(pread64,unsigned int,fd,char __user *,buf,size_t,count,compat_arg_u64_dual (pos))778 COMPAT_SYSCALL_DEFINE5(pread64, unsigned int, fd, char __user *, buf,
779 size_t, count, compat_arg_u64_dual(pos))
780 {
781 return ksys_pread64(fd, buf, count, compat_arg_u64_glue(pos));
782 }
783 #endif
784
ksys_pwrite64(unsigned int fd,const char __user * buf,size_t count,loff_t pos)785 ssize_t ksys_pwrite64(unsigned int fd, const char __user *buf,
786 size_t count, loff_t pos)
787 {
788 struct fd f;
789 ssize_t ret = -EBADF;
790
791 if (pos < 0)
792 return -EINVAL;
793
794 f = fdget(fd);
795 if (fd_file(f)) {
796 ret = -ESPIPE;
797 if (fd_file(f)->f_mode & FMODE_PWRITE)
798 ret = vfs_write(fd_file(f), buf, count, &pos);
799 fdput(f);
800 }
801
802 return ret;
803 }
804
SYSCALL_DEFINE4(pwrite64,unsigned int,fd,const char __user *,buf,size_t,count,loff_t,pos)805 SYSCALL_DEFINE4(pwrite64, unsigned int, fd, const char __user *, buf,
806 size_t, count, loff_t, pos)
807 {
808 return ksys_pwrite64(fd, buf, count, pos);
809 }
810
811 #if defined(CONFIG_COMPAT) && defined(__ARCH_WANT_COMPAT_PWRITE64)
COMPAT_SYSCALL_DEFINE5(pwrite64,unsigned int,fd,const char __user *,buf,size_t,count,compat_arg_u64_dual (pos))812 COMPAT_SYSCALL_DEFINE5(pwrite64, unsigned int, fd, const char __user *, buf,
813 size_t, count, compat_arg_u64_dual(pos))
814 {
815 return ksys_pwrite64(fd, buf, count, compat_arg_u64_glue(pos));
816 }
817 #endif
818
do_iter_readv_writev(struct file * filp,struct iov_iter * iter,loff_t * ppos,int type,rwf_t flags)819 static ssize_t do_iter_readv_writev(struct file *filp, struct iov_iter *iter,
820 loff_t *ppos, int type, rwf_t flags)
821 {
822 struct kiocb kiocb;
823 ssize_t ret;
824
825 init_sync_kiocb(&kiocb, filp);
826 ret = kiocb_set_rw_flags(&kiocb, flags, type);
827 if (ret)
828 return ret;
829 kiocb.ki_pos = (ppos ? *ppos : 0);
830
831 if (type == READ)
832 ret = filp->f_op->read_iter(&kiocb, iter);
833 else
834 ret = filp->f_op->write_iter(&kiocb, iter);
835 BUG_ON(ret == -EIOCBQUEUED);
836 if (ppos)
837 *ppos = kiocb.ki_pos;
838 return ret;
839 }
840
841 /* Do it by hand, with file-ops */
do_loop_readv_writev(struct file * filp,struct iov_iter * iter,loff_t * ppos,int type,rwf_t flags)842 static ssize_t do_loop_readv_writev(struct file *filp, struct iov_iter *iter,
843 loff_t *ppos, int type, rwf_t flags)
844 {
845 ssize_t ret = 0;
846
847 if (flags & ~RWF_HIPRI)
848 return -EOPNOTSUPP;
849
850 while (iov_iter_count(iter)) {
851 ssize_t nr;
852
853 if (type == READ) {
854 nr = filp->f_op->read(filp, iter_iov_addr(iter),
855 iter_iov_len(iter), ppos);
856 } else {
857 nr = filp->f_op->write(filp, iter_iov_addr(iter),
858 iter_iov_len(iter), ppos);
859 }
860
861 if (nr < 0) {
862 if (!ret)
863 ret = nr;
864 break;
865 }
866 ret += nr;
867 if (nr != iter_iov_len(iter))
868 break;
869 iov_iter_advance(iter, nr);
870 }
871
872 return ret;
873 }
874
vfs_iocb_iter_read(struct file * file,struct kiocb * iocb,struct iov_iter * iter)875 ssize_t vfs_iocb_iter_read(struct file *file, struct kiocb *iocb,
876 struct iov_iter *iter)
877 {
878 size_t tot_len;
879 ssize_t ret = 0;
880
881 if (!file->f_op->read_iter)
882 return -EINVAL;
883 if (!(file->f_mode & FMODE_READ))
884 return -EBADF;
885 if (!(file->f_mode & FMODE_CAN_READ))
886 return -EINVAL;
887
888 tot_len = iov_iter_count(iter);
889 if (!tot_len)
890 goto out;
891 ret = rw_verify_area(READ, file, &iocb->ki_pos, tot_len);
892 if (ret < 0)
893 return ret;
894
895 ret = file->f_op->read_iter(iocb, iter);
896 out:
897 if (ret >= 0)
898 fsnotify_access(file);
899 return ret;
900 }
901 EXPORT_SYMBOL(vfs_iocb_iter_read);
902
vfs_iter_read(struct file * file,struct iov_iter * iter,loff_t * ppos,rwf_t flags)903 ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos,
904 rwf_t flags)
905 {
906 size_t tot_len;
907 ssize_t ret = 0;
908
909 if (!file->f_op->read_iter)
910 return -EINVAL;
911 if (!(file->f_mode & FMODE_READ))
912 return -EBADF;
913 if (!(file->f_mode & FMODE_CAN_READ))
914 return -EINVAL;
915
916 tot_len = iov_iter_count(iter);
917 if (!tot_len)
918 goto out;
919 ret = rw_verify_area(READ, file, ppos, tot_len);
920 if (ret < 0)
921 return ret;
922
923 ret = do_iter_readv_writev(file, iter, ppos, READ, flags);
924 out:
925 if (ret >= 0)
926 fsnotify_access(file);
927 return ret;
928 }
929 EXPORT_SYMBOL(vfs_iter_read);
930
931 /*
932 * Caller is responsible for calling kiocb_end_write() on completion
933 * if async iocb was queued.
934 */
vfs_iocb_iter_write(struct file * file,struct kiocb * iocb,struct iov_iter * iter)935 ssize_t vfs_iocb_iter_write(struct file *file, struct kiocb *iocb,
936 struct iov_iter *iter)
937 {
938 size_t tot_len;
939 ssize_t ret = 0;
940
941 if (!file->f_op->write_iter)
942 return -EINVAL;
943 if (!(file->f_mode & FMODE_WRITE))
944 return -EBADF;
945 if (!(file->f_mode & FMODE_CAN_WRITE))
946 return -EINVAL;
947
948 tot_len = iov_iter_count(iter);
949 if (!tot_len)
950 return 0;
951 ret = rw_verify_area(WRITE, file, &iocb->ki_pos, tot_len);
952 if (ret < 0)
953 return ret;
954
955 kiocb_start_write(iocb);
956 ret = file->f_op->write_iter(iocb, iter);
957 if (ret != -EIOCBQUEUED)
958 kiocb_end_write(iocb);
959 if (ret > 0)
960 fsnotify_modify(file);
961
962 return ret;
963 }
964 EXPORT_SYMBOL(vfs_iocb_iter_write);
965
vfs_iter_write(struct file * file,struct iov_iter * iter,loff_t * ppos,rwf_t flags)966 ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos,
967 rwf_t flags)
968 {
969 size_t tot_len;
970 ssize_t ret;
971
972 if (!(file->f_mode & FMODE_WRITE))
973 return -EBADF;
974 if (!(file->f_mode & FMODE_CAN_WRITE))
975 return -EINVAL;
976 if (!file->f_op->write_iter)
977 return -EINVAL;
978
979 tot_len = iov_iter_count(iter);
980 if (!tot_len)
981 return 0;
982
983 ret = rw_verify_area(WRITE, file, ppos, tot_len);
984 if (ret < 0)
985 return ret;
986
987 file_start_write(file);
988 ret = do_iter_readv_writev(file, iter, ppos, WRITE, flags);
989 if (ret > 0)
990 fsnotify_modify(file);
991 file_end_write(file);
992
993 return ret;
994 }
995 EXPORT_SYMBOL(vfs_iter_write);
996
vfs_readv(struct file * file,const struct iovec __user * vec,unsigned long vlen,loff_t * pos,rwf_t flags)997 static ssize_t vfs_readv(struct file *file, const struct iovec __user *vec,
998 unsigned long vlen, loff_t *pos, rwf_t flags)
999 {
1000 struct iovec iovstack[UIO_FASTIOV];
1001 struct iovec *iov = iovstack;
1002 struct iov_iter iter;
1003 size_t tot_len;
1004 ssize_t ret = 0;
1005
1006 if (!(file->f_mode & FMODE_READ))
1007 return -EBADF;
1008 if (!(file->f_mode & FMODE_CAN_READ))
1009 return -EINVAL;
1010
1011 ret = import_iovec(ITER_DEST, vec, vlen, ARRAY_SIZE(iovstack), &iov,
1012 &iter);
1013 if (ret < 0)
1014 return ret;
1015
1016 tot_len = iov_iter_count(&iter);
1017 if (!tot_len)
1018 goto out;
1019
1020 ret = rw_verify_area(READ, file, pos, tot_len);
1021 if (ret < 0)
1022 goto out;
1023
1024 if (file->f_op->read_iter)
1025 ret = do_iter_readv_writev(file, &iter, pos, READ, flags);
1026 else
1027 ret = do_loop_readv_writev(file, &iter, pos, READ, flags);
1028 out:
1029 if (ret >= 0)
1030 fsnotify_access(file);
1031 kfree(iov);
1032 return ret;
1033 }
1034
vfs_writev(struct file * file,const struct iovec __user * vec,unsigned long vlen,loff_t * pos,rwf_t flags)1035 static ssize_t vfs_writev(struct file *file, const struct iovec __user *vec,
1036 unsigned long vlen, loff_t *pos, rwf_t flags)
1037 {
1038 struct iovec iovstack[UIO_FASTIOV];
1039 struct iovec *iov = iovstack;
1040 struct iov_iter iter;
1041 size_t tot_len;
1042 ssize_t ret = 0;
1043
1044 if (!(file->f_mode & FMODE_WRITE))
1045 return -EBADF;
1046 if (!(file->f_mode & FMODE_CAN_WRITE))
1047 return -EINVAL;
1048
1049 ret = import_iovec(ITER_SOURCE, vec, vlen, ARRAY_SIZE(iovstack), &iov,
1050 &iter);
1051 if (ret < 0)
1052 return ret;
1053
1054 tot_len = iov_iter_count(&iter);
1055 if (!tot_len)
1056 goto out;
1057
1058 ret = rw_verify_area(WRITE, file, pos, tot_len);
1059 if (ret < 0)
1060 goto out;
1061
1062 file_start_write(file);
1063 if (file->f_op->write_iter)
1064 ret = do_iter_readv_writev(file, &iter, pos, WRITE, flags);
1065 else
1066 ret = do_loop_readv_writev(file, &iter, pos, WRITE, flags);
1067 if (ret > 0)
1068 fsnotify_modify(file);
1069 file_end_write(file);
1070 out:
1071 kfree(iov);
1072 return ret;
1073 }
1074
do_readv(unsigned long fd,const struct iovec __user * vec,unsigned long vlen,rwf_t flags)1075 static ssize_t do_readv(unsigned long fd, const struct iovec __user *vec,
1076 unsigned long vlen, rwf_t flags)
1077 {
1078 struct fd f = fdget_pos(fd);
1079 ssize_t ret = -EBADF;
1080
1081 if (fd_file(f)) {
1082 loff_t pos, *ppos = file_ppos(fd_file(f));
1083 if (ppos) {
1084 pos = *ppos;
1085 ppos = &pos;
1086 }
1087 ret = vfs_readv(fd_file(f), vec, vlen, ppos, flags);
1088 if (ret >= 0 && ppos)
1089 fd_file(f)->f_pos = pos;
1090 fdput_pos(f);
1091 }
1092
1093 if (ret > 0)
1094 add_rchar(current, ret);
1095 inc_syscr(current);
1096 return ret;
1097 }
1098
do_writev(unsigned long fd,const struct iovec __user * vec,unsigned long vlen,rwf_t flags)1099 static ssize_t do_writev(unsigned long fd, const struct iovec __user *vec,
1100 unsigned long vlen, rwf_t flags)
1101 {
1102 struct fd f = fdget_pos(fd);
1103 ssize_t ret = -EBADF;
1104
1105 if (fd_file(f)) {
1106 loff_t pos, *ppos = file_ppos(fd_file(f));
1107 if (ppos) {
1108 pos = *ppos;
1109 ppos = &pos;
1110 }
1111 ret = vfs_writev(fd_file(f), vec, vlen, ppos, flags);
1112 if (ret >= 0 && ppos)
1113 fd_file(f)->f_pos = pos;
1114 fdput_pos(f);
1115 }
1116
1117 if (ret > 0)
1118 add_wchar(current, ret);
1119 inc_syscw(current);
1120 return ret;
1121 }
1122
pos_from_hilo(unsigned long high,unsigned long low)1123 static inline loff_t pos_from_hilo(unsigned long high, unsigned long low)
1124 {
1125 #define HALF_LONG_BITS (BITS_PER_LONG / 2)
1126 return (((loff_t)high << HALF_LONG_BITS) << HALF_LONG_BITS) | low;
1127 }
1128
do_preadv(unsigned long fd,const struct iovec __user * vec,unsigned long vlen,loff_t pos,rwf_t flags)1129 static ssize_t do_preadv(unsigned long fd, const struct iovec __user *vec,
1130 unsigned long vlen, loff_t pos, rwf_t flags)
1131 {
1132 struct fd f;
1133 ssize_t ret = -EBADF;
1134
1135 if (pos < 0)
1136 return -EINVAL;
1137
1138 f = fdget(fd);
1139 if (fd_file(f)) {
1140 ret = -ESPIPE;
1141 if (fd_file(f)->f_mode & FMODE_PREAD)
1142 ret = vfs_readv(fd_file(f), vec, vlen, &pos, flags);
1143 fdput(f);
1144 }
1145
1146 if (ret > 0)
1147 add_rchar(current, ret);
1148 inc_syscr(current);
1149 return ret;
1150 }
1151
do_pwritev(unsigned long fd,const struct iovec __user * vec,unsigned long vlen,loff_t pos,rwf_t flags)1152 static ssize_t do_pwritev(unsigned long fd, const struct iovec __user *vec,
1153 unsigned long vlen, loff_t pos, rwf_t flags)
1154 {
1155 struct fd f;
1156 ssize_t ret = -EBADF;
1157
1158 if (pos < 0)
1159 return -EINVAL;
1160
1161 f = fdget(fd);
1162 if (fd_file(f)) {
1163 ret = -ESPIPE;
1164 if (fd_file(f)->f_mode & FMODE_PWRITE)
1165 ret = vfs_writev(fd_file(f), vec, vlen, &pos, flags);
1166 fdput(f);
1167 }
1168
1169 if (ret > 0)
1170 add_wchar(current, ret);
1171 inc_syscw(current);
1172 return ret;
1173 }
1174
SYSCALL_DEFINE3(readv,unsigned long,fd,const struct iovec __user *,vec,unsigned long,vlen)1175 SYSCALL_DEFINE3(readv, unsigned long, fd, const struct iovec __user *, vec,
1176 unsigned long, vlen)
1177 {
1178 return do_readv(fd, vec, vlen, 0);
1179 }
1180
SYSCALL_DEFINE3(writev,unsigned long,fd,const struct iovec __user *,vec,unsigned long,vlen)1181 SYSCALL_DEFINE3(writev, unsigned long, fd, const struct iovec __user *, vec,
1182 unsigned long, vlen)
1183 {
1184 return do_writev(fd, vec, vlen, 0);
1185 }
1186
SYSCALL_DEFINE5(preadv,unsigned long,fd,const struct iovec __user *,vec,unsigned long,vlen,unsigned long,pos_l,unsigned long,pos_h)1187 SYSCALL_DEFINE5(preadv, unsigned long, fd, const struct iovec __user *, vec,
1188 unsigned long, vlen, unsigned long, pos_l, unsigned long, pos_h)
1189 {
1190 loff_t pos = pos_from_hilo(pos_h, pos_l);
1191
1192 return do_preadv(fd, vec, vlen, pos, 0);
1193 }
1194
SYSCALL_DEFINE6(preadv2,unsigned long,fd,const struct iovec __user *,vec,unsigned long,vlen,unsigned long,pos_l,unsigned long,pos_h,rwf_t,flags)1195 SYSCALL_DEFINE6(preadv2, unsigned long, fd, const struct iovec __user *, vec,
1196 unsigned long, vlen, unsigned long, pos_l, unsigned long, pos_h,
1197 rwf_t, flags)
1198 {
1199 loff_t pos = pos_from_hilo(pos_h, pos_l);
1200
1201 if (pos == -1)
1202 return do_readv(fd, vec, vlen, flags);
1203
1204 return do_preadv(fd, vec, vlen, pos, flags);
1205 }
1206
SYSCALL_DEFINE5(pwritev,unsigned long,fd,const struct iovec __user *,vec,unsigned long,vlen,unsigned long,pos_l,unsigned long,pos_h)1207 SYSCALL_DEFINE5(pwritev, unsigned long, fd, const struct iovec __user *, vec,
1208 unsigned long, vlen, unsigned long, pos_l, unsigned long, pos_h)
1209 {
1210 loff_t pos = pos_from_hilo(pos_h, pos_l);
1211
1212 return do_pwritev(fd, vec, vlen, pos, 0);
1213 }
1214
SYSCALL_DEFINE6(pwritev2,unsigned long,fd,const struct iovec __user *,vec,unsigned long,vlen,unsigned long,pos_l,unsigned long,pos_h,rwf_t,flags)1215 SYSCALL_DEFINE6(pwritev2, unsigned long, fd, const struct iovec __user *, vec,
1216 unsigned long, vlen, unsigned long, pos_l, unsigned long, pos_h,
1217 rwf_t, flags)
1218 {
1219 loff_t pos = pos_from_hilo(pos_h, pos_l);
1220
1221 if (pos == -1)
1222 return do_writev(fd, vec, vlen, flags);
1223
1224 return do_pwritev(fd, vec, vlen, pos, flags);
1225 }
1226
1227 /*
1228 * Various compat syscalls. Note that they all pretend to take a native
1229 * iovec - import_iovec will properly treat those as compat_iovecs based on
1230 * in_compat_syscall().
1231 */
1232 #ifdef CONFIG_COMPAT
1233 #ifdef __ARCH_WANT_COMPAT_SYS_PREADV64
COMPAT_SYSCALL_DEFINE4(preadv64,unsigned long,fd,const struct iovec __user *,vec,unsigned long,vlen,loff_t,pos)1234 COMPAT_SYSCALL_DEFINE4(preadv64, unsigned long, fd,
1235 const struct iovec __user *, vec,
1236 unsigned long, vlen, loff_t, pos)
1237 {
1238 return do_preadv(fd, vec, vlen, pos, 0);
1239 }
1240 #endif
1241
COMPAT_SYSCALL_DEFINE5(preadv,compat_ulong_t,fd,const struct iovec __user *,vec,compat_ulong_t,vlen,u32,pos_low,u32,pos_high)1242 COMPAT_SYSCALL_DEFINE5(preadv, compat_ulong_t, fd,
1243 const struct iovec __user *, vec,
1244 compat_ulong_t, vlen, u32, pos_low, u32, pos_high)
1245 {
1246 loff_t pos = ((loff_t)pos_high << 32) | pos_low;
1247
1248 return do_preadv(fd, vec, vlen, pos, 0);
1249 }
1250
1251 #ifdef __ARCH_WANT_COMPAT_SYS_PREADV64V2
COMPAT_SYSCALL_DEFINE5(preadv64v2,unsigned long,fd,const struct iovec __user *,vec,unsigned long,vlen,loff_t,pos,rwf_t,flags)1252 COMPAT_SYSCALL_DEFINE5(preadv64v2, unsigned long, fd,
1253 const struct iovec __user *, vec,
1254 unsigned long, vlen, loff_t, pos, rwf_t, flags)
1255 {
1256 if (pos == -1)
1257 return do_readv(fd, vec, vlen, flags);
1258 return do_preadv(fd, vec, vlen, pos, flags);
1259 }
1260 #endif
1261
COMPAT_SYSCALL_DEFINE6(preadv2,compat_ulong_t,fd,const struct iovec __user *,vec,compat_ulong_t,vlen,u32,pos_low,u32,pos_high,rwf_t,flags)1262 COMPAT_SYSCALL_DEFINE6(preadv2, compat_ulong_t, fd,
1263 const struct iovec __user *, vec,
1264 compat_ulong_t, vlen, u32, pos_low, u32, pos_high,
1265 rwf_t, flags)
1266 {
1267 loff_t pos = ((loff_t)pos_high << 32) | pos_low;
1268
1269 if (pos == -1)
1270 return do_readv(fd, vec, vlen, flags);
1271 return do_preadv(fd, vec, vlen, pos, flags);
1272 }
1273
1274 #ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64
COMPAT_SYSCALL_DEFINE4(pwritev64,unsigned long,fd,const struct iovec __user *,vec,unsigned long,vlen,loff_t,pos)1275 COMPAT_SYSCALL_DEFINE4(pwritev64, unsigned long, fd,
1276 const struct iovec __user *, vec,
1277 unsigned long, vlen, loff_t, pos)
1278 {
1279 return do_pwritev(fd, vec, vlen, pos, 0);
1280 }
1281 #endif
1282
COMPAT_SYSCALL_DEFINE5(pwritev,compat_ulong_t,fd,const struct iovec __user *,vec,compat_ulong_t,vlen,u32,pos_low,u32,pos_high)1283 COMPAT_SYSCALL_DEFINE5(pwritev, compat_ulong_t, fd,
1284 const struct iovec __user *,vec,
1285 compat_ulong_t, vlen, u32, pos_low, u32, pos_high)
1286 {
1287 loff_t pos = ((loff_t)pos_high << 32) | pos_low;
1288
1289 return do_pwritev(fd, vec, vlen, pos, 0);
1290 }
1291
1292 #ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64V2
COMPAT_SYSCALL_DEFINE5(pwritev64v2,unsigned long,fd,const struct iovec __user *,vec,unsigned long,vlen,loff_t,pos,rwf_t,flags)1293 COMPAT_SYSCALL_DEFINE5(pwritev64v2, unsigned long, fd,
1294 const struct iovec __user *, vec,
1295 unsigned long, vlen, loff_t, pos, rwf_t, flags)
1296 {
1297 if (pos == -1)
1298 return do_writev(fd, vec, vlen, flags);
1299 return do_pwritev(fd, vec, vlen, pos, flags);
1300 }
1301 #endif
1302
COMPAT_SYSCALL_DEFINE6(pwritev2,compat_ulong_t,fd,const struct iovec __user *,vec,compat_ulong_t,vlen,u32,pos_low,u32,pos_high,rwf_t,flags)1303 COMPAT_SYSCALL_DEFINE6(pwritev2, compat_ulong_t, fd,
1304 const struct iovec __user *,vec,
1305 compat_ulong_t, vlen, u32, pos_low, u32, pos_high, rwf_t, flags)
1306 {
1307 loff_t pos = ((loff_t)pos_high << 32) | pos_low;
1308
1309 if (pos == -1)
1310 return do_writev(fd, vec, vlen, flags);
1311 return do_pwritev(fd, vec, vlen, pos, flags);
1312 }
1313 #endif /* CONFIG_COMPAT */
1314
do_sendfile(int out_fd,int in_fd,loff_t * ppos,size_t count,loff_t max)1315 static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
1316 size_t count, loff_t max)
1317 {
1318 struct fd in, out;
1319 struct inode *in_inode, *out_inode;
1320 struct pipe_inode_info *opipe;
1321 loff_t pos;
1322 loff_t out_pos;
1323 ssize_t retval;
1324 int fl;
1325
1326 /*
1327 * Get input file, and verify that it is ok..
1328 */
1329 retval = -EBADF;
1330 in = fdget(in_fd);
1331 if (!fd_file(in))
1332 goto out;
1333 if (!(fd_file(in)->f_mode & FMODE_READ))
1334 goto fput_in;
1335 retval = -ESPIPE;
1336 if (!ppos) {
1337 pos = fd_file(in)->f_pos;
1338 } else {
1339 pos = *ppos;
1340 if (!(fd_file(in)->f_mode & FMODE_PREAD))
1341 goto fput_in;
1342 }
1343 retval = rw_verify_area(READ, fd_file(in), &pos, count);
1344 if (retval < 0)
1345 goto fput_in;
1346 if (count > MAX_RW_COUNT)
1347 count = MAX_RW_COUNT;
1348
1349 /*
1350 * Get output file, and verify that it is ok..
1351 */
1352 retval = -EBADF;
1353 out = fdget(out_fd);
1354 if (!fd_file(out))
1355 goto fput_in;
1356 if (!(fd_file(out)->f_mode & FMODE_WRITE))
1357 goto fput_out;
1358 in_inode = file_inode(fd_file(in));
1359 out_inode = file_inode(fd_file(out));
1360 out_pos = fd_file(out)->f_pos;
1361
1362 if (!max)
1363 max = min(in_inode->i_sb->s_maxbytes, out_inode->i_sb->s_maxbytes);
1364
1365 if (unlikely(pos + count > max)) {
1366 retval = -EOVERFLOW;
1367 if (pos >= max)
1368 goto fput_out;
1369 count = max - pos;
1370 }
1371
1372 fl = 0;
1373 #if 0
1374 /*
1375 * We need to debate whether we can enable this or not. The
1376 * man page documents EAGAIN return for the output at least,
1377 * and the application is arguably buggy if it doesn't expect
1378 * EAGAIN on a non-blocking file descriptor.
1379 */
1380 if (fd_file(in)->f_flags & O_NONBLOCK)
1381 fl = SPLICE_F_NONBLOCK;
1382 #endif
1383 opipe = get_pipe_info(fd_file(out), true);
1384 if (!opipe) {
1385 retval = rw_verify_area(WRITE, fd_file(out), &out_pos, count);
1386 if (retval < 0)
1387 goto fput_out;
1388 retval = do_splice_direct(fd_file(in), &pos, fd_file(out), &out_pos,
1389 count, fl);
1390 } else {
1391 if (fd_file(out)->f_flags & O_NONBLOCK)
1392 fl |= SPLICE_F_NONBLOCK;
1393
1394 retval = splice_file_to_pipe(fd_file(in), opipe, &pos, count, fl);
1395 }
1396
1397 if (retval > 0) {
1398 add_rchar(current, retval);
1399 add_wchar(current, retval);
1400 fsnotify_access(fd_file(in));
1401 fsnotify_modify(fd_file(out));
1402 fd_file(out)->f_pos = out_pos;
1403 if (ppos)
1404 *ppos = pos;
1405 else
1406 fd_file(in)->f_pos = pos;
1407 }
1408
1409 inc_syscr(current);
1410 inc_syscw(current);
1411 if (pos > max)
1412 retval = -EOVERFLOW;
1413
1414 fput_out:
1415 fdput(out);
1416 fput_in:
1417 fdput(in);
1418 out:
1419 return retval;
1420 }
1421
SYSCALL_DEFINE4(sendfile,int,out_fd,int,in_fd,off_t __user *,offset,size_t,count)1422 SYSCALL_DEFINE4(sendfile, int, out_fd, int, in_fd, off_t __user *, offset, size_t, count)
1423 {
1424 loff_t pos;
1425 off_t off;
1426 ssize_t ret;
1427
1428 if (offset) {
1429 if (unlikely(get_user(off, offset)))
1430 return -EFAULT;
1431 pos = off;
1432 ret = do_sendfile(out_fd, in_fd, &pos, count, MAX_NON_LFS);
1433 if (unlikely(put_user(pos, offset)))
1434 return -EFAULT;
1435 return ret;
1436 }
1437
1438 return do_sendfile(out_fd, in_fd, NULL, count, 0);
1439 }
1440
SYSCALL_DEFINE4(sendfile64,int,out_fd,int,in_fd,loff_t __user *,offset,size_t,count)1441 SYSCALL_DEFINE4(sendfile64, int, out_fd, int, in_fd, loff_t __user *, offset, size_t, count)
1442 {
1443 loff_t pos;
1444 ssize_t ret;
1445
1446 if (offset) {
1447 if (unlikely(copy_from_user(&pos, offset, sizeof(loff_t))))
1448 return -EFAULT;
1449 ret = do_sendfile(out_fd, in_fd, &pos, count, 0);
1450 if (unlikely(put_user(pos, offset)))
1451 return -EFAULT;
1452 return ret;
1453 }
1454
1455 return do_sendfile(out_fd, in_fd, NULL, count, 0);
1456 }
1457
1458 #ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE4(sendfile,int,out_fd,int,in_fd,compat_off_t __user *,offset,compat_size_t,count)1459 COMPAT_SYSCALL_DEFINE4(sendfile, int, out_fd, int, in_fd,
1460 compat_off_t __user *, offset, compat_size_t, count)
1461 {
1462 loff_t pos;
1463 off_t off;
1464 ssize_t ret;
1465
1466 if (offset) {
1467 if (unlikely(get_user(off, offset)))
1468 return -EFAULT;
1469 pos = off;
1470 ret = do_sendfile(out_fd, in_fd, &pos, count, MAX_NON_LFS);
1471 if (unlikely(put_user(pos, offset)))
1472 return -EFAULT;
1473 return ret;
1474 }
1475
1476 return do_sendfile(out_fd, in_fd, NULL, count, 0);
1477 }
1478
COMPAT_SYSCALL_DEFINE4(sendfile64,int,out_fd,int,in_fd,compat_loff_t __user *,offset,compat_size_t,count)1479 COMPAT_SYSCALL_DEFINE4(sendfile64, int, out_fd, int, in_fd,
1480 compat_loff_t __user *, offset, compat_size_t, count)
1481 {
1482 loff_t pos;
1483 ssize_t ret;
1484
1485 if (offset) {
1486 if (unlikely(copy_from_user(&pos, offset, sizeof(loff_t))))
1487 return -EFAULT;
1488 ret = do_sendfile(out_fd, in_fd, &pos, count, 0);
1489 if (unlikely(put_user(pos, offset)))
1490 return -EFAULT;
1491 return ret;
1492 }
1493
1494 return do_sendfile(out_fd, in_fd, NULL, count, 0);
1495 }
1496 #endif
1497
1498 /*
1499 * Performs necessary checks before doing a file copy
1500 *
1501 * Can adjust amount of bytes to copy via @req_count argument.
1502 * Returns appropriate error code that caller should return or
1503 * zero in case the copy should be allowed.
1504 */
generic_copy_file_checks(struct file * file_in,loff_t pos_in,struct file * file_out,loff_t pos_out,size_t * req_count,unsigned int flags)1505 static int generic_copy_file_checks(struct file *file_in, loff_t pos_in,
1506 struct file *file_out, loff_t pos_out,
1507 size_t *req_count, unsigned int flags)
1508 {
1509 struct inode *inode_in = file_inode(file_in);
1510 struct inode *inode_out = file_inode(file_out);
1511 uint64_t count = *req_count;
1512 loff_t size_in;
1513 int ret;
1514
1515 ret = generic_file_rw_checks(file_in, file_out);
1516 if (ret)
1517 return ret;
1518
1519 /*
1520 * We allow some filesystems to handle cross sb copy, but passing
1521 * a file of the wrong filesystem type to filesystem driver can result
1522 * in an attempt to dereference the wrong type of ->private_data, so
1523 * avoid doing that until we really have a good reason.
1524 *
1525 * nfs and cifs define several different file_system_type structures
1526 * and several different sets of file_operations, but they all end up
1527 * using the same ->copy_file_range() function pointer.
1528 */
1529 if (flags & COPY_FILE_SPLICE) {
1530 /* cross sb splice is allowed */
1531 } else if (file_out->f_op->copy_file_range) {
1532 if (file_in->f_op->copy_file_range !=
1533 file_out->f_op->copy_file_range)
1534 return -EXDEV;
1535 } else if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb) {
1536 return -EXDEV;
1537 }
1538
1539 /* Don't touch certain kinds of inodes */
1540 if (IS_IMMUTABLE(inode_out))
1541 return -EPERM;
1542
1543 if (IS_SWAPFILE(inode_in) || IS_SWAPFILE(inode_out))
1544 return -ETXTBSY;
1545
1546 /* Ensure offsets don't wrap. */
1547 if (pos_in + count < pos_in || pos_out + count < pos_out)
1548 return -EOVERFLOW;
1549
1550 /* Shorten the copy to EOF */
1551 size_in = i_size_read(inode_in);
1552 if (pos_in >= size_in)
1553 count = 0;
1554 else
1555 count = min(count, size_in - (uint64_t)pos_in);
1556
1557 ret = generic_write_check_limits(file_out, pos_out, &count);
1558 if (ret)
1559 return ret;
1560
1561 /* Don't allow overlapped copying within the same file. */
1562 if (inode_in == inode_out &&
1563 pos_out + count > pos_in &&
1564 pos_out < pos_in + count)
1565 return -EINVAL;
1566
1567 *req_count = count;
1568 return 0;
1569 }
1570
1571 /*
1572 * copy_file_range() differs from regular file read and write in that it
1573 * specifically allows return partial success. When it does so is up to
1574 * the copy_file_range method.
1575 */
vfs_copy_file_range(struct file * file_in,loff_t pos_in,struct file * file_out,loff_t pos_out,size_t len,unsigned int flags)1576 ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in,
1577 struct file *file_out, loff_t pos_out,
1578 size_t len, unsigned int flags)
1579 {
1580 ssize_t ret;
1581 bool splice = flags & COPY_FILE_SPLICE;
1582 bool samesb = file_inode(file_in)->i_sb == file_inode(file_out)->i_sb;
1583
1584 if (flags & ~COPY_FILE_SPLICE)
1585 return -EINVAL;
1586
1587 ret = generic_copy_file_checks(file_in, pos_in, file_out, pos_out, &len,
1588 flags);
1589 if (unlikely(ret))
1590 return ret;
1591
1592 ret = rw_verify_area(READ, file_in, &pos_in, len);
1593 if (unlikely(ret))
1594 return ret;
1595
1596 ret = rw_verify_area(WRITE, file_out, &pos_out, len);
1597 if (unlikely(ret))
1598 return ret;
1599
1600 if (len == 0)
1601 return 0;
1602
1603 file_start_write(file_out);
1604
1605 /*
1606 * Cloning is supported by more file systems, so we implement copy on
1607 * same sb using clone, but for filesystems where both clone and copy
1608 * are supported (e.g. nfs,cifs), we only call the copy method.
1609 */
1610 if (!splice && file_out->f_op->copy_file_range) {
1611 ret = file_out->f_op->copy_file_range(file_in, pos_in,
1612 file_out, pos_out,
1613 len, flags);
1614 } else if (!splice && file_in->f_op->remap_file_range && samesb) {
1615 ret = file_in->f_op->remap_file_range(file_in, pos_in,
1616 file_out, pos_out,
1617 min_t(loff_t, MAX_RW_COUNT, len),
1618 REMAP_FILE_CAN_SHORTEN);
1619 /* fallback to splice */
1620 if (ret <= 0)
1621 splice = true;
1622 } else if (samesb) {
1623 /* Fallback to splice for same sb copy for backward compat */
1624 splice = true;
1625 }
1626
1627 file_end_write(file_out);
1628
1629 if (!splice)
1630 goto done;
1631
1632 /*
1633 * We can get here for same sb copy of filesystems that do not implement
1634 * ->copy_file_range() in case filesystem does not support clone or in
1635 * case filesystem supports clone but rejected the clone request (e.g.
1636 * because it was not block aligned).
1637 *
1638 * In both cases, fall back to kernel copy so we are able to maintain a
1639 * consistent story about which filesystems support copy_file_range()
1640 * and which filesystems do not, that will allow userspace tools to
1641 * make consistent desicions w.r.t using copy_file_range().
1642 *
1643 * We also get here if caller (e.g. nfsd) requested COPY_FILE_SPLICE
1644 * for server-side-copy between any two sb.
1645 *
1646 * In any case, we call do_splice_direct() and not splice_file_range(),
1647 * without file_start_write() held, to avoid possible deadlocks related
1648 * to splicing from input file, while file_start_write() is held on
1649 * the output file on a different sb.
1650 */
1651 ret = do_splice_direct(file_in, &pos_in, file_out, &pos_out,
1652 min_t(size_t, len, MAX_RW_COUNT), 0);
1653 done:
1654 if (ret > 0) {
1655 fsnotify_access(file_in);
1656 add_rchar(current, ret);
1657 fsnotify_modify(file_out);
1658 add_wchar(current, ret);
1659 }
1660
1661 inc_syscr(current);
1662 inc_syscw(current);
1663
1664 return ret;
1665 }
1666 EXPORT_SYMBOL(vfs_copy_file_range);
1667
SYSCALL_DEFINE6(copy_file_range,int,fd_in,loff_t __user *,off_in,int,fd_out,loff_t __user *,off_out,size_t,len,unsigned int,flags)1668 SYSCALL_DEFINE6(copy_file_range, int, fd_in, loff_t __user *, off_in,
1669 int, fd_out, loff_t __user *, off_out,
1670 size_t, len, unsigned int, flags)
1671 {
1672 loff_t pos_in;
1673 loff_t pos_out;
1674 struct fd f_in;
1675 struct fd f_out;
1676 ssize_t ret = -EBADF;
1677
1678 f_in = fdget(fd_in);
1679 if (!fd_file(f_in))
1680 goto out2;
1681
1682 f_out = fdget(fd_out);
1683 if (!fd_file(f_out))
1684 goto out1;
1685
1686 ret = -EFAULT;
1687 if (off_in) {
1688 if (copy_from_user(&pos_in, off_in, sizeof(loff_t)))
1689 goto out;
1690 } else {
1691 pos_in = fd_file(f_in)->f_pos;
1692 }
1693
1694 if (off_out) {
1695 if (copy_from_user(&pos_out, off_out, sizeof(loff_t)))
1696 goto out;
1697 } else {
1698 pos_out = fd_file(f_out)->f_pos;
1699 }
1700
1701 ret = -EINVAL;
1702 if (flags != 0)
1703 goto out;
1704
1705 ret = vfs_copy_file_range(fd_file(f_in), pos_in, fd_file(f_out), pos_out, len,
1706 flags);
1707 if (ret > 0) {
1708 pos_in += ret;
1709 pos_out += ret;
1710
1711 if (off_in) {
1712 if (copy_to_user(off_in, &pos_in, sizeof(loff_t)))
1713 ret = -EFAULT;
1714 } else {
1715 fd_file(f_in)->f_pos = pos_in;
1716 }
1717
1718 if (off_out) {
1719 if (copy_to_user(off_out, &pos_out, sizeof(loff_t)))
1720 ret = -EFAULT;
1721 } else {
1722 fd_file(f_out)->f_pos = pos_out;
1723 }
1724 }
1725
1726 out:
1727 fdput(f_out);
1728 out1:
1729 fdput(f_in);
1730 out2:
1731 return ret;
1732 }
1733
1734 /*
1735 * Don't operate on ranges the page cache doesn't support, and don't exceed the
1736 * LFS limits. If pos is under the limit it becomes a short access. If it
1737 * exceeds the limit we return -EFBIG.
1738 */
generic_write_check_limits(struct file * file,loff_t pos,loff_t * count)1739 int generic_write_check_limits(struct file *file, loff_t pos, loff_t *count)
1740 {
1741 struct inode *inode = file->f_mapping->host;
1742 loff_t max_size = inode->i_sb->s_maxbytes;
1743 loff_t limit = rlimit(RLIMIT_FSIZE);
1744
1745 if (limit != RLIM_INFINITY) {
1746 if (pos >= limit) {
1747 send_sig(SIGXFSZ, current, 0);
1748 return -EFBIG;
1749 }
1750 *count = min(*count, limit - pos);
1751 }
1752
1753 if (!(file->f_flags & O_LARGEFILE))
1754 max_size = MAX_NON_LFS;
1755
1756 if (unlikely(pos >= max_size))
1757 return -EFBIG;
1758
1759 *count = min(*count, max_size - pos);
1760
1761 return 0;
1762 }
1763 EXPORT_SYMBOL_GPL(generic_write_check_limits);
1764
1765 /* Like generic_write_checks(), but takes size of write instead of iter. */
generic_write_checks_count(struct kiocb * iocb,loff_t * count)1766 int generic_write_checks_count(struct kiocb *iocb, loff_t *count)
1767 {
1768 struct file *file = iocb->ki_filp;
1769 struct inode *inode = file->f_mapping->host;
1770
1771 if (IS_SWAPFILE(inode))
1772 return -ETXTBSY;
1773
1774 if (!*count)
1775 return 0;
1776
1777 if (iocb->ki_flags & IOCB_APPEND)
1778 iocb->ki_pos = i_size_read(inode);
1779
1780 if ((iocb->ki_flags & IOCB_NOWAIT) &&
1781 !((iocb->ki_flags & IOCB_DIRECT) ||
1782 (file->f_op->fop_flags & FOP_BUFFER_WASYNC)))
1783 return -EINVAL;
1784
1785 return generic_write_check_limits(iocb->ki_filp, iocb->ki_pos, count);
1786 }
1787 EXPORT_SYMBOL(generic_write_checks_count);
1788
1789 /*
1790 * Performs necessary checks before doing a write
1791 *
1792 * Can adjust writing position or amount of bytes to write.
1793 * Returns appropriate error code that caller should return or
1794 * zero in case that write should be allowed.
1795 */
generic_write_checks(struct kiocb * iocb,struct iov_iter * from)1796 ssize_t generic_write_checks(struct kiocb *iocb, struct iov_iter *from)
1797 {
1798 loff_t count = iov_iter_count(from);
1799 int ret;
1800
1801 ret = generic_write_checks_count(iocb, &count);
1802 if (ret)
1803 return ret;
1804
1805 iov_iter_truncate(from, count);
1806 return iov_iter_count(from);
1807 }
1808 EXPORT_SYMBOL(generic_write_checks);
1809
1810 /*
1811 * Performs common checks before doing a file copy/clone
1812 * from @file_in to @file_out.
1813 */
generic_file_rw_checks(struct file * file_in,struct file * file_out)1814 int generic_file_rw_checks(struct file *file_in, struct file *file_out)
1815 {
1816 struct inode *inode_in = file_inode(file_in);
1817 struct inode *inode_out = file_inode(file_out);
1818
1819 /* Don't copy dirs, pipes, sockets... */
1820 if (S_ISDIR(inode_in->i_mode) || S_ISDIR(inode_out->i_mode))
1821 return -EISDIR;
1822 if (!S_ISREG(inode_in->i_mode) || !S_ISREG(inode_out->i_mode))
1823 return -EINVAL;
1824
1825 if (!(file_in->f_mode & FMODE_READ) ||
1826 !(file_out->f_mode & FMODE_WRITE) ||
1827 (file_out->f_flags & O_APPEND))
1828 return -EBADF;
1829
1830 return 0;
1831 }
1832
generic_atomic_write_valid(struct iov_iter * iter,loff_t pos)1833 bool generic_atomic_write_valid(struct iov_iter *iter, loff_t pos)
1834 {
1835 size_t len = iov_iter_count(iter);
1836
1837 if (!iter_is_ubuf(iter))
1838 return false;
1839
1840 if (!is_power_of_2(len))
1841 return false;
1842
1843 if (!IS_ALIGNED(pos, len))
1844 return false;
1845
1846 return true;
1847 }
1848