diff options
-rw-r--r-- | include/erofs/compress.h | 2 | ||||
-rw-r--r-- | lib/compressor.c | 29 | ||||
-rw-r--r-- | lib/compressor.h | 4 | ||||
-rw-r--r-- | lib/compressor_lz4.c | 6 | ||||
-rw-r--r-- | lib/compressor_lz4hc.c | 7 | ||||
-rw-r--r-- | mkfs/main.c | 15 |
6 files changed, 42 insertions, 21 deletions
diff --git a/include/erofs/compress.h b/include/erofs/compress.h index e0abb8f..fa91873 100644 --- a/include/erofs/compress.h +++ b/include/erofs/compress.h @@ -21,5 +21,7 @@ int erofs_write_compressed_file(struct erofs_inode *inode); int z_erofs_compress_init(void); int z_erofs_compress_exit(void); +const char *z_erofs_list_available_compressors(unsigned int i); + #endif diff --git a/lib/compressor.c b/lib/compressor.c index 8cc2f43..b2434e0 100644 --- a/lib/compressor.c +++ b/lib/compressor.c @@ -12,6 +12,15 @@ #define EROFS_CONFIG_COMPR_DEF_BOUNDARY (128) +static struct erofs_compressor *compressors[] = { +#if LZ4_ENABLED +#if LZ4HC_ENABLED + &erofs_compressor_lz4hc, +#endif + &erofs_compressor_lz4, +#endif +}; + int erofs_compress_destsize(struct erofs_compress *c, int compression_level, void *src, @@ -36,18 +45,13 @@ int erofs_compress_destsize(struct erofs_compress *c, return ret; } -int erofs_compressor_init(struct erofs_compress *c, - char *alg_name) +const char *z_erofs_list_available_compressors(unsigned int i) { - static struct erofs_compressor *compressors[] = { -#if LZ4_ENABLED -#if LZ4HC_ENABLED - &erofs_compressor_lz4hc, -#endif - &erofs_compressor_lz4, -#endif - }; + return i >= ARRAY_SIZE(compressors) ? NULL : compressors[i]->name; +} +int erofs_compressor_init(struct erofs_compress *c, char *alg_name) +{ int ret, i; /* should be written in "minimum compression ratio * 100" */ @@ -65,7 +69,10 @@ int erofs_compressor_init(struct erofs_compress *c, ret = -EINVAL; for (i = 0; i < ARRAY_SIZE(compressors); ++i) { - ret = compressors[i]->init(c, alg_name); + if (alg_name && strcmp(alg_name, compressors[i]->name)) + continue; + + ret = compressors[i]->init(c); if (!ret) { DBG_BUGON(!c->alg); return 0; diff --git a/lib/compressor.h b/lib/compressor.h index 6429b2a..b2471c4 100644 --- a/lib/compressor.h +++ b/lib/compressor.h @@ -14,10 +14,12 @@ struct erofs_compress; struct erofs_compressor { + const char *name; + int default_level; int best_level; - int (*init)(struct erofs_compress *c, char *alg_name); + int (*init)(struct erofs_compress *c); int (*exit)(struct erofs_compress *c); int (*compress_destsize)(struct erofs_compress *c, diff --git a/lib/compressor_lz4.c b/lib/compressor_lz4.c index 0d33223..8540a0d 100644 --- a/lib/compressor_lz4.c +++ b/lib/compressor_lz4.c @@ -29,16 +29,14 @@ static int compressor_lz4_exit(struct erofs_compress *c) return 0; } -static int compressor_lz4_init(struct erofs_compress *c, - char *alg_name) +static int compressor_lz4_init(struct erofs_compress *c) { - if (alg_name && strcmp(alg_name, "lz4")) - return -EINVAL; c->alg = &erofs_compressor_lz4; return 0; } struct erofs_compressor erofs_compressor_lz4 = { + .name = "lz4", .default_level = 0, .best_level = 0, .init = compressor_lz4_init, diff --git a/lib/compressor_lz4hc.c b/lib/compressor_lz4hc.c index 14e0175..6680563 100644 --- a/lib/compressor_lz4hc.c +++ b/lib/compressor_lz4hc.c @@ -37,12 +37,8 @@ static int compressor_lz4hc_exit(struct erofs_compress *c) return 0; } -static int compressor_lz4hc_init(struct erofs_compress *c, - char *alg_name) +static int compressor_lz4hc_init(struct erofs_compress *c) { - if (alg_name && strcmp(alg_name, "lz4hc")) - return -EINVAL; - c->alg = &erofs_compressor_lz4hc; c->private_data = LZ4_createStreamHC(); @@ -52,6 +48,7 @@ static int compressor_lz4hc_init(struct erofs_compress *c, } struct erofs_compressor erofs_compressor_lz4hc = { + .name = "lz4hc", .default_level = LZ4HC_CLEVEL_DEFAULT, .best_level = LZ4HC_CLEVEL_MAX, .init = compressor_lz4hc_init, diff --git a/mkfs/main.c b/mkfs/main.c index 31cf1c2..1161b3f 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -29,6 +29,19 @@ static struct option long_options[] = { {0, 0, 0, 0}, }; +static void print_available_compressors(FILE *f, const char *delim) +{ + unsigned int i = 0; + const char *s; + + while ((s = z_erofs_list_available_compressors(i)) != NULL) { + if (i++) + fputs(delim, f); + fputs(s, f); + } + fputc('\n', f); +} + static void usage(void) { fprintf(stderr, "usage: [options] FILE DIRECTORY\n\n"); @@ -39,6 +52,8 @@ static void usage(void) fprintf(stderr, " -EX[,...] X=extended options\n"); fprintf(stderr, " -T# set a fixed UNIX timestamp # to all files\n"); fprintf(stderr, " --help display this help and exit\n"); + fprintf(stderr, "\nAvailable compressors are: "); + print_available_compressors(stderr, ", "); } static int parse_extended_opts(const char *opts) |