fuse: O_DIRECT support for files
Subsystems (2)
PATCH v5 1/1 fuse: O_DIRECT support for files
Implement ->direct_IO() method in aops. The ->direct_IO() method combines the existing fuse_direct_read/fuse_direct_write methods to implement O_DIRECT functionality.
Reaching ->direct_IO() in the read path via generic_file_aio_read ensures proper synchronization with page cache with its existing framework.
Reaching ->direct_IO() in the write path via fuse_file_aio_write is made to come via generic_file_direct_write() which makes it play nice with the page cache w.r.t other mmap pages etc.
On files marked 'direct_io' by the filesystem server, IO always follows the fuse_direct_read/write path. There is no effect of fcntl(O_DIRECT) and it always succeeds.
On files not marked with 'direct_io' by the filesystem server, the IO path depends on O_DIRECT flag by the application. This can be passed at the time of open() as well as via fcntl().
Note that asynchronous O_DIRECT iocb jobs are completed synchronously always (this has been the case with FUSE even before this patch)
--- fs/fuse/dir.c | 3 - fs/fuse/file.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 112 insertions(+), 20 deletions(-)
fs/fuse/dir.c +0 -3
@@ -387,9 +387,6 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry,if (fc->no_create)return -ENOSYS ; -if (flags &O_DIRECT ) -return -EINVAL ; - forget =fuse_alloc_forget ();if (!forget)return -ENOMEM ;
fs/fuse/file.c +112 -17
192 lines not on this page · raw message
Signature · 1 line
1.7.4.4
Quoted 15 lines · Anand Avati
Implement ->direct_IO() method in aops. The ->direct_IO() method combines the existing fuse_direct_read/fuse_direct_write methods to implement
O_DIRECTfunctionality.Reaching ->direct_IO() in the read path via
generic_file_aio_readensures proper synchronization with page cache with its existing framework.Reaching ->direct_IO() in the write path via
fuse_file_aio_writeis made to come viageneric_file_direct_write()which makes it play nice with the page cache w.r.t other mmap pages etc.On files marked '
direct_io' by the filesystem server, IO always follows the fuse_direct_read/write path. There is no effect offcntl(O_DIRECT)and it always succeeds.
Quoted 8 lines
On files not marked with '
direct_io' by the filesystem server, the IO path depends onO_DIRECTflag by the application. This can be passed at the time ofopen()as well as viafcntl().Note that asynchronous
O_DIRECTiocb jobs are completed synchronously always (this has been the case with FUSE even before this patch)Signed-off-by Anand Avati <[email protected]>
Looks good to me.
Quoted 21 lines · Jeff Moyer
Quoted 19 lines · Anand Avati
Implement ->direct_IO() method in aops. The ->direct_IO() method combines the existing fuse_direct_read/fuse_direct_write methods to implement
O_DIRECTfunctionality.Reaching ->direct_IO() in the read path via
generic_file_aio_readensures proper synchronization with page cache with its existing framework.Reaching ->direct_IO() in the write path via
fuse_file_aio_writeis made to come viageneric_file_direct_write()which makes it play nice with the page cache w.r.t other mmap pages etc.On files marked '
direct_io' by the filesystem server, IO always follows the fuse_direct_read/write path. There is no effect offcntl(O_DIRECT)and it always succeeds.On files not marked with '
direct_io' by the filesystem server, the IO path depends onO_DIRECTflag by the application. This can be passed at the time ofopen()as well as viafcntl().
Quoted 8 lines
Quoted 4 lines
Note that asynchronous
O_DIRECTiocb jobs are completed synchronously always (this has been the case with FUSE even before this patch)Signed-off-by Anand Avati <[email protected]>Looks good to me.
Reviewed-by Jeff Moyer <[email protected]>
Pushed to the for-next branch of the fuse tree, together with and updated version of the i_nlink patch.
Thanks,
Miklos