The attached patch adds the missing compat syscalls to the ia32 syscall table on ia64. We copied a few AIO related syscalls into fs/compat.c. Other compat archs may want to use them and get rid of private implementations. 25-akpm/fs/compat.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 98 insertions(+) diff -puN fs/compat.c~ia64-ia32-missing-compat-syscalls fs/compat.c --- 25/fs/compat.c~ia64-ia32-missing-compat-syscalls Fri Nov 7 16:33:38 2003 +++ 25-akpm/fs/compat.c Fri Nov 7 16:33:38 2003 @@ -554,3 +554,101 @@ asmlinkage long compat_sys_fcntl(unsigne return compat_sys_fcntl64(fd, cmd, arg); } +extern asmlinkage long sys_io_setup(unsigned nr_reqs, aio_context_t *ctx); + +asmlinkage long compat_sys_io_setup(unsigned nr_reqs, u32 *ctx32p) +{ + long ret; + aio_context_t ctx64; + compat_uptr_t uptr; + + mm_segment_t oldfs = get_fs(); + if (unlikely(get_user(uptr, ctx32p))) + return -EFAULT; + + ctx64 = (aio_context_t) compat_ptr(uptr); + set_fs(KERNEL_DS); + ret = sys_io_setup(nr_reqs, &ctx64); + set_fs(oldfs); + /* truncating is ok because it's a user address */ + if (!ret) + ret = put_user((u32) ctx64, ctx32p); + return ret; +} + +extern asmlinkage long sys_io_getevents(aio_context_t ctx_id, + long min_nr, + long nr, + struct io_event *events, + struct timespec *timeout); + +asmlinkage long compat_sys_io_getevents(aio_context_t ctx_id, + unsigned long min_nr, + unsigned long nr, + struct io_event *events, + struct compat_timespec *timeout) +{ + long ret; + struct timespec t; + struct timespec *ut = NULL; + + ret = -EFAULT; + if (unlikely(!access_ok(VERIFY_WRITE, events, + nr * sizeof(struct io_event)))) + goto out; + if (timeout) { + if (get_compat_timespec(&t, timeout)) + goto out; + + ut = compat_alloc_user_space(sizeof(*ut)); + if (copy_to_user(ut, &t, sizeof(t)) ) + goto out; + } + ret = sys_io_getevents(ctx_id, min_nr, nr, events, ut); + if (!ret && timeout && put_compat_timespec(&t, timeout)) + return -EFAULT; +out: + return ret; +} + +extern asmlinkage long sys_io_submit(aio_context_t, long, + struct iocb __user **); + +static inline long +copy_iocb(long nr, u32 *ptr32, u64 *ptr64) +{ + compat_uptr_t uptr; + long ret; + int i; + + ret = -EFAULT; + for (i = 0; i < nr; ++i) { + if (get_user(uptr, ptr32 + i)) + return ret; + if (put_user((u64)compat_ptr(uptr), ptr64 + i)) + return ret; + } + ret = 0; + return ret; +} + +#define MAX_AIO_SUBMITS (PAGE_SIZE/sizeof(struct iocb *)) + +asmlinkage long +compat_sys_io_submit(aio_context_t ctx_id, int nr, u32 *iocb) +{ + struct iocb **iocb64; + long ret; + + if (unlikely(nr < 0)) + return -EINVAL; + + if (nr > MAX_AIO_SUBMITS) + nr = MAX_AIO_SUBMITS; + + iocb64 = compat_alloc_user_space(nr * sizeof(*iocb64)); + ret = copy_iocb(nr, iocb, (u64 *) iocb64); + if (!ret) + ret = sys_io_submit(ctx_id, nr, iocb64); + return ret; +} _