diff options
Diffstat (limited to 'lib/compressor.c')
-rw-r--r-- | lib/compressor.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/lib/compressor.c b/lib/compressor.c index b2434e0..ad12cdf 100644 --- a/lib/compressor.c +++ b/lib/compressor.c @@ -1,7 +1,5 @@ // SPDX-License-Identifier: GPL-2.0+ /* - * erofs-utils/lib/compressor.c - * * Copyright (C) 2018-2019 HUAWEI, Inc. * http://www.huawei.com/ * Created by Gao Xiang <gaoxiang25@huawei.com> @@ -19,28 +17,30 @@ static struct erofs_compressor *compressors[] = { #endif &erofs_compressor_lz4, #endif +#if HAVE_LIBLZMA + &erofs_compressor_lzma, +#endif }; int erofs_compress_destsize(struct erofs_compress *c, - int compression_level, - void *src, - unsigned int *srcsize, - void *dst, - unsigned int dstsize) + void *src, unsigned int *srcsize, + void *dst, unsigned int dstsize) { + unsigned int uncompressed_size; int ret; DBG_BUGON(!c->alg); if (!c->alg->compress_destsize) return -ENOTSUP; - ret = c->alg->compress_destsize(c, compression_level, - src, srcsize, dst, dstsize); + ret = c->alg->compress_destsize(c, src, srcsize, dst, dstsize); if (ret < 0) return ret; /* check if there is enough gains to compress */ - if (*srcsize <= dstsize * c->compress_threshold / 100) + uncompressed_size = *srcsize; + if (roundup(ret, EROFS_BLKSIZ) >= uncompressed_size * + c->compress_threshold / 100) return -EAGAIN; return ret; } @@ -50,6 +50,18 @@ const char *z_erofs_list_available_compressors(unsigned int i) return i >= ARRAY_SIZE(compressors) ? NULL : compressors[i]->name; } +int erofs_compressor_setlevel(struct erofs_compress *c, int compression_level) +{ + DBG_BUGON(!c->alg); + if (c->alg->setlevel) + return c->alg->setlevel(c, compression_level); + + if (compression_level >= 0) + return -EINVAL; + c->compression_level = 0; + return 0; +} + int erofs_compressor_init(struct erofs_compress *c, char *alg_name) { int ret, i; @@ -88,4 +100,3 @@ int erofs_compressor_exit(struct erofs_compress *c) return c->alg->exit(c); return 0; } - |