fuse: enable asynchronous processing direct IO
authorMaxim Patlasov <mpatlasov@parallels.com>
Fri, 14 Dec 2012 15:21:08 +0000 (19:21 +0400)
committerMiklos Szeredi <mszeredi@suse.cz>
Wed, 17 Apr 2013 19:50:59 +0000 (21:50 +0200)
commitbcba24ccdc82f7415154cf87226c2577cea13a5c
tree10e9c4e70f82cab86bd3790cd7ccb6adccf5aff0
parent36cf66ed9f871fc0d0911921fba5873df3ddb2dc
fuse: enable asynchronous processing direct IO

In case of synchronous DIO request (i.e. read(2) or write(2) for a file
opened with O_DIRECT), the patch submits fuse requests asynchronously, but
waits for their completions before return from fuse_direct_IO().

In case of asynchronous DIO request (i.e. libaio io_submit() or a file opened
with O_DIRECT), the patch submits fuse requests asynchronously and return
-EIOCBQUEUED immediately.

The only special case is async DIO extending file. Here the patch falls back
to old behaviour because we can't return -EIOCBQUEUED and update i_size later,
without i_mutex hold. And we have no method to wait on real async I/O
requests.

The patch also clean __fuse_direct_write() up: it's better to update i_size
in its callers. Thanks Brian for suggestion.

Signed-off-by: Maxim Patlasov <mpatlasov@parallels.com>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
fs/fuse/file.c