From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeff Moyer Subject: Re: [PATCH] aio: Do not return -ERESTARTSYS (and friends) from AIO Date: Wed, 18 Aug 2010 14:31:02 -0400 Message-ID: References: <1277336627-31193-1-git-send-email-jack@suse.cz> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: linux-fsdevel@vger.kernel.org, Andrew Morton , hch@infradead.org, viro@ZenIV.linux.org.uk To: Jan Kara Return-path: Received: from mx1.redhat.com ([209.132.183.28]:50056 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752888Ab0HRSbS (ORCPT ); Wed, 18 Aug 2010 14:31:18 -0400 In-Reply-To: <1277336627-31193-1-git-send-email-jack@suse.cz> (Jan Kara's message of "Thu, 24 Jun 2010 01:43:47 +0200") Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Jan Kara writes: > We must not leak ERESTARTSYS (and similar error codes) to userspace as a return > value of IO. Because other AIO could have been already submitted by the same > io_submit syscall, there is no easy way to restart the syscall. So we do not > have much other options than fail the particular IO with EINTR. This is a confusing problem description. First, I'm assuming you actually experienced this, is that right? Care to share the details of that? Next, assuming we can get ERSTARTSYS and friends, it will be the return code of a single iocb (reaped via io_getevents), not the return code of the io_submit system call. I'm not saying this is right, I'm just saying that your description of the problem is misleading. Cheers, Jeff > Signed-off-by: Jan Kara > --- > fs/aio.c | 12 +++++++++++- > 1 files changed, 11 insertions(+), 1 deletions(-) > > Not sure who should merge it... Andrew? > > diff --git a/fs/aio.c b/fs/aio.c > index 1ccf25c..66e2d42 100644 > --- a/fs/aio.c > +++ b/fs/aio.c > @@ -712,8 +712,18 @@ static ssize_t aio_run_iocb(struct kiocb *iocb) > */ > ret = retry(iocb); > > - if (ret != -EIOCBRETRY && ret != -EIOCBQUEUED) > + if (ret != -EIOCBRETRY && ret != -EIOCBQUEUED) { > + /* > + * There's no easy way to restart the syscall since other AIO's > + * may be already running. Just fail this IO with EINTR. > + */ > + if (unlikely(ret == -ERESTARTSYS || > + ret == -ERESTARTNOINTR || > + ret == -ERESTARTNOHAND || > + ret == -ERESTART_RESTARTBLOCK)) > + ret = -EINTR; > aio_complete(iocb, ret, 0); > + } > out: > spin_lock_irq(&ctx->ctx_lock);