- Need to set TASK_INTERRUPTIBLE before checking devp->hd_irqdata. Otherwise the wakeup from hpet_interrupt() could be missed. Signed-off-by: Andrew Morton --- 25-akpm/drivers/char/hpet.c | 13 ++++++------- 1 files changed, 6 insertions(+), 7 deletions(-) diff -puN drivers/char/hpet.c~hpet-fixes-fix drivers/char/hpet.c --- 25/drivers/char/hpet.c~hpet-fixes-fix 2004-06-24 13:21:25.737666224 -0700 +++ 25-akpm/drivers/char/hpet.c 2004-06-24 13:22:59.063478544 -0700 @@ -196,7 +196,9 @@ hpet_read(struct file *file, char __user add_wait_queue(&devp->hd_waitqueue, &wait); - do { + for ( ; ; ) { + set_current_state(TASK_INTERRUPTIBLE); + spin_lock_irq(&hpet_lock); data = devp->hd_irqdata; devp->hd_irqdata = 0; @@ -211,17 +213,14 @@ hpet_read(struct file *file, char __user retval = -ERESTARTSYS; goto out; } - - set_current_state(TASK_INTERRUPTIBLE); schedule(); - - } while (1); + } retval = put_user(data, (unsigned long __user *)buf); if (!retval) retval = sizeof(unsigned long); - out: - current->state = TASK_RUNNING; +out: + __set_current_state(TASK_RUNNING); remove_wait_queue(&devp->hd_waitqueue, &wait); return retval; _