This is an of the waitid patch that fixes some things that people pointed out to me. To do the 64->32 struct rusage field correctly, I made the static function put_compat_rusage from linux/compat.c global and swapped its argument order to match the other public functions of that form. Signed-off-by: Roland McGrath Signed-off-by: Andrew Morton --- 25-akpm/arch/x86_64/ia32/ia32_signal.c | 4 ++-- 25-akpm/include/linux/compat.h | 2 ++ 25-akpm/kernel/compat.c | 6 +++--- 25-akpm/kernel/exit.c | 3 ++- 4 files changed, 9 insertions(+), 6 deletions(-) diff -puN arch/x86_64/ia32/ia32_signal.c~waitid-system-call-update arch/x86_64/ia32/ia32_signal.c --- 25/arch/x86_64/ia32/ia32_signal.c~waitid-system-call-update 2004-08-15 23:01:09.135757528 -0700 +++ 25-akpm/arch/x86_64/ia32/ia32_signal.c 2004-08-15 23:01:09.143756312 -0700 @@ -74,8 +74,8 @@ int ia32_copy_siginfo_to_user(siginfo_t3 err |= __put_user(from->si_utime, &to->si_utime); err |= __put_user(from->si_stime, &to->si_stime); err |= __put_user(from->si_status, &to->si_status); - err |= __copy_to_user(&to->si_rusage, &from->si_rusage, - sizeof(to->si_rusage)); + err |= put_compat_rusage(&from->si_rusage, + &to->si_rusage); default: case __SI_KILL >> 16: err |= __put_user(from->si_uid, &to->si_uid); diff -puN include/linux/compat.h~waitid-system-call-update include/linux/compat.h --- 25/include/linux/compat.h~waitid-system-call-update 2004-08-15 23:01:09.137757224 -0700 +++ 25-akpm/include/linux/compat.h 2004-08-15 23:01:09.144756160 -0700 @@ -79,6 +79,8 @@ struct compat_rusage { compat_long_t ru_nivcsw; }; +extern int put_compat_rusage(const struct rusage *, struct compat_rusage __user *); + struct compat_dirent { u32 d_ino; compat_off_t d_off; diff -puN kernel/compat.c~waitid-system-call-update kernel/compat.c --- 25/kernel/compat.c~waitid-system-call-update 2004-08-15 23:01:09.138757072 -0700 +++ 25-akpm/kernel/compat.c 2004-08-15 23:01:09.145756008 -0700 @@ -310,7 +310,7 @@ asmlinkage long compat_sys_getrlimit (un return ret; } -static long put_compat_rusage(struct compat_rusage __user *ru, struct rusage *r) +int put_compat_rusage(const struct rusage *r, struct compat_rusage __user *ru) { if (!access_ok(VERIFY_WRITE, ru, sizeof(*ru)) || __put_user(r->ru_utime.tv_sec, &ru->ru_utime.tv_sec) || @@ -348,7 +348,7 @@ asmlinkage long compat_sys_getrusage(int if (ret) return ret; - if (put_compat_rusage(ru, &r)) + if (put_compat_rusage(&r, ru)) return -EFAULT; return 0; @@ -374,7 +374,7 @@ compat_sys_wait4(compat_pid_t pid, compa set_fs (old_fs); if (ret > 0) { - if (put_compat_rusage(ru, &r)) + if (put_compat_rusage(&r, ru)) return -EFAULT; if (stat_addr && put_user(status, stat_addr)) return -EFAULT; diff -puN kernel/exit.c~waitid-system-call-update kernel/exit.c --- 25/kernel/exit.c~waitid-system-call-update 2004-08-15 23:01:09.140756768 -0700 +++ 25-akpm/kernel/exit.c 2004-08-15 23:01:09.144756160 -0700 @@ -1277,7 +1277,8 @@ repeat: continue; spin_lock_irq(&p->sighand->siglock); if (p->signal->stop_state < 0) { - pid_t pid, uid; + pid_t pid; + uid_t uid; if (!(options & WNOWAIT)) p->signal->stop_state = 0; spin_unlock_irq(&p->sighand->siglock); _