erofs: release ztailpacking pclusters properly
authorJingbo Xu <jefflexu@linux.alibaba.com>
Tue, 22 Aug 2023 11:05:30 +0000 (19:05 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Wed, 23 Aug 2023 15:57:03 +0000 (23:57 +0800)
Currently ztailpacking pclusters are chained with FOLLOWED_NOINPLACE and
not recorded into the managed_pslots XArray.

After commit 7674a42f35ea ("erofs: use struct lockref to replace
handcrafted approach"), ztailpacking pclusters won't be freed with
erofs_workgroup_put() anymore, which will cause the following issue:

BUG erofs_pcluster-1 (Tainted: G           OE     ): Objects remaining in erofs_pcluster-1 on __kmem_cache_shutdown()

Use z_erofs_free_pcluster() directly to free ztailpacking pclusters.

Fixes: 7674a42f35ea ("erofs: use struct lockref to replace handcrafted approach")
Signed-off-by: Jingbo Xu <jefflexu@linux.alibaba.com>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Link: https://lore.kernel.org/r/20230822110530.96831-1-jefflexu@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/zdata.c

index da52b1cccd3839f3d82529e0ec71786d6ae23a4c..036f610e044b60fa45ae696f8a3277ef85cf40b6 100644 (file)
@@ -1369,7 +1369,10 @@ static void z_erofs_decompress_queue(const struct z_erofs_decompressqueue *io,
                owned = READ_ONCE(be.pcl->next);
 
                z_erofs_decompress_pcluster(&be, io->eio ? -EIO : 0);
-               erofs_workgroup_put(&be.pcl->obj);
+               if (z_erofs_is_inline_pcluster(be.pcl))
+                       z_erofs_free_pcluster(be.pcl);
+               else
+                       erofs_workgroup_put(&be.pcl->obj);
        }
 }