erofs: fix memory leak of LZMA global compressed deduplication

[ Upstream commit 75a5221630 ]

When stressing microLZMA EROFS images with the new global compressed
deduplication feature enabled (`-Ededupe`), I found some short-lived
temporary pages weren't properly released, which could slowly cause
unexpected OOMs hours later.

Let's fix it now (LZ4 and DEFLATE don't have this issue.)

Fixes: 5c2a64252c ("erofs: introduce partial-referenced pclusters")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20230907050542.97152-1-hsiangkao@linux.alibaba.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Gao Xiang 2023-09-07 13:05:42 +08:00 committed by Greg Kroah-Hartman
parent 91aeb418b9
commit 6a5a8f0a97
1 changed files with 4 additions and 1 deletions

View File

@ -217,9 +217,12 @@ int z_erofs_lzma_decompress(struct z_erofs_decompress_req *rq,
strm->buf.out_size = min_t(u32, outlen, strm->buf.out_size = min_t(u32, outlen,
PAGE_SIZE - pageofs); PAGE_SIZE - pageofs);
outlen -= strm->buf.out_size; outlen -= strm->buf.out_size;
if (!rq->out[no] && rq->fillgaps) /* deduped */ if (!rq->out[no] && rq->fillgaps) { /* deduped */
rq->out[no] = erofs_allocpage(pagepool, rq->out[no] = erofs_allocpage(pagepool,
GFP_KERNEL | __GFP_NOFAIL); GFP_KERNEL | __GFP_NOFAIL);
set_page_private(rq->out[no],
Z_EROFS_SHORTLIVED_PAGE);
}
if (rq->out[no]) if (rq->out[no])
strm->buf.out = kmap(rq->out[no]) + pageofs; strm->buf.out = kmap(rq->out[no]) + pageofs;
pageofs = 0; pageofs = 0;