From: Andrew Morton On sparc32: fs/read_write.c: In function 'rw_copy_check_uvector': fs/read_write.c:567: warning: implicit declaration of function 'vrfy_dir' fs/read_write.c:567: error: 'type' undeclared (first use in this function) fs/read_write.c:567: error: (Each undeclared identifier is reported only once fs/read_write.c:567: error: for each function it appears in.) distcc[26751] ERROR: compile fs/read_write.c on bix/32 failed This had extensive fallout. Perhaps it'd be better to work out the direction from the kiocb rather than passing it in. Cc: Zach Brown Cc: Christoph Hellwig Cc: Badari Pulavarty Cc: Benjamin LaHaise Cc: James Morris Signed-off-by: Andrew Morton --- fs/aio.c | 8 ++++---- fs/read_write.c | 12 ++++++------ include/linux/fs.h | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff -puN fs/read_write.c~add-vector-aio-support-fix fs/read_write.c --- a/fs/read_write.c~add-vector-aio-support-fix +++ a/fs/read_write.c @@ -508,7 +508,10 @@ ssize_t do_loop_readv_writev(struct file return ret; } -ssize_t rw_copy_check_uvector(const struct iovec __user * uvector, +/* A write operation does a read from user space and vice versa */ +#define vrfy_dir(type) ((type) == READ ? VERIFY_WRITE : VERIFY_READ) + +ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, unsigned long nr_segs, unsigned long fast_segs, struct iovec *fast_pointer, struct iovec **ret_pointer) @@ -576,9 +579,6 @@ out: return ret; } -/* A write operation does a read from user space and vice versa */ -#define vrfy_dir(type) ((type) == READ ? VERIFY_WRITE : VERIFY_READ) - static ssize_t do_readv_writev(int type, struct file *file, const struct iovec __user * uvector, unsigned long nr_segs, loff_t *pos) @@ -595,8 +595,8 @@ static ssize_t do_readv_writev(int type, goto out; } - ret = rw_copy_check_uvector(uvector, nr_segs, ARRAY_SIZE(iovstack), - iovstack, &iov); + ret = rw_copy_check_uvector(type, uvector, nr_segs, + ARRAY_SIZE(iovstack), iovstack, &iov); if (ret <= 0) goto out; diff -puN include/linux/fs.h~add-vector-aio-support-fix include/linux/fs.h --- a/include/linux/fs.h~add-vector-aio-support-fix +++ a/include/linux/fs.h @@ -1129,7 +1129,7 @@ struct inode_operations { struct seq_file; -ssize_t rw_copy_check_uvector(const struct iovec __user * uvector, +ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, unsigned long nr_segs, unsigned long fast_segs, struct iovec *fast_pointer, struct iovec **ret_pointer); diff -puN fs/aio.c~add-vector-aio-support-fix fs/aio.c --- a/fs/aio.c~add-vector-aio-support-fix +++ a/fs/aio.c @@ -1387,11 +1387,11 @@ static ssize_t aio_fsync(struct kiocb *i return ret; } -static ssize_t aio_setup_vectored_rw(struct kiocb *kiocb) +static ssize_t aio_setup_vectored_rw(int type, struct kiocb *kiocb) { ssize_t ret; - ret = rw_copy_check_uvector((struct iovec __user *)kiocb->ki_buf, + ret = rw_copy_check_uvector(type, (struct iovec __user *)kiocb->ki_buf, kiocb->ki_nbytes, 1, &kiocb->ki_inline_vec, &kiocb->ki_iovec); if (ret < 0) @@ -1473,7 +1473,7 @@ static ssize_t aio_setup_iocb(struct kio ret = security_file_permission(file, MAY_READ); if (unlikely(ret)) break; - ret = aio_setup_vectored_rw(kiocb); + ret = aio_setup_vectored_rw(READ, kiocb); if (ret) break; ret = -EINVAL; @@ -1487,7 +1487,7 @@ static ssize_t aio_setup_iocb(struct kio ret = security_file_permission(file, MAY_WRITE); if (unlikely(ret)) break; - ret = aio_setup_vectored_rw(kiocb); + ret = aio_setup_vectored_rw(WRITE, kiocb); if (ret) break; ret = -EINVAL; _