Signed-off-by: Andrew Morton --- 25-akpm/drivers/char/hpet.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) diff -puN drivers/char/hpet.c~hpet-free_irq-deadlock-fix drivers/char/hpet.c --- 25/drivers/char/hpet.c~hpet-free_irq-deadlock-fix Wed Jun 9 14:36:42 2004 +++ 25-akpm/drivers/char/hpet.c Wed Jun 9 14:36:42 2004 @@ -300,6 +300,7 @@ static int hpet_release(struct inode *in { struct hpet_dev *devp; struct hpet_timer *timer; + int irq = 0; devp = file->private_data; timer = devp->hd_timer; @@ -309,10 +310,8 @@ static int hpet_release(struct inode *in writeq((readq(&timer->hpet_config) & ~Tn_INT_ENB_CNF_MASK), &timer->hpet_config); - if (devp->hd_irq) { - free_irq(devp->hd_irq, devp); - devp->hd_irq = 0; - } + irq = devp->hd_irq; + devp->hd_irq = 0; devp->hd_ireqfreq = 0; @@ -328,6 +327,9 @@ static int hpet_release(struct inode *in devp->hd_flags &= ~(HPET_OPEN | HPET_IE | HPET_PERIODIC); spin_unlock_irq(&hpet_lock); + if (irq) + free_irq(irq, devp); + if (file->f_flags & FASYNC) hpet_fasync(-1, file, 0); _