Avoid giving a way a buffer with __find_get_block_slow() if the folio may be a folio migration candidate. We do this as an alternative to the issue fixed by commit ebdf4de5642fb6 ("mm: migrate: fix reference check race between __find_get_block() and migration"), given we've determined that we should avoid requiring folio migration callers from holding a spin lock while calling __migrate_folio(). This alternative simply avoids completing __find_get_block_slow() on folio migration candidates to let us later rip out the spin_lock() held on the buffer_migrate_folio_norefs() path. Signed-off-by: Luis Chamberlain <mcgrof@xxxxxxxxxx> --- fs/buffer.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/buffer.c b/fs/buffer.c index c7abb4a029dc..6e2c3837a202 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -208,6 +208,12 @@ __find_get_block_slow(struct block_device *bdev, sector_t block) head = folio_buffers(folio); if (!head) goto out_unlock; + + if (folio_test_lru(folio) && + folio_test_locked(folio) && + !folio_test_writeback(folio)) + goto out_unlock; + bh = head; do { if (!buffer_mapped(bh)) -- 2.47.2