Re: [PATCH v2] Add preadv and pwritev system calls.

From: Arnd Bergmann
Date: Fri Dec 12 2008 - 14:49:21 EST


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 <><
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/