X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fum%2Fkernel%2Firq_user.c;h=6d6f9484b884d357240beaf65266c0d376644e55;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=38e66ac84637ddef1e8176aedd1566ddfc182893;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/arch/um/kernel/irq_user.c b/arch/um/kernel/irq_user.c index 38e66ac84..6d6f9484b 100644 --- a/arch/um/kernel/irq_user.c +++ b/arch/um/kernel/irq_user.c @@ -83,8 +83,11 @@ void sigio_handler(int sig, union uml_pt_regs *regs) * can be freed here. */ next = irq_fd->next; - if(irq_fd->freed) + if(irq_fd->freed){ free_irq(irq_fd->irq, irq_fd->id); + free_irq_by_irq_and_dev(irq_fd->irq, + irq_fd->id); + } } } } @@ -263,7 +266,7 @@ static int same_irq_and_dev(struct irq_fd *irq, void *d) return((irq->irq == data->irq) && (irq->id == data->dev)); } -void free_irq_by_irq_and_dev(int irq, void *dev) +void free_irq_by_irq_and_dev(unsigned int irq, void *dev) { struct irq_and_dev data = ((struct irq_and_dev) { .irq = irq, .dev = dev }); @@ -374,6 +377,8 @@ int deactivate_all_fds(void) if(err) return(err); } + /* If there is a signal already queued, after unblocking ignore it */ + set_handler(SIGIO, SIG_IGN, 0, -1); return(0); }