On Wed, Jul 16, 2025 at 1:49 PM Qi Han <hanqi@xxxxxxxx> wrote: > > Hi, Amir Hi Qi, > 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? Are you talking about files opened by user with O_DIRECT or files open by server with FOPEN_DIRECT_IO? Those are two different things. IIRC, O_DIRECT to a backing passthrough file should be possible. > 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); > } > -- When server requests to open a file with FOPEN_DIRECT_IO, it affects how FUSE_READ/FUSE_WRITE requests are made. When server requests to open a file with FOPEN_PASSTHROUGH, it means that FUSE_READ/FUSE_WRITE requests are not to be expected at all, so these two options are somewhat conflicting. Therefore, I do not know what you aim to achieve by your patch. However, please note this comment in iomode.c: * A combination of FOPEN_PASSTHROUGH and FOPEN_DIRECT_IO means that read/write * operations go directly to the server, but mmap is done on the backing file. So this is a special mode that the server can request in order to do passthrough mmap but still send FUSE_READ/FUSE_WRITE requests to the server. What is your use case? What are you trying to achieve that is not currently possible? Thanks, Amir.