As noted in the comments, we need to release block usage for swap entry which was replaced with poisoned swap entry. However, no block usage is actually freed by calling shmem_recalc_inode(inode, -nr_pages, -nr_pages). Instead, call shmem_recalc_inode(inode, 0, -nr_pages) can correctly release the block usage. Fixes: 6cec2b95dadf7 ("mm/shmem: fix infinite loop when swap in shmem error at swapoff time") Signed-off-by: Kemeng Shi <shikemeng@xxxxxxxxxxxxxxx> --- mm/shmem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/shmem.c b/mm/shmem.c index 4b42419ce6b2..e27d19867e03 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2145,7 +2145,7 @@ static void shmem_set_folio_swapin_error(struct inode *inode, pgoff_t index, * won't be 0 when inode is released and thus trigger WARN_ON(i_blocks) * in shmem_evict_inode(). */ - shmem_recalc_inode(inode, -nr_pages, -nr_pages); + shmem_recalc_inode(inode, 0, -nr_pages); swap_free_nr(swap, nr_pages); } -- 2.30.0