Hi, Amir In the commit [1], performing read/write operations with DIRECT_IO on a FUSE file path does not trigger FUSE passthrough. I am unclear about the reason behind this behavior. Is it possible to modify the call sequence to support passthrough for files opened with DIRECT_IO? Thank you! [1] https://lore.kernel.org/all/20240206142453.1906268-7-amir73il@xxxxxxxxx/ Reported-by: Lei Liu <liulei.rjpt@xxxxxxxx> Signed-off-by: Qi Han <hanqi@xxxxxxxx> --- fs/fuse/file.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 2ddfb3bb6483..689f9ee938f1 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -1711,11 +1711,11 @@ static ssize_t fuse_file_read_iter(struct kiocb *iocb, struct iov_iter *to) if (FUSE_IS_DAX(inode)) return fuse_dax_read_iter(iocb, to); - /* FOPEN_DIRECT_IO overrides FOPEN_PASSTHROUGH */ - if (ff->open_flags & FOPEN_DIRECT_IO) - return fuse_direct_read_iter(iocb, to); - else if (fuse_file_passthrough(ff)) + + if (fuse_file_passthrough(ff)) return fuse_passthrough_read_iter(iocb, to); + else if (ff->open_flags & FOPEN_DIRECT_IO) + return fuse_direct_read_iter(iocb, to); else return fuse_cache_read_iter(iocb, to); } @@ -1732,11 +1732,10 @@ static ssize_t fuse_file_write_iter(struct kiocb *iocb, struct iov_iter *from) if (FUSE_IS_DAX(inode)) return fuse_dax_write_iter(iocb, from); - /* FOPEN_DIRECT_IO overrides FOPEN_PASSTHROUGH */ - if (ff->open_flags & FOPEN_DIRECT_IO) - return fuse_direct_write_iter(iocb, from); - else if (fuse_file_passthrough(ff)) + if (fuse_file_passthrough(ff)) return fuse_passthrough_write_iter(iocb, from); + else if (ff->open_flags & FOPEN_DIRECT_IO) + return fuse_direct_write_iter(iocb, from); else return fuse_cache_write_iter(iocb, from); } -- 2.48.1