Re: [f2fs-dev] [PATCH] f2fs: fix O_DIRECT cleanup range for append writes

Chao Yu via Linux-f2fs-devel <[email protected]>
Newsgroups net.sourceforge.lists.linux-f2fs-devel,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On 8/14/26 18:52, Seongjae Jeong wrote:
> When an O_DIRECT write falls back to buffered I/O,
> f2fs_flush_buffered_write() uses orig_pos to flush and invalidate
> the page cache.
> 
> For O_APPEND writes, f2fs_write_checks() updates iocb->ki_pos to
> the end of the file after orig_pos has been saved. As a result,
> the cleanup range can differ from the actual buffered write range.

If generic_write_checks() can adjust writing position or amount of bytes
to write, shouldn't we access iocb->ki_pos and iov_iter_count(from) after
generic_write_checks()?

Thanks,

> 
> Save the write position after f2fs_write_checks() and use it for
> the forced buffered I/O cleanup.
> 
> Fixes: 92318f20d703 ("f2fs: preserve direct write semantics when buffering is forced")
> Signed-off-by: Seongjae Jeong <[email protected]>
> ---
>   fs/f2fs/file.c | 7 +++++--
>   1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
> index b99d9cdf9ba7..bf61545603e5 100644
> --- a/fs/f2fs/file.c
> +++ b/fs/f2fs/file.c
> @@ -5313,6 +5313,7 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
>   	const loff_t pos = iocb->ki_pos;
>   	const ssize_t count = iov_iter_count(from);
>   	ssize_t ret;
> +	loff_t bufio_start_pos;
>   
>   	if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) {
>   		ret = -EIO;
> @@ -5343,6 +5344,8 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
>   	if (ret <= 0)
>   		goto out_unlock;
>   
> +	bufio_start_pos = iocb->ki_pos;
> +
>   	/* Determine whether we will do a direct write or a buffered write. */
>   	dio = f2fs_should_use_dio(inode, iocb, from);
>   
> @@ -5396,8 +5399,8 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
>   	 */
>   	if (ret > 0 && !dio && (iocb->ki_flags & IOCB_DIRECT))
>   		f2fs_flush_buffered_write(iocb->ki_filp->f_mapping,
> -					  orig_pos,
> -					  orig_pos + ret - 1);
> +					  bufio_start_pos,
> +					  bufio_start_pos + ret - 1);
>   
>   	return ret;
>   }



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.