Commit 9eb82c92 authored by Jeff Dike's avatar Jeff Dike Committed by Linus Torvalds

[PATCH] uml: disable pending signals across a reboot

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: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 9bef4e33
......@@ -14,6 +14,7 @@ extern void free_irq_by_irq_and_dev(int irq, void *dev_id);
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);
......
......@@ -140,6 +140,7 @@ extern int os_file_size(char *file, long long *size_out);
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);
......
......@@ -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);
......
......@@ -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;
......
......@@ -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 }});
......
......@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment