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. Signed-off-by: Jan Kara <jack@xxxxxxx> --- 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); -- 1.6.4.2 -- 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