erofs: cap LZMA stream pool size
authorMichael Bommarito <michael.bommarito@gmail.com>
Tue, 14 Jul 2026 11:47:29 +0000 (07:47 -0400)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Mon, 27 Jul 2026 04:31:11 +0000 (12:31 +0800)
commitc9b47e6b23114e939b17f818471c7a46e59006e7
treef0ebde98cf69668130508fe4b31953418e6e5e71
parent96b2dbbe58a1ea5df8d29c2fe24b5f04715f4443
erofs: cap LZMA stream pool size

fs/erofs/decompressor_lzma.c sizes the module-global MicroLZMA stream
pool from num_possible_cpus() when the lzma_streams module parameter is
unset, then z_erofs_load_lzma_config() preallocates one image-supplied
dictionary per stream, accepting dictionaries up to 8 MiB.  On high-CPU
systems, a small EROFS image can pin hundreds of MiB of vmalloc-backed
decoder state until the erofs module is unloaded.

Impact: An EROFS image mounted by the system can pin up to 8 MiB of
vmalloc memory per LZMA stream, either as intended or unexpectedly.

Bound the default stream count by a new
CONFIG_EROFS_FS_ZIP_LZMA_DEFAULT_MAX_STREAMS option, default 16, so the
worst-case default preallocation is 128 MiB if the number of CPUs is no
less than 16 while preserving the existing per-image dictionary limit.
An explicit lzma_streams module parameter is still honoured as-is, so
administrators who deliberately size the pool are not affected.

Fixes: 622ceaddb764 ("erofs: lzma compression support")
Cc: stable@vger.kernel.org
Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Michael Bommarito <michael.bommarito@gmail.com>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/Kconfig
fs/erofs/decompressor_lzma.c