Re: [PATCH 1/4] filemap: return pos of first dirty folio from range_has_writeback

Matthew Wilcox
2024-07-18T15:09:09Z

On Thu, Jul 18, 2024 at 09:02:09AM -0400, Brian Foster wrote:
> @@ -655,6 +655,8 @@ bool filemap_range_has_writeback(struct address_space *mapping,
> folio_test_writeback(folio))
> break;
> }
> + if (folio)
> + *start_byte = folio_pos(folio);
> rcu_read_unlock();
> return folio != NULL;
> }

Distressingly, this is unsafe.

We have no reference on the folio at this point (not one that matters,
anyway). We have the rcu read lock, yes, but that doesn't protect enough
to make folio_pos() safe.

Since we do't have folio_get() here, the folio can be freed, sent back to
the page allocator, and then reallocated to literally any purpose. As I'm
reviewing patch 1/4, I have no idea if this is just a hint and you can
survive it being completely wrong, or if this is going to cause problems.