On 4/30/21 5:47 AM, Jan Kara wrote:
On Thu 29-04-21 11:07:15, Junxiao Bi wrote:
On 4/29/21 10:14 AM, Andreas Gruenbacher wrote:
On Tue, Apr 27, 2021 at 4:44 AM Junxiao Bi <junxiao...@oracle.com> wrote:
When doing truncate/fallocate for some filesytem like ocfs2, it
will zero some pages that are out of inode size and then later
update the inode size, so it needs this api to writeback eof
pages.
is this in reaction to Jan's "[PATCH 0/12 v4] fs: Hole punch vs page
cache filling races" patch set [*]? It doesn't look like the kind of
patch Christoph would be happy with.
Thank you for pointing the patch set. I think that is fixing a different
issue.
The issue here is when extending file size with fallocate/truncate, if the
original inode size
is in the middle of the last cluster block(1M), eof part will be zeroed with
buffer write first,
and then new inode size is updated, so there is a window that dirty pages is
out of inode size,
if writeback is kicked in, block_write_full_page will drop all those eof
pages.
I agree that the buffers describing part of the cluster beyond i_size won't
be written. But page cache will remain zeroed out so that is fine. So you
only need to zero out the on disk contents. Since this is actually
physically contiguous range of blocks why don't you just use
sb_issue_zeroout() to zero out the tail of the cluster? It will be more
efficient than going through the page cache and you also won't have to
tweak block_write_full_page()...
Thanks for the review.
The physical blocks to be zeroed were continuous only when sparse mode
is enabled, if sparse mode is disabled, unwritten extent was not
supported for ocfs2, then all the blocks to the new size will be zeroed
by the buffer write, since sb_issue_zeroout() will need waiting io done,
there will be a lot of delay when extending file size. Use writeback to
flush async seemed more efficient?
Thanks,
Junxiao.
Honza