> On Fri, 9 Apr 2010, Michal Nazarewicz wrote: >> diff --git a/fs/timerfd.c b/fs/timerfd.c >> index 1bfc95a..4d2c371 100644 >> --- a/fs/timerfd.c >> +++ b/fs/timerfd.c >> @@ -109,31 +109,13 @@ static ssize_t timerfd_read(struct file *file, char __user *buf, size_t count, >> struct timerfd_ctx *ctx = file->private_data; >> ssize_t res; >> u64 ticks = 0; >> - DECLARE_WAITQUEUE(wait, current); >> >> if (count < sizeof(ticks)) >> return -EINVAL; >> spin_lock_irq(&ctx->wqh.lock); >> res = -EAGAIN; >> - if (!ctx->ticks && !(file->f_flags & O_NONBLOCK)) { >> - __add_wait_queue(&ctx->wqh, &wait); >> - for (res = 0;;) { >> - set_current_state(TASK_INTERRUPTIBLE); >> - if (ctx->ticks) { >> - res = 0; >> - break; >> - } >> - if (signal_pending(current)) { >> - res = -ERESTARTSYS; >> - break; >> - } >> - spin_unlock_irq(&ctx->wqh.lock); >> - schedule(); >> - spin_lock_irq(&ctx->wqh.lock); >> - } >> - __remove_wait_queue(&ctx->wqh, &wait); >> - __set_current_state(TASK_RUNNING); >> - } >> + if (!(file->f_flags & O_NONBLOCK)) >> + wait_event_interruptible_locked_irq(ctx->wqh, ctx->ticks); Thomas Gleixner <tglx@xxxxxxxxxxxxx> writes: > With this change we return -EAGAIN instead of -ERESTARTSYS when the > wait got interrupted by a signal. That means instead of restarting the > syscall we return -EAGAIN to user space. Stupid mistake, the following should fix it: + res = wait_event_interruptible_locked_irq(ctx->wqh, ctx->ticks); Sorry about that. I'll resubmit an updated patchset by the end of the week. -- Best regards, _ _ .o. | Liege of Serenly Enlightened Majesty of o' \,=./ `o ..o | Computer Science, Michal "mina86" Nazarewicz (o o) ooo +--<mina86-tlen.pl>--<jid:mina86-jabber.org>--ooO--(_)--Ooo-- -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html