diff options
author | H. J. Lu <hjl.tools@gmail.com> | 2012-02-14 13:30:41 -0800 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2012-02-20 12:48:48 -0800 |
commit | 4ee5c0d05ce9b4e48e586a1ee168f166d191ddda (patch) | |
tree | 72f0c221b933bf717cb0074c24c62811a1d44360 /fs | |
parent | ff88943a1471440cc6be7a11a942a5a8232bee61 (diff) |
compat: Create compat_sys_p{read,write}v64
For 32-bit ABIs which have real 64-bit registers, we don't want to
break the position argument into two. However, we still need compat
support to deal with 32-bit pointers, so we can't just use
sys_p{read,write} directly.
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/compat.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/fs/compat.c b/fs/compat.c index fa9d721ecfee..83d751c78885 100644 --- a/fs/compat.c +++ b/fs/compat.c @@ -1177,10 +1177,9 @@ compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec, } asmlinkage ssize_t -compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec, - unsigned long vlen, u32 pos_low, u32 pos_high) +compat_sys_preadv64(unsigned long fd, const struct compat_iovec __user *vec, + unsigned long vlen, loff_t pos) { - loff_t pos = ((loff_t)pos_high << 32) | pos_low; struct file *file; int fput_needed; ssize_t ret; @@ -1197,6 +1196,14 @@ compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec, return ret; } +asmlinkage ssize_t +compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec, + unsigned long vlen, u32 pos_low, u32 pos_high) +{ + loff_t pos = ((loff_t)pos_high << 32) | pos_low; + return compat_sys_preadv64(fd, vec, vlen, pos); +} + static size_t compat_writev(struct file *file, const struct compat_iovec __user *vec, unsigned long vlen, loff_t *pos) @@ -1236,10 +1243,9 @@ compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec, } asmlinkage ssize_t -compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec, - unsigned long vlen, u32 pos_low, u32 pos_high) +compat_sys_pwritev64(unsigned long fd, const struct compat_iovec __user *vec, + unsigned long vlen, loff_t pos) { - loff_t pos = ((loff_t)pos_high << 32) | pos_low; struct file *file; int fput_needed; ssize_t ret; @@ -1256,6 +1262,14 @@ compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec, return ret; } +asmlinkage ssize_t +compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec, + unsigned long vlen, u32 pos_low, u32 pos_high) +{ + loff_t pos = ((loff_t)pos_high << 32) | pos_low; + return compat_sys_pwritev64(fd, vec, vlen, pos); +} + asmlinkage long compat_sys_vmsplice(int fd, const struct compat_iovec __user *iov32, unsigned int nr_segs, unsigned int flags) |