using struct erofs_compressors_cfg for erofs compressor global configuration.
Signed-off-by: Guo Xuenan <[email protected]> --- lib/compressor.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/compressor.h | 2 ++ 2 files changed, 63 insertions(+) diff --git a/lib/compressor.c b/lib/compressor.c index 4333f26..6288297 100644 --- a/lib/compressor.c +++ b/lib/compressor.c @@ -26,6 +26,67 @@ static const struct erofs_compressor *compressors[] = { #endif }; +static struct erofs_supported_algorithm { + bool enable; + unsigned int algtype; + const char *name; + struct erofs_compress handle; +} erofs_supported_algorithms[] = { + { .algtype = Z_EROFS_COMPRESSION_LZ4, .name = "lz4" }, + { .algtype = Z_EROFS_COMPRESSION_LZ4, .name = "lz4hc" }, + { .algtype = Z_EROFS_COMPRESSION_LZMA, .name = "lzma" }, + { .algtype = Z_EROFS_COMPRESSION_DEFLATE, .name = "deflate" }, + { .algtype = Z_EROFS_COMPRESSION_DEFLATE, .name = "libdeflate" }, +}; + +static void erofs_init_compressor(struct erofs_sb_info *sbi, + struct erofs_compress *handle, const struct erofs_compressor *alg) +{ + + handle->alg = alg; + + /* should be written in "minimum compression ratio * 100" */ + handle->compress_threshold = 100; + + /* optimize for 4k size page */ + handle->destsize_alignsize = erofs_blksiz(sbi); + handle->destsize_redzone_begin = erofs_blksiz(sbi) - 16; + handle->destsize_redzone_end = EROFS_CONFIG_COMPR_DEF_BOUNDARY; + + if (alg && alg->init) + alg->init(handle); +} + +static void erofs_compressor_register(struct erofs_sb_info *sbi, + const char *name, const struct erofs_compressor *alg) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(erofs_supported_algorithms); i++) { + if (!strcmp(erofs_supported_algorithms[i].name, name)) { + erofs_init_compressor(sbi, &erofs_supported_algorithms[i].handle, alg); + return; + } + } +} + +void erofs_register_compressors(struct erofs_sb_info *sbi) +{ +#if LZ4_ENABLED + erofs_compressor_register(sbi, "lz4", &erofs_compressor_lz4); +#if LZ4HC_ENABLED + erofs_compressor_register(sbi, "lz4hc", &erofs_compressor_lz4hc); +#endif +#endif +#if HAVE_LIBLZMA + erofs_compressor_register(sbi, "lzma", &erofs_compressor_lzma); +#endif + erofs_compressor_register(sbi, "deflate", &erofs_compressor_deflate); +#if HAVE_LIBDEFLATE + erofs_compressor_register(sbi, "libdeflate", &erofs_compressor_libdeflate); +#endif +} + int erofs_compress_destsize(const struct erofs_compress *c, const void *src, unsigned int *srcsize, void *dst, unsigned int dstsize, bool inblocks) diff --git a/lib/compressor.h b/lib/compressor.h index 08a3988..66ea933 100644 --- a/lib/compressor.h +++ b/lib/compressor.h @@ -8,6 +8,7 @@ #define __EROFS_LIB_COMPRESSOR_H #include "erofs/defs.h" +#include "erofs/config.h" struct erofs_compress; @@ -56,5 +57,6 @@ int erofs_compressor_setlevel(struct erofs_compress *c, int compression_level); int erofs_compressor_init(struct erofs_sb_info *sbi, struct erofs_compress *c, char *alg_name); int erofs_compressor_exit(struct erofs_compress *c); +void erofs_register_compressors(struct erofs_sb_info *sbi); #endif -- 2.34.3
