On Thu, Nov 23, 2023 at 08:51:14PM +0800, Zhang Yi wrote: > index fd4d43bafd1b..3b9ba390dd1b 100644 > --- a/fs/iomap/buffered-io.c > +++ b/fs/iomap/buffered-io.c > @@ -852,13 +852,13 @@ static size_t iomap_write_end(struct iomap_iter *iter, loff_t pos, size_t len, > * cache. It's up to the file system to write the updated size to disk, > * preferably after I/O completion so that no stale data is exposed. > */ > - if (pos + ret > old_size) { > + if ((iter->flags & IOMAP_WRITE) && pos + ret > old_size) { > i_size_write(iter->inode, pos + ret); > iter->iomap.flags |= IOMAP_F_SIZE_CHANGED; > } > __iomap_put_folio(iter, pos, ret, folio); > > - if (old_size < pos) > + if ((iter->flags & IOMAP_WRITE) && old_size < pos) > pagecache_isize_extended(iter->inode, old_size, pos); > if (ret < len) > iomap_write_failed(iter->inode, pos + ret, len - ret); I agree with your rationale, but I hate how this code ends up looking. In many ways iomap_write_end seems like the wrong place to update the inode size anyway. I've not done a deep analysis, but I think there shouldn't really be any major blocker to only setting IOMAP_F_SIZE_CHANGED in iomap_write_end, and then move updating i_size and calling pagecache_isize_extended to iomap_write_iter.