summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorBrian Foster <bfoster@redhat.com>2013-05-30 15:35:50 -0400
committerMiklos Szeredi <mszeredi@suse.cz>2013-06-03 15:15:42 +0200
commitc9ecf989cc7626e9edf8abef79f64b909542129b (patch)
tree4d86f444e40c8dfd0157e7b7062290735b1578de /fs
parent28420dad233520811c0e0860e7fb4975ed863fc4 (diff)
downloadlinux-stable-c9ecf989cc7626e9edf8abef79f64b909542129b.tar.gz
linux-stable-c9ecf989cc7626e9edf8abef79f64b909542129b.tar.bz2
linux-stable-c9ecf989cc7626e9edf8abef79f64b909542129b.zip
fuse: return -EIOCBQUEUED from fuse_direct_IO() for all async requests
If request submission fails for an async request (i.e., get_user_pages() returns -ERESTARTSYS), we currently skip the -EIOCBQUEUED return and drop into wait_for_sync_kiocb() forever. Avoid this by always returning -EIOCBQUEUED for async requests. If an error occurs, the error is passed into fuse_aio_complete(), returned via aio_complete() and thus propagated to userspace via io_getevents(). Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Maxim Patlasov <MPatlasov@parallels.com> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Diffstat (limited to 'fs')
-rw-r--r--fs/fuse/file.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index d9f467907791..b3ad8d61a162 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -2432,7 +2432,7 @@ fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
fuse_aio_complete(io, ret < 0 ? ret : 0, -1);
/* we have a non-extending, async request, so return */
- if (ret > 0 && !is_sync_kiocb(iocb))
+ if (!is_sync_kiocb(iocb))
return -EIOCBQUEUED;
ret = wait_on_sync_kiocb(iocb);