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

 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);
 
_