From 238e43c9edc68ccf80c2de8535ea9db0c874805e Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Wed, 22 Sep 2010 13:05:03 -0700 Subject: [PATCH] --- yaml --- r: 210913 b: refs/heads/master c: a0c42bac79731276c9b2f28d54f9e658fcf843a2 h: refs/heads/master i: 210911: 97227960a393f8344f3ab1dd7d8d5bb26ab6fee3 v: v3 --- [refs] | 2 +- trunk/fs/aio.c | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 7ab9a3c7fdff..7172f63bab51 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d1908362ae0b97374eb8328fbb471576332f9fb1 +refs/heads/master: a0c42bac79731276c9b2f28d54f9e658fcf843a2 diff --git a/trunk/fs/aio.c b/trunk/fs/aio.c index 1320b2a05fb2..250b0a73c8a8 100644 --- a/trunk/fs/aio.c +++ b/trunk/fs/aio.c @@ -712,8 +712,16 @@ 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);