mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 22:14:03 +02:00
f2fs: only redirty pinned folios in redirty_blocks
redirty_blocks() pins folios with read_cache_folio() and then walks the same range again with filemap_lock_folio() to redirty them and drop the references it took. Commit5951fee46b("f2fs: Use a folio in redirty_blocks()") changed the second pass to a do/while loop. If read_cache_folio() fails before anything is pinned, page_idx does not advance but the cleanup loop still runs once. If readahead has already populated the failed folio in page cache, that extra iteration finds it and folio_put_refs(folio, 2) drops one reference too many. Later drop_caches or reclaim can then report "BUG: Bad page state". Only redirty the range that was pinned successfully. Fixes:5951fee46b("f2fs: Use a folio in redirty_blocks()") Cc: stable@kernel.org Assisted-by: Codex:gpt-5.5 Signed-off-by: Wenjie Qi <qiwenjie@xiaomi.com> Reviewed-by: Chao Yu <chao@kernel.org> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
01027b2fcb
commit
8517133274
|
|
@ -4487,7 +4487,7 @@ static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len)
|
|||
page_idx = folio_next_index(folio);
|
||||
} while (page_len < len);
|
||||
|
||||
do {
|
||||
while (redirty_idx < page_idx) {
|
||||
folio = filemap_lock_folio(mapping, redirty_idx);
|
||||
|
||||
/* It will never fail, when folio has pinned above */
|
||||
|
|
@ -4500,7 +4500,7 @@ static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len)
|
|||
redirty_idx = folio_next_index(folio);
|
||||
folio_unlock(folio);
|
||||
folio_put_refs(folio, 2);
|
||||
} while (redirty_idx < page_idx);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user