|
@@ -731,6 +731,56 @@ SYSCALL_DEFINE3(writev, unsigned long, fd, const struct iovec __user *, vec,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+SYSCALL_DEFINE5(preadv, unsigned long, fd, const struct iovec __user *, vec,
|
|
|
+ unsigned long, vlen, u32, pos_high, u32, pos_low)
|
|
|
+{
|
|
|
+ loff_t pos = ((loff_t)pos_high << 32) | pos_low;
|
|
|
+ struct file *file;
|
|
|
+ ssize_t ret = -EBADF;
|
|
|
+ int fput_needed;
|
|
|
+
|
|
|
+ if (pos < 0)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ file = fget_light(fd, &fput_needed);
|
|
|
+ if (file) {
|
|
|
+ ret = -ESPIPE;
|
|
|
+ if (file->f_mode & FMODE_PREAD)
|
|
|
+ ret = vfs_readv(file, vec, vlen, &pos);
|
|
|
+ fput_light(file, fput_needed);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ret > 0)
|
|
|
+ add_rchar(current, ret);
|
|
|
+ inc_syscr(current);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+SYSCALL_DEFINE5(pwritev, unsigned long, fd, const struct iovec __user *, vec,
|
|
|
+ unsigned long, vlen, u32, pos_high, u32, pos_low)
|
|
|
+{
|
|
|
+ loff_t pos = ((loff_t)pos_high << 32) | pos_low;
|
|
|
+ struct file *file;
|
|
|
+ ssize_t ret = -EBADF;
|
|
|
+ int fput_needed;
|
|
|
+
|
|
|
+ if (pos < 0)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ file = fget_light(fd, &fput_needed);
|
|
|
+ if (file) {
|
|
|
+ ret = -ESPIPE;
|
|
|
+ if (file->f_mode & FMODE_PWRITE)
|
|
|
+ ret = vfs_writev(file, vec, vlen, &pos);
|
|
|
+ fput_light(file, fput_needed);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ret > 0)
|
|
|
+ add_wchar(current, ret);
|
|
|
+ inc_syscw(current);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
|
|
|
size_t count, loff_t max)
|
|
|
{
|