On 2024/8/13 0:45, Darrick J. Wong wrote: > On Mon, Aug 12, 2024 at 08:11:57PM +0800, Zhang Yi wrote: >> From: Zhang Yi <yi.zhang@xxxxxxxxxx> >> >> When doing page mkwrite, iomap_folio_mkwrite_iter() dirty the entire >> folio by folio_mark_dirty() even the map length is shorter than one >> folio. However, on the filesystem with more than one blocks per folio, >> we'd better to only set counterpart block's dirty bit according to >> iomap_length(), so open code folio_mark_dirty() and pass the correct >> length. >> >> Signed-off-by: Zhang Yi <yi.zhang@xxxxxxxxxx> >> --- >> fs/iomap/buffered-io.c | 5 ++++- >> 1 file changed, 4 insertions(+), 1 deletion(-) >> >> diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c >> index 79031b7517e5..ac762de9a27f 100644 >> --- a/fs/iomap/buffered-io.c >> +++ b/fs/iomap/buffered-io.c >> @@ -1492,7 +1492,10 @@ static loff_t iomap_folio_mkwrite_iter(struct iomap_iter *iter, >> block_commit_write(&folio->page, 0, length); >> } else { >> WARN_ON_ONCE(!folio_test_uptodate(folio)); >> - folio_mark_dirty(folio); >> + >> + ifs_alloc(iter->inode, folio, 0); >> + iomap_set_range_dirty(folio, 0, length); >> + filemap_dirty_folio(iter->inode->i_mapping, folio); > > Is it correct to be doing a lot more work by changing folio_mark_dirty > to filemap_dirty_folio? Now pagefaults call __mark_inode_dirty which > they did not before. Also, the folio itself must be marked dirty if any > of the ifs bitmap is marked dirty, so I don't understand the change > here. > This change is just open code iomap_dirty_folio() and correct the length that passing to iomap_set_range_dirty(). bool iomap_dirty_folio(struct address_space *mapping, struct folio *folio) { struct inode *inode = mapping->host; size_t len = folio_size(folio); ... ifs_alloc(inode, folio, 0); iomap_set_range_dirty(folio, 0, len); return filemap_dirty_folio(mapping, folio); } Before this change, the code also call filemap_dirty_folio() (though folio_mark_dirty()->iomap_dirty_folio()->filemap_dirty_folio()), so it call __mark_inode_dirty() too. After this change, filemap_dirty_folio()-> folio_test_set_dirty() will mark the folio dirty. Hence there is no difference between the two points you mentioned. Am I missing something? Thanks, Yi. > >> } >> >> return length; >> -- >> 2.39.2 >> >>