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 <roland@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 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-20 00:01:57.725901560 -0700
+++ 25-akpm/arch/x86_64/ia32/ia32_signal.c	2004-08-20 00:01:57.733900344 -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-20 00:01:57.727901256 -0700
+++ 25-akpm/include/linux/compat.h	2004-08-20 00:01:57.734900192 -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-20 00:01:57.728901104 -0700
+++ 25-akpm/kernel/compat.c	2004-08-20 00:01:57.734900192 -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-20 00:01:57.730900800 -0700
+++ 25-akpm/kernel/exit.c	2004-08-20 00:01:57.735900040 -0700
@@ -1263,7 +1263,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);
_