summaryrefslogtreecommitdiffstats
path: root/fs/aio.c
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2010-10-12 16:41:22 +0200
committerThomas Gleixner <tglx@linutronix.de>2010-10-12 16:41:26 +0200
commit7c5f13519a67aa7ba3a99155f128d4bdef87d087 (patch)
treee4d0537092930a53a85932de83a7861990c58607 /fs/aio.c
parent5e62feabcc3e4127a084701ec54ffe891985b7e8 (diff)
parent021989622810b02aab4b24f91e1f5ada2b654579 (diff)
Merge branch 'x86/urgent' of into irq/sparseirq
Reason: Pull in the latest io_apic bugfixes Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'fs/aio.c')
-rw-r--r--fs/aio.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/fs/aio.c b/fs/aio.c
index 1320b2a05fb..250b0a73c8a 100644
--- a/fs/aio.c
+++ b/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);