]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
erofs: ensure all folios are managed in erofs_try_to_free_all_cached_folios()
authorZhan Xusheng <zhanxusheng@xiaomi.com>
Tue, 31 Mar 2026 05:02:49 +0000 (13:02 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Thu, 2 Apr 2026 08:08:49 +0000 (16:08 +0800)
folio_trylock() in erofs_try_to_free_all_cached_folios() may
successfully acquire the folio lock, but the subsequent check
for erofs_folio_is_managed() can skip unlocking when the folio
is not managed by EROFS.

As Gao Xiang pointed out, this condition should not happen in
practice because compressed_bvecs[] only holds valid cached folios
at this point — any non-managed folio would have already been
detached by z_erofs_cache_release_folio() under folio lock.

Fix this by adding DBG_BUGON() to catch unexpected folios
and ensure folio_unlock() is always called.

Suggested-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Signed-off-by: Zhan Xusheng <zhanxusheng@xiaomi.com>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Reviewed-by: Chunhai Guo <guochunhai@vivo.com>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/zdata.c

index fe8121df9ef2f2404fc6e3f0fbbd6367f9ec2c67..b566996a0d1a5e2e76562ee6953676aa939e1633 100644 (file)
@@ -605,8 +605,7 @@ static int erofs_try_to_free_all_cached_folios(struct erofs_sb_info *sbi,
                        if (!folio_trylock(folio))
                                return -EBUSY;
 
-                       if (!erofs_folio_is_managed(sbi, folio))
-                               continue;
+                       DBG_BUGON(!erofs_folio_is_managed(sbi, folio));
                        pcl->compressed_bvecs[i].page = NULL;
                        folio_detach_private(folio);
                        folio_unlock(folio);