[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250716121036.250841-1-hanqi@vivo.com>
Date: Wed, 16 Jul 2025 06:10:36 -0600
From: Qi Han <hanqi@...o.com>
To: miklos@...redi.hu,
amir73il@...il.com
Cc: linux-fsdevel@...r.kernel.org,
linux-kernel@...r.kernel.org,
liulei.rjpt@...o.com,
Qi Han <hanqi@...o.com>
Subject: [RFC PATCH] fuse: modification of FUSE passthrough call sequence
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@gmail.com/
Reported-by: Lei Liu <liulei.rjpt@...o.com>
Signed-off-by: Qi Han <hanqi@...o.com>
---
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
Powered by blists - more mailing lists