[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aYzulh4XWO-TBof8@casper.infradead.org>
Date: Wed, 11 Feb 2026 21:03:18 +0000
From: Matthew Wilcox <willy@...radead.org>
To: Joanne Koong <joannelkoong@...il.com>
Cc: Wei Gao <wegao@...e.com>, Sasha Levin <sashal@...nel.org>,
linux-fsdevel@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [RFC PATCH 1/1] iomap: fix race between iomap_set_range_uptodate
and folio_end_read
On Wed, Feb 11, 2026 at 11:33:05AM -0800, Joanne Koong wrote:
> ifs->read_bytes_pending gets initialized to the folio size, but if the
> file being read in is smaller than the size of the folio, then we
> reach this scenario because the file has been read in but
> ifs->read_bytes_pending is still a positive value because it
> represents the bytes between the end of the file and the end of the
> folio. If the folio size is 16k and the file size is 4k:
> a) ifs->read_bytes_pending gets initialized to 16k
> b) ->read_folio_range() is called for the 4k read
> c) the 4k read succeeds, ifs->read_bytes_pending is now 12k and the
> 0 to 4k range is marked uptodate
> d) the post-eof blocks are zeroed and marked uptodate in the call to
> iomap_set_range_uptodate()
This is the bug then. If they're marked uptodate, read_bytes_pending
should be decremented at the same time. Now, I appreciate that
iomap_set_range_uptodate() is called both from iomap_read_folio_iter()
and __iomap_write_begin(), and it can't decrement read_bytes_pending
in the latter case. Perhaps a flag or a second length parameter is
the solution?
> e) iomap_set_range_uptodate() sees all the ranges are marked
> uptodate and it marks the folio uptodate
> f) iomap_read_end() gets called to subtract the 12k from
> ifs->read_bytes_pending. it too sees all the ranges are marked
> uptodate and marks the folio uptodate
>
> The same scenario could happen for IOMAP_INLINE mappings if part of
> the folio is read in through ->read_folio_range() and then the rest is
> read in as inline data.
This is basically the same case as post-eof.
> An alternative solution is to not have zeroed-out / inlined mappings
> call iomap_read_end(), eg something like this [1], but this adds
> additional complexity and doesn't work if there's additional mappings
> for the folio after a non-IOMAP_MAPPED mapping.
>
> Is there a better approach that I'm missing?
>
> Thanks,
> Joanne
>
> [1] https://github.com/joannekoong/linux/commit/de48d3c29db8ae654300341e3eec12497df54673
Powered by blists - more mailing lists