diff options
Diffstat (limited to 'fs/read_write.c')
-rw-r--r-- | fs/read_write.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/fs/read_write.c b/fs/read_write.c index 400fe81c973e..6d5d8ff238aa 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
@@ -731,6 +731,56 @@ SYSCALL_DEFINE3(writev, unsigned long, fd, const struct iovec __user *, vec, | |||
731 | return ret; | 731 | return ret; |
732 | } | 732 | } |
733 | 733 | ||
734 | SYSCALL_DEFINE5(preadv, unsigned long, fd, const struct iovec __user *, vec, | ||
735 | unsigned long, vlen, u32, pos_high, u32, pos_low) | ||
736 | { | ||
737 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | ||
738 | struct file *file; | ||
739 | ssize_t ret = -EBADF; | ||
740 | int fput_needed; | ||
741 | |||
742 | if (pos < 0) | ||
743 | return -EINVAL; | ||
744 | |||
745 | file = fget_light(fd, &fput_needed); | ||
746 | if (file) { | ||
747 | ret = -ESPIPE; | ||
748 | if (file->f_mode & FMODE_PREAD) | ||
749 | ret = vfs_readv(file, vec, vlen, &pos); | ||
750 | fput_light(file, fput_needed); | ||
751 | } | ||
752 | |||
753 | if (ret > 0) | ||
754 | add_rchar(current, ret); | ||
755 | inc_syscr(current); | ||
756 | return ret; | ||
757 | } | ||
758 | |||
759 | SYSCALL_DEFINE5(pwritev, unsigned long, fd, const struct iovec __user *, vec, | ||
760 | unsigned long, vlen, u32, pos_high, u32, pos_low) | ||
761 | { | ||
762 | loff_t pos = ((loff_t)pos_high << 32) | pos_low; | ||
763 | struct file *file; | ||
764 | ssize_t ret = -EBADF; | ||
765 | int fput_needed; | ||
766 | |||
767 | if (pos < 0) | ||
768 | return -EINVAL; | ||
769 | |||
770 | file = fget_light(fd, &fput_needed); | ||
771 | if (file) { | ||
772 | ret = -ESPIPE; | ||
773 | if (file->f_mode & FMODE_PWRITE) | ||
774 | ret = vfs_writev(file, vec, vlen, &pos); | ||
775 | fput_light(file, fput_needed); | ||
776 | } | ||
777 | |||
778 | if (ret > 0) | ||
779 | add_wchar(current, ret); | ||
780 | inc_syscw(current); | ||
781 | return ret; | ||
782 | } | ||
783 | |||
734 | static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, | 784 | static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, |
735 | size_t count, loff_t max) | 785 | size_t count, loff_t max) |
736 | { | 786 | { |