Re: [PATCH v2] Add preadv and pwritev system calls.
[Posted December 17, 2008 by jake]
| From: |
| Arnd Bergmann <arnd-AT-arndb.de> |
| To: |
| Matthew Wilcox <matthew-AT-wil.cx> |
| Subject: |
| Re: [PATCH v2] Add preadv and pwritev system calls. |
| Date: |
| Fri, 12 Dec 2008 20:47:30 +0100 |
| Message-ID: |
| <200812122047.31405.arnd@arndb.de> |
| Cc: |
| Gerd Hoffmann <kraxel-AT-redhat.com>, linux-kernel-AT-vger.kernel.org,
linux-arch-AT-vger.kernel.org |
| Archive‑link: | |
Article |
On Friday 12 December 2008, Matthew Wilcox wrote:
> Things will go much better if we can prototype these as:
>
> asmlinkage ssize_t sys_preadv(unsigned int fd, const struct iovec __user *vec,
> loff_t pos, unsigned long vlen);
> asmlinkage ssize_t sys_pwritev(unsigned int fd, const struct iovec __user *vec,
> loff_t pos, unsigned long vlen);
I would vote for doing it the same way as sys_llseek, which avoids
this issue entirely by passing the upper half of pos sepearately:
asmlinkage ssize_t sys_preadv(unsigned long fd,
const struct iovec __user *vec,
unsigned long vlen,
unsigned long pos_high, unsigned long pos_low);
asmlinkage ssize_t sys_pwritev(unsigned long fd,
const struct iovec __user *vec,
unsigned long vlen,
unsigned long pos_high, unsigned long pos_low);
This is the only way I can see that lets us use a shared
compat_sys_preadv/pwritev across all 64 bit architectures.
The libc can then add a trivial wrapper around the syscalls
to get the regular calling conventions.
Aside from that, have you considered doing something even more flexible,
like this?
struct piovec {
void __user *iov_base;
__kernel_size_t iov_len;
__kernel_loff_t pos;
};
asmlinkage ssize_t sys_pwritev(unsigned long fd,
const struct piovec __user *vec,
unsigned long vlen);
Arnd <><