VFS: refactor vfs_read()
[firefly-linux-kernel-4.4.55.git] / fs / read_write.c
1 /*
2  *  linux/fs/read_write.c
3  *
4  *  Copyright (C) 1991, 1992  Linus Torvalds
5  */
6
7 #include <linux/slab.h> 
8 #include <linux/stat.h>
9 #include <linux/fcntl.h>
10 #include <linux/file.h>
11 #include <linux/uio.h>
12 #include <linux/aio.h>
13 #include <linux/fsnotify.h>
14 #include <linux/security.h>
15 #include <linux/export.h>
16 #include <linux/syscalls.h>
17 #include <linux/pagemap.h>
18 #include <linux/splice.h>
19 #include <linux/compat.h>
20 #include "internal.h"
21
22 #include <asm/uaccess.h>
23 #include <asm/unistd.h>
24
25 typedef ssize_t (*io_fn_t)(struct file *, char __user *, size_t, loff_t *);
26 typedef ssize_t (*iov_fn_t)(struct kiocb *, const struct iovec *,
27                 unsigned long, loff_t);
28 typedef ssize_t (*iter_fn_t)(struct kiocb *, struct iov_iter *);
29
30 const struct file_operations generic_ro_fops = {
31         .llseek         = generic_file_llseek,
32         .read           = new_sync_read,
33         .read_iter      = generic_file_read_iter,
34         .mmap           = generic_file_readonly_mmap,
35         .splice_read    = generic_file_splice_read,
36 };
37
38 EXPORT_SYMBOL(generic_ro_fops);
39
40 static inline int unsigned_offsets(struct file *file)
41 {
42         return file->f_mode & FMODE_UNSIGNED_OFFSET;
43 }
44
45 /**
46  * vfs_setpos - update the file offset for lseek
47  * @file:       file structure in question
48  * @offset:     file offset to seek to
49  * @maxsize:    maximum file size
50  *
51  * This is a low-level filesystem helper for updating the file offset to
52  * the value specified by @offset if the given offset is valid and it is
53  * not equal to the current file offset.
54  *
55  * Return the specified offset on success and -EINVAL on invalid offset.
56  */
57 loff_t vfs_setpos(struct file *file, loff_t offset, loff_t maxsize)
58 {
59         if (offset < 0 && !unsigned_offsets(file))
60                 return -EINVAL;
61         if (offset > maxsize)
62                 return -EINVAL;
63
64         if (offset != file->f_pos) {
65                 file->f_pos = offset;
66                 file->f_version = 0;
67         }
68         return offset;
69 }
70 EXPORT_SYMBOL(vfs_setpos);
71
72 /**
73  * generic_file_llseek_size - generic llseek implementation for regular files
74  * @file:       file structure to seek on
75  * @offset:     file offset to seek to
76  * @whence:     type of seek
77  * @size:       max size of this file in file system
78  * @eof:        offset used for SEEK_END position
79  *
80  * This is a variant of generic_file_llseek that allows passing in a custom
81  * maximum file size and a custom EOF position, for e.g. hashed directories
82  *
83  * Synchronization:
84  * SEEK_SET and SEEK_END are unsynchronized (but atomic on 64bit platforms)
85  * SEEK_CUR is synchronized against other SEEK_CURs, but not read/writes.
86  * read/writes behave like SEEK_SET against seeks.
87  */
88 loff_t
89 generic_file_llseek_size(struct file *file, loff_t offset, int whence,
90                 loff_t maxsize, loff_t eof)
91 {
92         switch (whence) {
93         case SEEK_END:
94                 offset += eof;
95                 break;
96         case SEEK_CUR:
97                 /*
98                  * Here we special-case the lseek(fd, 0, SEEK_CUR)
99                  * position-querying operation.  Avoid rewriting the "same"
100                  * f_pos value back to the file because a concurrent read(),
101                  * write() or lseek() might have altered it
102                  */
103                 if (offset == 0)
104                         return file->f_pos;
105                 /*
106                  * f_lock protects against read/modify/write race with other
107                  * SEEK_CURs. Note that parallel writes and reads behave
108                  * like SEEK_SET.
109                  */
110                 spin_lock(&file->f_lock);
111                 offset = vfs_setpos(file, file->f_pos + offset, maxsize);
112                 spin_unlock(&file->f_lock);
113                 return offset;
114         case SEEK_DATA:
115                 /*
116                  * In the generic case the entire file is data, so as long as
117                  * offset isn't at the end of the file then the offset is data.
118                  */
119                 if (offset >= eof)
120                         return -ENXIO;
121                 break;
122         case SEEK_HOLE:
123                 /*
124                  * There is a virtual hole at the end of the file, so as long as
125                  * offset isn't i_size or larger, return i_size.
126                  */
127                 if (offset >= eof)
128                         return -ENXIO;
129                 offset = eof;
130                 break;
131         }
132
133         return vfs_setpos(file, offset, maxsize);
134 }
135 EXPORT_SYMBOL(generic_file_llseek_size);
136
137 /**
138  * generic_file_llseek - generic llseek implementation for regular files
139  * @file:       file structure to seek on
140  * @offset:     file offset to seek to
141  * @whence:     type of seek
142  *
143  * This is a generic implemenation of ->llseek useable for all normal local
144  * filesystems.  It just updates the file offset to the value specified by
145  * @offset and @whence.
146  */
147 loff_t generic_file_llseek(struct file *file, loff_t offset, int whence)
148 {
149         struct inode *inode = file->f_mapping->host;
150
151         return generic_file_llseek_size(file, offset, whence,
152                                         inode->i_sb->s_maxbytes,
153                                         i_size_read(inode));
154 }
155 EXPORT_SYMBOL(generic_file_llseek);
156
157 /**
158  * fixed_size_llseek - llseek implementation for fixed-sized devices
159  * @file:       file structure to seek on
160  * @offset:     file offset to seek to
161  * @whence:     type of seek
162  * @size:       size of the file
163  *
164  */
165 loff_t fixed_size_llseek(struct file *file, loff_t offset, int whence, loff_t size)
166 {
167         switch (whence) {
168         case SEEK_SET: case SEEK_CUR: case SEEK_END:
169                 return generic_file_llseek_size(file, offset, whence,
170                                                 size, size);
171         default:
172                 return -EINVAL;
173         }
174 }
175 EXPORT_SYMBOL(fixed_size_llseek);
176
177 /**
178  * noop_llseek - No Operation Performed llseek implementation
179  * @file:       file structure to seek on
180  * @offset:     file offset to seek to
181  * @whence:     type of seek
182  *
183  * This is an implementation of ->llseek useable for the rare special case when
184  * userspace expects the seek to succeed but the (device) file is actually not
185  * able to perform the seek. In this case you use noop_llseek() instead of
186  * falling back to the default implementation of ->llseek.
187  */
188 loff_t noop_llseek(struct file *file, loff_t offset, int whence)
189 {
190         return file->f_pos;
191 }
192 EXPORT_SYMBOL(noop_llseek);
193
194 loff_t no_llseek(struct file *file, loff_t offset, int whence)
195 {
196         return -ESPIPE;
197 }
198 EXPORT_SYMBOL(no_llseek);
199
200 loff_t default_llseek(struct file *file, loff_t offset, int whence)
201 {
202         struct inode *inode = file_inode(file);
203         loff_t retval;
204
205         mutex_lock(&inode->i_mutex);
206         switch (whence) {
207                 case SEEK_END:
208                         offset += i_size_read(inode);
209                         break;
210                 case SEEK_CUR:
211                         if (offset == 0) {
212                                 retval = file->f_pos;
213                                 goto out;
214                         }
215                         offset += file->f_pos;
216                         break;
217                 case SEEK_DATA:
218                         /*
219                          * In the generic case the entire file is data, so as
220                          * long as offset isn't at the end of the file then the
221                          * offset is data.
222                          */
223                         if (offset >= inode->i_size) {
224                                 retval = -ENXIO;
225                                 goto out;
226                         }
227                         break;
228                 case SEEK_HOLE:
229                         /*
230                          * There is a virtual hole at the end of the file, so
231                          * as long as offset isn't i_size or larger, return
232                          * i_size.
233                          */
234                         if (offset >= inode->i_size) {
235                                 retval = -ENXIO;
236                                 goto out;
237                         }
238                         offset = inode->i_size;
239                         break;
240         }
241         retval = -EINVAL;
242         if (offset >= 0 || unsigned_offsets(file)) {
243                 if (offset != file->f_pos) {
244                         file->f_pos = offset;
245                         file->f_version = 0;
246                 }
247                 retval = offset;
248         }
249 out:
250         mutex_unlock(&inode->i_mutex);
251         return retval;
252 }
253 EXPORT_SYMBOL(default_llseek);
254
255 loff_t vfs_llseek(struct file *file, loff_t offset, int whence)
256 {
257         loff_t (*fn)(struct file *, loff_t, int);
258
259         fn = no_llseek;
260         if (file->f_mode & FMODE_LSEEK) {
261                 if (file->f_op->llseek)
262                         fn = file->f_op->llseek;
263         }
264         return fn(file, offset, whence);
265 }
266 EXPORT_SYMBOL(vfs_llseek);
267
268 static inline struct fd fdget_pos(int fd)
269 {
270         return __to_fd(__fdget_pos(fd));
271 }
272
273 static inline void fdput_pos(struct fd f)
274 {
275         if (f.flags & FDPUT_POS_UNLOCK)
276                 mutex_unlock(&f.file->f_pos_lock);
277         fdput(f);
278 }
279
280 SYSCALL_DEFINE3(lseek, unsigned int, fd, off_t, offset, unsigned int, whence)
281 {
282         off_t retval;
283         struct fd f = fdget_pos(fd);
284         if (!f.file)
285                 return -EBADF;
286
287         retval = -EINVAL;
288         if (whence <= SEEK_MAX) {
289                 loff_t res = vfs_llseek(f.file, offset, whence);
290                 retval = res;
291                 if (res != (loff_t)retval)
292                         retval = -EOVERFLOW;    /* LFS: should only happen on 32 bit platforms */
293         }
294         fdput_pos(f);
295         return retval;
296 }
297
298 #ifdef CONFIG_COMPAT
299 COMPAT_SYSCALL_DEFINE3(lseek, unsigned int, fd, compat_off_t, offset, unsigned int, whence)
300 {
301         return sys_lseek(fd, offset, whence);
302 }
303 #endif
304
305 #ifdef __ARCH_WANT_SYS_LLSEEK
306 SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high,
307                 unsigned long, offset_low, loff_t __user *, result,
308                 unsigned int, whence)
309 {
310         int retval;
311         struct fd f = fdget_pos(fd);
312         loff_t offset;
313
314         if (!f.file)
315                 return -EBADF;
316
317         retval = -EINVAL;
318         if (whence > SEEK_MAX)
319                 goto out_putf;
320
321         offset = vfs_llseek(f.file, ((loff_t) offset_high << 32) | offset_low,
322                         whence);
323
324         retval = (int)offset;
325         if (offset >= 0) {
326                 retval = -EFAULT;
327                 if (!copy_to_user(result, &offset, sizeof(offset)))
328                         retval = 0;
329         }
330 out_putf:
331         fdput_pos(f);
332         return retval;
333 }
334 #endif
335
336 /*
337  * rw_verify_area doesn't like huge counts. We limit
338  * them to something that fits in "int" so that others
339  * won't have to do range checks all the time.
340  */
341 int rw_verify_area(int read_write, struct file *file, const loff_t *ppos, size_t count)
342 {
343         struct inode *inode;
344         loff_t pos;
345         int retval = -EINVAL;
346
347         inode = file_inode(file);
348         if (unlikely((ssize_t) count < 0))
349                 return retval;
350         pos = *ppos;
351         if (unlikely(pos < 0)) {
352                 if (!unsigned_offsets(file))
353                         return retval;
354                 if (count >= -pos) /* both values are in 0..LLONG_MAX */
355                         return -EOVERFLOW;
356         } else if (unlikely((loff_t) (pos + count) < 0)) {
357                 if (!unsigned_offsets(file))
358                         return retval;
359         }
360
361         if (unlikely(inode->i_flock && mandatory_lock(inode))) {
362                 retval = locks_mandatory_area(
363                         read_write == READ ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE,
364                         inode, file, pos, count);
365                 if (retval < 0)
366                         return retval;
367         }
368         retval = security_file_permission(file,
369                                 read_write == READ ? MAY_READ : MAY_WRITE);
370         if (retval)
371                 return retval;
372         return count > MAX_RW_COUNT ? MAX_RW_COUNT : count;
373 }
374
375 ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
376 {
377         struct iovec iov = { .iov_base = buf, .iov_len = len };
378         struct kiocb kiocb;
379         ssize_t ret;
380
381         init_sync_kiocb(&kiocb, filp);
382         kiocb.ki_pos = *ppos;
383         kiocb.ki_nbytes = len;
384
385         ret = filp->f_op->aio_read(&kiocb, &iov, 1, kiocb.ki_pos);
386         if (-EIOCBQUEUED == ret)
387                 ret = wait_on_sync_kiocb(&kiocb);
388         *ppos = kiocb.ki_pos;
389         return ret;
390 }
391
392 EXPORT_SYMBOL(do_sync_read);
393
394 ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
395 {
396         struct iovec iov = { .iov_base = buf, .iov_len = len };
397         struct kiocb kiocb;
398         struct iov_iter iter;
399         ssize_t ret;
400
401         init_sync_kiocb(&kiocb, filp);
402         kiocb.ki_pos = *ppos;
403         kiocb.ki_nbytes = len;
404         iov_iter_init(&iter, READ, &iov, 1, len);
405
406         ret = filp->f_op->read_iter(&kiocb, &iter);
407         if (-EIOCBQUEUED == ret)
408                 ret = wait_on_sync_kiocb(&kiocb);
409         *ppos = kiocb.ki_pos;
410         return ret;
411 }
412
413 EXPORT_SYMBOL(new_sync_read);
414
415 ssize_t __vfs_read(struct file *file, char __user *buf, size_t count,
416                    loff_t *pos)
417 {
418         ssize_t ret;
419
420         if (file->f_op->read)
421                 ret = file->f_op->read(file, buf, count, pos);
422         else if (file->f_op->aio_read)
423                 ret = do_sync_read(file, buf, count, pos);
424         else if (file->f_op->read_iter)
425                 ret = new_sync_read(file, buf, count, pos);
426         else
427                 ret = -EINVAL;
428
429         return ret;
430 }
431
432 ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
433 {
434         ssize_t ret;
435
436         if (!(file->f_mode & FMODE_READ))
437                 return -EBADF;
438         if (!(file->f_mode & FMODE_CAN_READ))
439                 return -EINVAL;
440         if (unlikely(!access_ok(VERIFY_WRITE, buf, count)))
441                 return -EFAULT;
442
443         ret = rw_verify_area(READ, file, pos, count);
444         if (ret >= 0) {
445                 count = ret;
446                 ret = __vfs_read(file, buf, count, pos);
447                 if (ret > 0) {
448                         fsnotify_access(file);
449                         add_rchar(current, ret);
450                 }
451                 inc_syscr(current);
452         }
453
454         return ret;
455 }
456
457 EXPORT_SYMBOL(vfs_read);
458
459 ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
460 {
461         struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
462         struct kiocb kiocb;
463         ssize_t ret;
464
465         init_sync_kiocb(&kiocb, filp);
466         kiocb.ki_pos = *ppos;
467         kiocb.ki_nbytes = len;
468
469         ret = filp->f_op->aio_write(&kiocb, &iov, 1, kiocb.ki_pos);
470         if (-EIOCBQUEUED == ret)
471                 ret = wait_on_sync_kiocb(&kiocb);
472         *ppos = kiocb.ki_pos;
473         return ret;
474 }
475
476 EXPORT_SYMBOL(do_sync_write);
477
478 ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
479 {
480         struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
481         struct kiocb kiocb;
482         struct iov_iter iter;
483         ssize_t ret;
484
485         init_sync_kiocb(&kiocb, filp);
486         kiocb.ki_pos = *ppos;
487         kiocb.ki_nbytes = len;
488         iov_iter_init(&iter, WRITE, &iov, 1, len);
489
490         ret = filp->f_op->write_iter(&kiocb, &iter);
491         if (-EIOCBQUEUED == ret)
492                 ret = wait_on_sync_kiocb(&kiocb);
493         *ppos = kiocb.ki_pos;
494         return ret;
495 }
496
497 EXPORT_SYMBOL(new_sync_write);
498
499 ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos)
500 {
501         mm_segment_t old_fs;
502         const char __user *p;
503         ssize_t ret;
504
505         if (!(file->f_mode & FMODE_CAN_WRITE))
506                 return -EINVAL;
507
508         old_fs = get_fs();
509         set_fs(get_ds());
510         p = (__force const char __user *)buf;
511         if (count > MAX_RW_COUNT)
512                 count =  MAX_RW_COUNT;
513         if (file->f_op->write)
514                 ret = file->f_op->write(file, p, count, pos);
515         else if (file->f_op->aio_write)
516                 ret = do_sync_write(file, p, count, pos);
517         else
518                 ret = new_sync_write(file, p, count, pos);
519         set_fs(old_fs);
520         if (ret > 0) {
521                 fsnotify_modify(file);
522                 add_wchar(current, ret);
523         }
524         inc_syscw(current);
525         return ret;
526 }
527
528 ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
529 {
530         ssize_t ret;
531
532         if (!(file->f_mode & FMODE_WRITE))
533                 return -EBADF;
534         if (!(file->f_mode & FMODE_CAN_WRITE))
535                 return -EINVAL;
536         if (unlikely(!access_ok(VERIFY_READ, buf, count)))
537                 return -EFAULT;
538
539         ret = rw_verify_area(WRITE, file, pos, count);
540         if (ret >= 0) {
541                 count = ret;
542                 file_start_write(file);
543                 if (file->f_op->write)
544                         ret = file->f_op->write(file, buf, count, pos);
545                 else if (file->f_op->aio_write)
546                         ret = do_sync_write(file, buf, count, pos);
547                 else
548                         ret = new_sync_write(file, buf, count, pos);
549                 if (ret > 0) {
550                         fsnotify_modify(file);
551                         add_wchar(current, ret);
552                 }
553                 inc_syscw(current);
554                 file_end_write(file);
555         }
556
557         return ret;
558 }
559
560 EXPORT_SYMBOL(vfs_write);
561
562 static inline loff_t file_pos_read(struct file *file)
563 {
564         return file->f_pos;
565 }
566
567 static inline void file_pos_write(struct file *file, loff_t pos)
568 {
569         file->f_pos = pos;
570 }
571
572 SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
573 {
574         struct fd f = fdget_pos(fd);
575         ssize_t ret = -EBADF;
576
577         if (f.file) {
578                 loff_t pos = file_pos_read(f.file);
579                 ret = vfs_read(f.file, buf, count, &pos);
580                 if (ret >= 0)
581                         file_pos_write(f.file, pos);
582                 fdput_pos(f);
583         }
584         return ret;
585 }
586
587 SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
588                 size_t, count)
589 {
590         struct fd f = fdget_pos(fd);
591         ssize_t ret = -EBADF;
592
593         if (f.file) {
594                 loff_t pos = file_pos_read(f.file);
595                 ret = vfs_write(f.file, buf, count, &pos);
596                 if (ret >= 0)
597                         file_pos_write(f.file, pos);
598                 fdput_pos(f);
599         }
600
601         return ret;
602 }
603
604 SYSCALL_DEFINE4(pread64, unsigned int, fd, char __user *, buf,
605                         size_t, count, loff_t, pos)
606 {
607         struct fd f;
608         ssize_t ret = -EBADF;
609
610         if (pos < 0)
611                 return -EINVAL;
612
613         f = fdget(fd);
614         if (f.file) {
615                 ret = -ESPIPE;
616                 if (f.file->f_mode & FMODE_PREAD)
617                         ret = vfs_read(f.file, buf, count, &pos);
618                 fdput(f);
619         }
620
621         return ret;
622 }
623
624 SYSCALL_DEFINE4(pwrite64, unsigned int, fd, const char __user *, buf,
625                          size_t, count, loff_t, pos)
626 {
627         struct fd f;
628         ssize_t ret = -EBADF;
629
630         if (pos < 0)
631                 return -EINVAL;
632
633         f = fdget(fd);
634         if (f.file) {
635                 ret = -ESPIPE;
636                 if (f.file->f_mode & FMODE_PWRITE)  
637                         ret = vfs_write(f.file, buf, count, &pos);
638                 fdput(f);
639         }
640
641         return ret;
642 }
643
644 /*
645  * Reduce an iovec's length in-place.  Return the resulting number of segments
646  */
647 unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to)
648 {
649         unsigned long seg = 0;
650         size_t len = 0;
651
652         while (seg < nr_segs) {
653                 seg++;
654                 if (len + iov->iov_len >= to) {
655                         iov->iov_len = to - len;
656                         break;
657                 }
658                 len += iov->iov_len;
659                 iov++;
660         }
661         return seg;
662 }
663 EXPORT_SYMBOL(iov_shorten);
664
665 static ssize_t do_iter_readv_writev(struct file *filp, int rw, const struct iovec *iov,
666                 unsigned long nr_segs, size_t len, loff_t *ppos, iter_fn_t fn)
667 {
668         struct kiocb kiocb;
669         struct iov_iter iter;
670         ssize_t ret;
671
672         init_sync_kiocb(&kiocb, filp);
673         kiocb.ki_pos = *ppos;
674         kiocb.ki_nbytes = len;
675
676         iov_iter_init(&iter, rw, iov, nr_segs, len);
677         ret = fn(&kiocb, &iter);
678         if (ret == -EIOCBQUEUED)
679                 ret = wait_on_sync_kiocb(&kiocb);
680         *ppos = kiocb.ki_pos;
681         return ret;
682 }
683
684 static ssize_t do_sync_readv_writev(struct file *filp, const struct iovec *iov,
685                 unsigned long nr_segs, size_t len, loff_t *ppos, iov_fn_t fn)
686 {
687         struct kiocb kiocb;
688         ssize_t ret;
689
690         init_sync_kiocb(&kiocb, filp);
691         kiocb.ki_pos = *ppos;
692         kiocb.ki_nbytes = len;
693
694         ret = fn(&kiocb, iov, nr_segs, kiocb.ki_pos);
695         if (ret == -EIOCBQUEUED)
696                 ret = wait_on_sync_kiocb(&kiocb);
697         *ppos = kiocb.ki_pos;
698         return ret;
699 }
700
701 /* Do it by hand, with file-ops */
702 static ssize_t do_loop_readv_writev(struct file *filp, struct iovec *iov,
703                 unsigned long nr_segs, loff_t *ppos, io_fn_t fn)
704 {
705         struct iovec *vector = iov;
706         ssize_t ret = 0;
707
708         while (nr_segs > 0) {
709                 void __user *base;
710                 size_t len;
711                 ssize_t nr;
712
713                 base = vector->iov_base;
714                 len = vector->iov_len;
715                 vector++;
716                 nr_segs--;
717
718                 nr = fn(filp, base, len, ppos);
719
720                 if (nr < 0) {
721                         if (!ret)
722                                 ret = nr;
723                         break;
724                 }
725                 ret += nr;
726                 if (nr != len)
727                         break;
728         }
729
730         return ret;
731 }
732
733 /* A write operation does a read from user space and vice versa */
734 #define vrfy_dir(type) ((type) == READ ? VERIFY_WRITE : VERIFY_READ)
735
736 ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
737                               unsigned long nr_segs, unsigned long fast_segs,
738                               struct iovec *fast_pointer,
739                               struct iovec **ret_pointer)
740 {
741         unsigned long seg;
742         ssize_t ret;
743         struct iovec *iov = fast_pointer;
744
745         /*
746          * SuS says "The readv() function *may* fail if the iovcnt argument
747          * was less than or equal to 0, or greater than {IOV_MAX}.  Linux has
748          * traditionally returned zero for zero segments, so...
749          */
750         if (nr_segs == 0) {
751                 ret = 0;
752                 goto out;
753         }
754
755         /*
756          * First get the "struct iovec" from user memory and
757          * verify all the pointers
758          */
759         if (nr_segs > UIO_MAXIOV) {
760                 ret = -EINVAL;
761                 goto out;
762         }
763         if (nr_segs > fast_segs) {
764                 iov = kmalloc(nr_segs*sizeof(struct iovec), GFP_KERNEL);
765                 if (iov == NULL) {
766                         ret = -ENOMEM;
767                         goto out;
768                 }
769         }
770         if (copy_from_user(iov, uvector, nr_segs*sizeof(*uvector))) {
771                 ret = -EFAULT;
772                 goto out;
773         }
774
775         /*
776          * According to the Single Unix Specification we should return EINVAL
777          * if an element length is < 0 when cast to ssize_t or if the
778          * total length would overflow the ssize_t return value of the
779          * system call.
780          *
781          * Linux caps all read/write calls to MAX_RW_COUNT, and avoids the
782          * overflow case.
783          */
784         ret = 0;
785         for (seg = 0; seg < nr_segs; seg++) {
786                 void __user *buf = iov[seg].iov_base;
787                 ssize_t len = (ssize_t)iov[seg].iov_len;
788
789                 /* see if we we're about to use an invalid len or if
790                  * it's about to overflow ssize_t */
791                 if (len < 0) {
792                         ret = -EINVAL;
793                         goto out;
794                 }
795                 if (type >= 0
796                     && unlikely(!access_ok(vrfy_dir(type), buf, len))) {
797                         ret = -EFAULT;
798                         goto out;
799                 }
800                 if (len > MAX_RW_COUNT - ret) {
801                         len = MAX_RW_COUNT - ret;
802                         iov[seg].iov_len = len;
803                 }
804                 ret += len;
805         }
806 out:
807         *ret_pointer = iov;
808         return ret;
809 }
810
811 static ssize_t do_readv_writev(int type, struct file *file,
812                                const struct iovec __user * uvector,
813                                unsigned long nr_segs, loff_t *pos)
814 {
815         size_t tot_len;
816         struct iovec iovstack[UIO_FASTIOV];
817         struct iovec *iov = iovstack;
818         ssize_t ret;
819         io_fn_t fn;
820         iov_fn_t fnv;
821         iter_fn_t iter_fn;
822
823         ret = rw_copy_check_uvector(type, uvector, nr_segs,
824                                     ARRAY_SIZE(iovstack), iovstack, &iov);
825         if (ret <= 0)
826                 goto out;
827
828         tot_len = ret;
829         ret = rw_verify_area(type, file, pos, tot_len);
830         if (ret < 0)
831                 goto out;
832
833         fnv = NULL;
834         if (type == READ) {
835                 fn = file->f_op->read;
836                 fnv = file->f_op->aio_read;
837                 iter_fn = file->f_op->read_iter;
838         } else {
839                 fn = (io_fn_t)file->f_op->write;
840                 fnv = file->f_op->aio_write;
841                 iter_fn = file->f_op->write_iter;
842                 file_start_write(file);
843         }
844
845         if (iter_fn)
846                 ret = do_iter_readv_writev(file, type, iov, nr_segs, tot_len,
847                                                 pos, iter_fn);
848         else if (fnv)
849                 ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
850                                                 pos, fnv);
851         else
852                 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
853
854         if (type != READ)
855                 file_end_write(file);
856
857 out:
858         if (iov != iovstack)
859                 kfree(iov);
860         if ((ret + (type == READ)) > 0) {
861                 if (type == READ)
862                         fsnotify_access(file);
863                 else
864                         fsnotify_modify(file);
865         }
866         return ret;
867 }
868
869 ssize_t vfs_readv(struct file *file, const struct iovec __user *vec,
870                   unsigned long vlen, loff_t *pos)
871 {
872         if (!(file->f_mode & FMODE_READ))
873                 return -EBADF;
874         if (!(file->f_mode & FMODE_CAN_READ))
875                 return -EINVAL;
876
877         return do_readv_writev(READ, file, vec, vlen, pos);
878 }
879
880 EXPORT_SYMBOL(vfs_readv);
881
882 ssize_t vfs_writev(struct file *file, const struct iovec __user *vec,
883                    unsigned long vlen, loff_t *pos)
884 {
885         if (!(file->f_mode & FMODE_WRITE))
886                 return -EBADF;
887         if (!(file->f_mode & FMODE_CAN_WRITE))
888                 return -EINVAL;
889
890         return do_readv_writev(WRITE, file, vec, vlen, pos);
891 }
892
893 EXPORT_SYMBOL(vfs_writev);
894
895 SYSCALL_DEFINE3(readv, unsigned long, fd, const struct iovec __user *, vec,
896                 unsigned long, vlen)
897 {
898         struct fd f = fdget_pos(fd);
899         ssize_t ret = -EBADF;
900
901         if (f.file) {
902                 loff_t pos = file_pos_read(f.file);
903                 ret = vfs_readv(f.file, vec, vlen, &pos);
904                 if (ret >= 0)
905                         file_pos_write(f.file, pos);
906                 fdput_pos(f);
907         }
908
909         if (ret > 0)
910                 add_rchar(current, ret);
911         inc_syscr(current);
912         return ret;
913 }
914
915 SYSCALL_DEFINE3(writev, unsigned long, fd, const struct iovec __user *, vec,
916                 unsigned long, vlen)
917 {
918         struct fd f = fdget_pos(fd);
919         ssize_t ret = -EBADF;
920
921         if (f.file) {
922                 loff_t pos = file_pos_read(f.file);
923                 ret = vfs_writev(f.file, vec, vlen, &pos);
924                 if (ret >= 0)
925                         file_pos_write(f.file, pos);
926                 fdput_pos(f);
927         }
928
929         if (ret > 0)
930                 add_wchar(current, ret);
931         inc_syscw(current);
932         return ret;
933 }
934
935 static inline loff_t pos_from_hilo(unsigned long high, unsigned long low)
936 {
937 #define HALF_LONG_BITS (BITS_PER_LONG / 2)
938         return (((loff_t)high << HALF_LONG_BITS) << HALF_LONG_BITS) | low;
939 }
940
941 SYSCALL_DEFINE5(preadv, unsigned long, fd, const struct iovec __user *, vec,
942                 unsigned long, vlen, unsigned long, pos_l, unsigned long, pos_h)
943 {
944         loff_t pos = pos_from_hilo(pos_h, pos_l);
945         struct fd f;
946         ssize_t ret = -EBADF;
947
948         if (pos < 0)
949                 return -EINVAL;
950
951         f = fdget(fd);
952         if (f.file) {
953                 ret = -ESPIPE;
954                 if (f.file->f_mode & FMODE_PREAD)
955                         ret = vfs_readv(f.file, vec, vlen, &pos);
956                 fdput(f);
957         }
958
959         if (ret > 0)
960                 add_rchar(current, ret);
961         inc_syscr(current);
962         return ret;
963 }
964
965 SYSCALL_DEFINE5(pwritev, unsigned long, fd, const struct iovec __user *, vec,
966                 unsigned long, vlen, unsigned long, pos_l, unsigned long, pos_h)
967 {
968         loff_t pos = pos_from_hilo(pos_h, pos_l);
969         struct fd f;
970         ssize_t ret = -EBADF;
971
972         if (pos < 0)
973                 return -EINVAL;
974
975         f = fdget(fd);
976         if (f.file) {
977                 ret = -ESPIPE;
978                 if (f.file->f_mode & FMODE_PWRITE)
979                         ret = vfs_writev(f.file, vec, vlen, &pos);
980                 fdput(f);
981         }
982
983         if (ret > 0)
984                 add_wchar(current, ret);
985         inc_syscw(current);
986         return ret;
987 }
988
989 #ifdef CONFIG_COMPAT
990
991 static ssize_t compat_do_readv_writev(int type, struct file *file,
992                                const struct compat_iovec __user *uvector,
993                                unsigned long nr_segs, loff_t *pos)
994 {
995         compat_ssize_t tot_len;
996         struct iovec iovstack[UIO_FASTIOV];
997         struct iovec *iov = iovstack;
998         ssize_t ret;
999         io_fn_t fn;
1000         iov_fn_t fnv;
1001         iter_fn_t iter_fn;
1002
1003         ret = compat_rw_copy_check_uvector(type, uvector, nr_segs,
1004                                                UIO_FASTIOV, iovstack, &iov);
1005         if (ret <= 0)
1006                 goto out;
1007
1008         tot_len = ret;
1009         ret = rw_verify_area(type, file, pos, tot_len);
1010         if (ret < 0)
1011                 goto out;
1012
1013         fnv = NULL;
1014         if (type == READ) {
1015                 fn = file->f_op->read;
1016                 fnv = file->f_op->aio_read;
1017                 iter_fn = file->f_op->read_iter;
1018         } else {
1019                 fn = (io_fn_t)file->f_op->write;
1020                 fnv = file->f_op->aio_write;
1021                 iter_fn = file->f_op->write_iter;
1022                 file_start_write(file);
1023         }
1024
1025         if (iter_fn)
1026                 ret = do_iter_readv_writev(file, type, iov, nr_segs, tot_len,
1027                                                 pos, iter_fn);
1028         else if (fnv)
1029                 ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
1030                                                 pos, fnv);
1031         else
1032                 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
1033
1034         if (type != READ)
1035                 file_end_write(file);
1036
1037 out:
1038         if (iov != iovstack)
1039                 kfree(iov);
1040         if ((ret + (type == READ)) > 0) {
1041                 if (type == READ)
1042                         fsnotify_access(file);
1043                 else
1044                         fsnotify_modify(file);
1045         }
1046         return ret;
1047 }
1048
1049 static size_t compat_readv(struct file *file,
1050                            const struct compat_iovec __user *vec,
1051                            unsigned long vlen, loff_t *pos)
1052 {
1053         ssize_t ret = -EBADF;
1054
1055         if (!(file->f_mode & FMODE_READ))
1056                 goto out;
1057
1058         ret = -EINVAL;
1059         if (!(file->f_mode & FMODE_CAN_READ))
1060                 goto out;
1061
1062         ret = compat_do_readv_writev(READ, file, vec, vlen, pos);
1063
1064 out:
1065         if (ret > 0)
1066                 add_rchar(current, ret);
1067         inc_syscr(current);
1068         return ret;
1069 }
1070
1071 COMPAT_SYSCALL_DEFINE3(readv, compat_ulong_t, fd,
1072                 const struct compat_iovec __user *,vec,
1073                 compat_ulong_t, vlen)
1074 {
1075         struct fd f = fdget_pos(fd);
1076         ssize_t ret;
1077         loff_t pos;
1078
1079         if (!f.file)
1080                 return -EBADF;
1081         pos = f.file->f_pos;
1082         ret = compat_readv(f.file, vec, vlen, &pos);
1083         if (ret >= 0)
1084                 f.file->f_pos = pos;
1085         fdput_pos(f);
1086         return ret;
1087 }
1088
1089 static long __compat_sys_preadv64(unsigned long fd,
1090                                   const struct compat_iovec __user *vec,
1091                                   unsigned long vlen, loff_t pos)
1092 {
1093         struct fd f;
1094         ssize_t ret;
1095
1096         if (pos < 0)
1097                 return -EINVAL;
1098         f = fdget(fd);
1099         if (!f.file)
1100                 return -EBADF;
1101         ret = -ESPIPE;
1102         if (f.file->f_mode & FMODE_PREAD)
1103                 ret = compat_readv(f.file, vec, vlen, &pos);
1104         fdput(f);
1105         return ret;
1106 }
1107
1108 #ifdef __ARCH_WANT_COMPAT_SYS_PREADV64
1109 COMPAT_SYSCALL_DEFINE4(preadv64, unsigned long, fd,
1110                 const struct compat_iovec __user *,vec,
1111                 unsigned long, vlen, loff_t, pos)
1112 {
1113         return __compat_sys_preadv64(fd, vec, vlen, pos);
1114 }
1115 #endif
1116
1117 COMPAT_SYSCALL_DEFINE5(preadv, compat_ulong_t, fd,
1118                 const struct compat_iovec __user *,vec,
1119                 compat_ulong_t, vlen, u32, pos_low, u32, pos_high)
1120 {
1121         loff_t pos = ((loff_t)pos_high << 32) | pos_low;
1122
1123         return __compat_sys_preadv64(fd, vec, vlen, pos);
1124 }
1125
1126 static size_t compat_writev(struct file *file,
1127                             const struct compat_iovec __user *vec,
1128                             unsigned long vlen, loff_t *pos)
1129 {
1130         ssize_t ret = -EBADF;
1131
1132         if (!(file->f_mode & FMODE_WRITE))
1133                 goto out;
1134
1135         ret = -EINVAL;
1136         if (!(file->f_mode & FMODE_CAN_WRITE))
1137                 goto out;
1138
1139         ret = compat_do_readv_writev(WRITE, file, vec, vlen, pos);
1140
1141 out:
1142         if (ret > 0)
1143                 add_wchar(current, ret);
1144         inc_syscw(current);
1145         return ret;
1146 }
1147
1148 COMPAT_SYSCALL_DEFINE3(writev, compat_ulong_t, fd,
1149                 const struct compat_iovec __user *, vec,
1150                 compat_ulong_t, vlen)
1151 {
1152         struct fd f = fdget_pos(fd);
1153         ssize_t ret;
1154         loff_t pos;
1155
1156         if (!f.file)
1157                 return -EBADF;
1158         pos = f.file->f_pos;
1159         ret = compat_writev(f.file, vec, vlen, &pos);
1160         if (ret >= 0)
1161                 f.file->f_pos = pos;
1162         fdput_pos(f);
1163         return ret;
1164 }
1165
1166 static long __compat_sys_pwritev64(unsigned long fd,
1167                                    const struct compat_iovec __user *vec,
1168                                    unsigned long vlen, loff_t pos)
1169 {
1170         struct fd f;
1171         ssize_t ret;
1172
1173         if (pos < 0)
1174                 return -EINVAL;
1175         f = fdget(fd);
1176         if (!f.file)
1177                 return -EBADF;
1178         ret = -ESPIPE;
1179         if (f.file->f_mode & FMODE_PWRITE)
1180                 ret = compat_writev(f.file, vec, vlen, &pos);
1181         fdput(f);
1182         return ret;
1183 }
1184
1185 #ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64
1186 COMPAT_SYSCALL_DEFINE4(pwritev64, unsigned long, fd,
1187                 const struct compat_iovec __user *,vec,
1188                 unsigned long, vlen, loff_t, pos)
1189 {
1190         return __compat_sys_pwritev64(fd, vec, vlen, pos);
1191 }
1192 #endif
1193
1194 COMPAT_SYSCALL_DEFINE5(pwritev, compat_ulong_t, fd,
1195                 const struct compat_iovec __user *,vec,
1196                 compat_ulong_t, vlen, u32, pos_low, u32, pos_high)
1197 {
1198         loff_t pos = ((loff_t)pos_high << 32) | pos_low;
1199
1200         return __compat_sys_pwritev64(fd, vec, vlen, pos);
1201 }
1202 #endif
1203
1204 static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
1205                            size_t count, loff_t max)
1206 {
1207         struct fd in, out;
1208         struct inode *in_inode, *out_inode;
1209         loff_t pos;
1210         loff_t out_pos;
1211         ssize_t retval;
1212         int fl;
1213
1214         /*
1215          * Get input file, and verify that it is ok..
1216          */
1217         retval = -EBADF;
1218         in = fdget(in_fd);
1219         if (!in.file)
1220                 goto out;
1221         if (!(in.file->f_mode & FMODE_READ))
1222                 goto fput_in;
1223         retval = -ESPIPE;
1224         if (!ppos) {
1225                 pos = in.file->f_pos;
1226         } else {
1227                 pos = *ppos;
1228                 if (!(in.file->f_mode & FMODE_PREAD))
1229                         goto fput_in;
1230         }
1231         retval = rw_verify_area(READ, in.file, &pos, count);
1232         if (retval < 0)
1233                 goto fput_in;
1234         count = retval;
1235
1236         /*
1237          * Get output file, and verify that it is ok..
1238          */
1239         retval = -EBADF;
1240         out = fdget(out_fd);
1241         if (!out.file)
1242                 goto fput_in;
1243         if (!(out.file->f_mode & FMODE_WRITE))
1244                 goto fput_out;
1245         retval = -EINVAL;
1246         in_inode = file_inode(in.file);
1247         out_inode = file_inode(out.file);
1248         out_pos = out.file->f_pos;
1249         retval = rw_verify_area(WRITE, out.file, &out_pos, count);
1250         if (retval < 0)
1251                 goto fput_out;
1252         count = retval;
1253
1254         if (!max)
1255                 max = min(in_inode->i_sb->s_maxbytes, out_inode->i_sb->s_maxbytes);
1256
1257         if (unlikely(pos + count > max)) {
1258                 retval = -EOVERFLOW;
1259                 if (pos >= max)
1260                         goto fput_out;
1261                 count = max - pos;
1262         }
1263
1264         fl = 0;
1265 #if 0
1266         /*
1267          * We need to debate whether we can enable this or not. The
1268          * man page documents EAGAIN return for the output at least,
1269          * and the application is arguably buggy if it doesn't expect
1270          * EAGAIN on a non-blocking file descriptor.
1271          */
1272         if (in.file->f_flags & O_NONBLOCK)
1273                 fl = SPLICE_F_NONBLOCK;
1274 #endif
1275         file_start_write(out.file);
1276         retval = do_splice_direct(in.file, &pos, out.file, &out_pos, count, fl);
1277         file_end_write(out.file);
1278
1279         if (retval > 0) {
1280                 add_rchar(current, retval);
1281                 add_wchar(current, retval);
1282                 fsnotify_access(in.file);
1283                 fsnotify_modify(out.file);
1284                 out.file->f_pos = out_pos;
1285                 if (ppos)
1286                         *ppos = pos;
1287                 else
1288                         in.file->f_pos = pos;
1289         }
1290
1291         inc_syscr(current);
1292         inc_syscw(current);
1293         if (pos > max)
1294                 retval = -EOVERFLOW;
1295
1296 fput_out:
1297         fdput(out);
1298 fput_in:
1299         fdput(in);
1300 out:
1301         return retval;
1302 }
1303
1304 SYSCALL_DEFINE4(sendfile, int, out_fd, int, in_fd, off_t __user *, offset, size_t, count)
1305 {
1306         loff_t pos;
1307         off_t off;
1308         ssize_t ret;
1309
1310         if (offset) {
1311                 if (unlikely(get_user(off, offset)))
1312                         return -EFAULT;
1313                 pos = off;
1314                 ret = do_sendfile(out_fd, in_fd, &pos, count, MAX_NON_LFS);
1315                 if (unlikely(put_user(pos, offset)))
1316                         return -EFAULT;
1317                 return ret;
1318         }
1319
1320         return do_sendfile(out_fd, in_fd, NULL, count, 0);
1321 }
1322
1323 SYSCALL_DEFINE4(sendfile64, int, out_fd, int, in_fd, loff_t __user *, offset, size_t, count)
1324 {
1325         loff_t pos;
1326         ssize_t ret;
1327
1328         if (offset) {
1329                 if (unlikely(copy_from_user(&pos, offset, sizeof(loff_t))))
1330                         return -EFAULT;
1331                 ret = do_sendfile(out_fd, in_fd, &pos, count, 0);
1332                 if (unlikely(put_user(pos, offset)))
1333                         return -EFAULT;
1334                 return ret;
1335         }
1336
1337         return do_sendfile(out_fd, in_fd, NULL, count, 0);
1338 }
1339
1340 #ifdef CONFIG_COMPAT
1341 COMPAT_SYSCALL_DEFINE4(sendfile, int, out_fd, int, in_fd,
1342                 compat_off_t __user *, offset, compat_size_t, count)
1343 {
1344         loff_t pos;
1345         off_t off;
1346         ssize_t ret;
1347
1348         if (offset) {
1349                 if (unlikely(get_user(off, offset)))
1350                         return -EFAULT;
1351                 pos = off;
1352                 ret = do_sendfile(out_fd, in_fd, &pos, count, MAX_NON_LFS);
1353                 if (unlikely(put_user(pos, offset)))
1354                         return -EFAULT;
1355                 return ret;
1356         }
1357
1358         return do_sendfile(out_fd, in_fd, NULL, count, 0);
1359 }
1360
1361 COMPAT_SYSCALL_DEFINE4(sendfile64, int, out_fd, int, in_fd,
1362                 compat_loff_t __user *, offset, compat_size_t, count)
1363 {
1364         loff_t pos;
1365         ssize_t ret;
1366
1367         if (offset) {
1368                 if (unlikely(copy_from_user(&pos, offset, sizeof(loff_t))))
1369                         return -EFAULT;
1370                 ret = do_sendfile(out_fd, in_fd, &pos, count, 0);
1371                 if (unlikely(put_user(pos, offset)))
1372                         return -EFAULT;
1373                 return ret;
1374         }
1375
1376         return do_sendfile(out_fd, in_fd, NULL, count, 0);
1377 }
1378 #endif