From: Jeff Dike <jdike@addtoit.com>

On reboot, all signals and signal sources are disabled so that
late-arriving signals don't show up after the reboot exec, confusing the
new image, which is not expecting signals yet.

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/arch/um/include/irq_user.h  |    1 +
 25-akpm/arch/um/include/os.h        |    1 +
 25-akpm/arch/um/include/time_user.h |    1 +
 25-akpm/arch/um/kernel/irq_user.c   |   14 ++++++++++++++
 25-akpm/arch/um/kernel/time.c       |    9 +++++++++
 25-akpm/arch/um/os-Linux/file.c     |   10 ++++++++++
 6 files changed, 36 insertions(+)

diff -puN arch/um/include/irq_user.h~uml-disable-pending-signals-across-a-reboot arch/um/include/irq_user.h
--- 25/arch/um/include/irq_user.h~uml-disable-pending-signals-across-a-reboot	2004-09-11 16:40:10.204667128 -0700
+++ 25-akpm/arch/um/include/irq_user.h	2004-09-11 16:40:10.214665608 -0700
@@ -14,6 +14,7 @@ extern void free_irq_by_irq_and_dev(int 
 extern void free_irq_by_fd(int fd);
 extern void reactivate_fd(int fd, int irqnum);
 extern void deactivate_fd(int fd, int irqnum);
+extern int deactivate_all_fds(void);
 extern void forward_interrupts(int pid);
 extern void init_irq_signals(int on_sigstack);
 extern void forward_ipi(int fd, int pid);
diff -puN arch/um/include/os.h~uml-disable-pending-signals-across-a-reboot arch/um/include/os.h
--- 25/arch/um/include/os.h~uml-disable-pending-signals-across-a-reboot	2004-09-11 16:40:10.205666976 -0700
+++ 25-akpm/arch/um/include/os.h	2004-09-11 16:40:10.214665608 -0700
@@ -140,6 +140,7 @@ extern int os_file_size(char *file, long
 extern int os_file_modtime(char *file, unsigned long *modtime);
 extern int os_pipe(int *fd, int stream, int close_on_exec);
 extern int os_set_fd_async(int fd, int owner);
+extern int os_clear_fd_async(int fd);
 extern int os_set_fd_block(int fd, int blocking);
 extern int os_accept_connection(int fd);
 extern int os_create_unix_socket(char *file, int len, int close_on_exec);
diff -puN arch/um/include/time_user.h~uml-disable-pending-signals-across-a-reboot arch/um/include/time_user.h
--- 25/arch/um/include/time_user.h~uml-disable-pending-signals-across-a-reboot	2004-09-11 16:40:10.207666672 -0700
+++ 25-akpm/arch/um/include/time_user.h	2004-09-11 16:40:10.215665456 -0700
@@ -11,6 +11,7 @@ extern void switch_timers(int to_real);
 extern void set_interval(int timer_type);
 extern void idle_sleep(int secs);
 extern void enable_timer(void);
+extern void disable_timer(void);
 extern unsigned long time_lock(void);
 extern void time_unlock(unsigned long);
 
diff -puN arch/um/kernel/irq_user.c~uml-disable-pending-signals-across-a-reboot arch/um/kernel/irq_user.c
--- 25/arch/um/kernel/irq_user.c~uml-disable-pending-signals-across-a-reboot	2004-09-11 16:40:10.208666520 -0700
+++ 25-akpm/arch/um/kernel/irq_user.c	2004-09-11 16:40:10.215665456 -0700
@@ -364,6 +364,20 @@ void deactivate_fd(int fd, int irqnum)
 	irq_unlock(flags);
 }
 
+int deactivate_all_fds(void)
+{
+	struct irq_fd *irq;
+	int err;
+
+	for(irq=active_fds;irq != NULL;irq = irq->next){
+		err = os_clear_fd_async(irq->fd);
+		if(err)
+			return(err);
+	}
+
+	return(0);
+}
+
 void forward_ipi(int fd, int pid)
 {
 	int err;
diff -puN arch/um/kernel/time.c~uml-disable-pending-signals-across-a-reboot arch/um/kernel/time.c
--- 25/arch/um/kernel/time.c~uml-disable-pending-signals-across-a-reboot	2004-09-11 16:40:10.209666368 -0700
+++ 25-akpm/arch/um/kernel/time.c	2004-09-11 16:40:10.216665304 -0700
@@ -54,6 +54,15 @@ void enable_timer(void)
 		       errno);
 }
 
+void disable_timer(void)
+{
+	struct itimerval disable = ((struct itimerval) { { 0, 0 }, { 0, 0 }});
+	if((setitimer(ITIMER_VIRTUAL, &disable, NULL) < 0) ||
+	   (setitimer(ITIMER_REAL, &disable, NULL) < 0))
+		printk("disnable_timer - setitimer failed, errno = %d\n",
+		       errno);
+}
+
 void switch_timers(int to_real)
 {
 	struct itimerval disable = ((struct itimerval) { { 0, 0 }, { 0, 0 }});
diff -puN arch/um/os-Linux/file.c~uml-disable-pending-signals-across-a-reboot arch/um/os-Linux/file.c
--- 25/arch/um/os-Linux/file.c~uml-disable-pending-signals-across-a-reboot	2004-09-11 16:40:10.211666064 -0700
+++ 25-akpm/arch/um/os-Linux/file.c	2004-09-11 16:40:10.216665304 -0700
@@ -495,6 +495,16 @@ int os_set_fd_async(int fd, int owner)
 	return(0);
 }
 
+int os_clear_fd_async(int fd)
+{
+	int flags = fcntl(fd, F_GETFL);
+
+	flags &= ~(O_ASYNC | O_NONBLOCK);
+	if(fcntl(fd, F_SETFL, flags) < 0)
+		return(-errno);
+	return(0);
+}
+
 int os_set_fd_block(int fd, int blocking)
 {
 	int flags;
_