From: Jakub Jelinek <jakub@redhat.com>

The first change removes just a useless put_user (si_int and si_ptr are
part of the same union, si_ptr is on all arches covering whole union), the
rest is fixes for signal handling of SI_MESGQ.


---

 25-akpm/arch/ia64/ia32/ia32_signal.c     |    4 ++--
 25-akpm/arch/mips/kernel/signal32.c      |    4 ++--
 25-akpm/arch/s390/kernel/compat_signal.c |    4 ++--
 25-akpm/arch/sparc64/kernel/signal32.c   |    4 ++--
 25-akpm/arch/x86_64/ia32/ia32_signal.c   |    4 ++--
 25-akpm/include/asm-mips/siginfo.h       |    2 +-
 25-akpm/kernel/signal.c                  |    1 -
 7 files changed, 11 insertions(+), 12 deletions(-)

diff -puN arch/ia64/ia32/ia32_signal.c~fix-mq-32-bit-compatibility arch/ia64/ia32/ia32_signal.c
--- 25/arch/ia64/ia32/ia32_signal.c~fix-mq-32-bit-compatibility	2004-04-14 21:04:46.805055000 -0700
+++ 25-akpm/arch/ia64/ia32/ia32_signal.c	2004-04-14 21:04:46.841049528 -0700
@@ -114,8 +114,8 @@ copy_siginfo_from_user32 (siginfo_t *to,
 			err |= __get_user(to->si_band, &from->si_band);
 			err |= __get_user(to->si_fd, &from->si_fd);
 			break;
-		      case __SI_RT: /* This is not generated by the kernel as of now.  */
-		      case __SI_MESGQ:
+		      case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
+		      case __SI_MESGQ >> 16:
 			err |= __get_user(to->si_pid, &from->si_pid);
 			err |= __get_user(to->si_uid, &from->si_uid);
 			err |= __get_user(to->si_int, &from->si_int);
diff -puN arch/mips/kernel/signal32.c~fix-mq-32-bit-compatibility arch/mips/kernel/signal32.c
--- 25/arch/mips/kernel/signal32.c~fix-mq-32-bit-compatibility	2004-04-14 21:04:46.807054696 -0700
+++ 25-akpm/arch/mips/kernel/signal32.c	2004-04-14 21:04:46.840049680 -0700
@@ -358,8 +358,8 @@ static int copy_siginfo_to_user32(siginf
 			err |= __put_user(from->si_band, &to->si_band);
 			err |= __put_user(from->si_fd, &to->si_fd);
 			break;
-		case __SI_RT: /* This is not generated by the kernel as of now.  */
-		case __SI_MESGQ:
+		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
+		case __SI_MESGQ >> 16:
 			err |= __put_user(from->si_pid, &to->si_pid);
 			err |= __put_user(from->si_uid, &to->si_uid);
 			err |= __put_user(from->si_int, &to->si_int);
diff -puN arch/s390/kernel/compat_signal.c~fix-mq-32-bit-compatibility arch/s390/kernel/compat_signal.c
--- 25/arch/s390/kernel/compat_signal.c~fix-mq-32-bit-compatibility	2004-04-14 21:04:46.817053176 -0700
+++ 25-akpm/arch/s390/kernel/compat_signal.c	2004-04-14 21:04:46.840049680 -0700
@@ -74,8 +74,8 @@ int copy_siginfo_to_user32(siginfo_t32 *
 		err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
 	else {
 		switch (from->si_code >> 16) {
-		case __SI_RT: /* This is not generated by the kernel as of now.  */
-		case __SI_MESGQ:
+		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
+		case __SI_MESGQ >> 16:
 			err |= __put_user(from->si_int, &to->si_int);
 			/* fallthrough */
 		case __SI_KILL >> 16:
diff -puN arch/sparc64/kernel/signal32.c~fix-mq-32-bit-compatibility arch/sparc64/kernel/signal32.c
--- 25/arch/sparc64/kernel/signal32.c~fix-mq-32-bit-compatibility	2004-04-14 21:04:46.818053024 -0700
+++ 25-akpm/arch/sparc64/kernel/signal32.c	2004-04-14 21:04:46.839049832 -0700
@@ -129,8 +129,8 @@ int copy_siginfo_to_user32(siginfo_t32 _
 			err |= __put_user(from->si_trapno, &to->si_trapno);
 			err |= __put_user((long)from->si_addr, &to->si_addr);
 			break;
-		case __SI_RT: /* This is not generated by the kernel as of now.  */
-		case __SI_MESGQ:
+		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
+		case __SI_MESGQ >> 16:
 			err |= __put_user(from->si_pid, &to->si_pid);
 			err |= __put_user(from->si_uid, &to->si_uid);
 			err |= __put_user(from->si_int, &to->si_int);
diff -puN arch/x86_64/ia32/ia32_signal.c~fix-mq-32-bit-compatibility arch/x86_64/ia32/ia32_signal.c
--- 25/arch/x86_64/ia32/ia32_signal.c~fix-mq-32-bit-compatibility	2004-04-14 21:04:46.819052872 -0700
+++ 25-akpm/arch/x86_64/ia32/ia32_signal.c	2004-04-14 21:04:46.842049376 -0700
@@ -85,8 +85,8 @@ int ia32_copy_siginfo_to_user(siginfo_t3
 			err |= __put_user(from->si_overrun, &to->si_overrun); 
 			err |= __put_user((u32)(u64)from->si_ptr, &to->si_ptr);
 			break;
-		case __SI_RT: /* This is not generated by the kernel as of now.  */
-		case __SI_MESGQ:
+		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
+		case __SI_MESGQ >> 16:
 			err |= __put_user(from->si_uid, &to->si_uid);
 			err |= __put_user(from->si_int, &to->si_int);
 			break;
diff -puN include/asm-mips/siginfo.h~fix-mq-32-bit-compatibility include/asm-mips/siginfo.h
--- 25/include/asm-mips/siginfo.h~fix-mq-32-bit-compatibility	2004-04-14 21:04:46.827051656 -0700
+++ 25-akpm/include/asm-mips/siginfo.h	2004-04-14 21:04:46.836050288 -0700
@@ -175,7 +175,7 @@ typedef struct siginfo32 {
 #undef SI_MESGQ
 #define SI_ASYNCIO	-2	/* sent by AIO completion */
 #define SI_TIMER __SI_CODE(__SI_TIMER,-3) /* sent by timer expiration */
-#define SI_MESGQ	-4	/* sent by real time mesq state change */
+#define SI_MESGQ __SI_CODE(__SI_MESGQ,-4) /* sent by real time mesq state change */
 
 #ifdef __KERNEL__
 
diff -puN kernel/signal.c~fix-mq-32-bit-compatibility kernel/signal.c
--- 25/kernel/signal.c~fix-mq-32-bit-compatibility	2004-04-14 21:04:46.829051352 -0700
+++ 25-akpm/kernel/signal.c	2004-04-14 21:04:46.835050440 -0700
@@ -2060,7 +2060,6 @@ int copy_siginfo_to_user(siginfo_t __use
 	case __SI_MESGQ: /* But this is */
 		err |= __put_user(from->si_pid, &to->si_pid);
 		err |= __put_user(from->si_uid, &to->si_uid);
-		err |= __put_user(from->si_int, &to->si_int);
 		err |= __put_user(from->si_ptr, &to->si_ptr);
 		break;
 	default: /* this is just in case for now ... */

_