On Fri, 9 Apr 2010, Michal Nazarewicz wrote: > This patch modifies the fs/timerfd.c to use the newly created > wait_event_interruptible_locked_irq() macro. This replaces an open > code implementation with a single macro call. And thereby breaks the code. :( > Signed-off-by: Michal Nazarewicz <m.nazarewicz@xxxxxxxxxxx> > Cc: Kyungmin Park <kyungmin.park@xxxxxxxxxxx> > Cc: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > --- > fs/timerfd.c | 22 ++-------------------- > 1 files changed, 2 insertions(+), 20 deletions(-) > > 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); 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. You need to return that information from wait_event.....(). Thanks, tglx -- 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