On 2024/8/14 13:36, Christoph Hellwig 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. > > What about moving the folio_mark_dirty out of the loop and directly > into iomap_page_mkwrite so that it is exactly called once? The > iterator then does nothing for the !buffer_head case (but we still > need to call it to allocate the blocks). > Sorry, this makes me confused. How does this could prevent setting redundant dirty bits? Suppose we have a 3K regular file on a filesystem with 1K block size. In iomap_page_mkwrite(), the iter.len is 3K, if the folio size is 4K, folio_mark_dirty() will also mark all 4 bits of ifs dirty. And then, if we expand this file size to 4K, and this will still lead to a hole with dirty bit set but without any block allocated/reserved. Am I missing something? Thanks, Yi.