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