fuse: return -EIOCBQUEUED from fuse_direct_IO() for all async requests
authorBrian Foster <bfoster@redhat.com>
Thu, 30 May 2013 19:35:50 +0000 (15:35 -0400)
committerMiklos Szeredi <mszeredi@suse.cz>
Mon, 3 Jun 2013 13:15:42 +0000 (15:15 +0200)
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>
fs/fuse/file.c

index d9f467907791cb4fee5dbd426828d8c8952c824d..b3ad8d61a16279a4aa21d38a12348041220d5377 100644 (file)
@@ -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);