diff options
| author | Michele Dionisio <michele.dionisio@gmail.com> | 2019-05-15 23:02:02 +0200 | 
|---|---|---|
| committer | Richard Weinberger <richard@nod.at> | 2019-07-08 19:43:53 +0200 | 
| commit | eeabb9866e4ccce55d875cad140f9bf7c7ba1d66 (patch) | |
| tree | 2cb31e7a2c643f8b03a9abadb27e6fef3509c485 /fs/ubifs | |
| parent | 817aa094842dfc3a6b98c9582d4a647827f66201 (diff) | |
| download | linux-eeabb9866e4ccce55d875cad140f9bf7c7ba1d66.tar.bz2 | |
ubifs: Add support for zstd compression.
zstd shows a good compression rate and is faster than lzo,
also on slow ARM cores.
Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Signed-off-by: Michele Dionisio <michele.dionisio@gmail.com>
[rw: rewrote commit message]
Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to 'fs/ubifs')
| -rw-r--r-- | fs/ubifs/Kconfig | 10 | ||||
| -rw-r--r-- | fs/ubifs/compress.c | 27 | ||||
| -rw-r--r-- | fs/ubifs/super.c | 2 | ||||
| -rw-r--r-- | fs/ubifs/ubifs-media.h | 2 | 
4 files changed, 40 insertions, 1 deletions
diff --git a/fs/ubifs/Kconfig b/fs/ubifs/Kconfig index 3902a677743e..69932bcfa920 100644 --- a/fs/ubifs/Kconfig +++ b/fs/ubifs/Kconfig @@ -6,8 +6,10 @@ config UBIFS_FS  	select CRYPTO if UBIFS_FS_ADVANCED_COMPR  	select CRYPTO if UBIFS_FS_LZO  	select CRYPTO if UBIFS_FS_ZLIB +	select CRYPTO if UBIFS_FS_ZSTD  	select CRYPTO_LZO if UBIFS_FS_LZO  	select CRYPTO_DEFLATE if UBIFS_FS_ZLIB +	select CRYPTO_ZSTD if UBIFS_FS_ZSTD  	select CRYPTO_HASH_INFO  	select UBIFS_FS_XATTR if FS_ENCRYPTION  	depends on MTD_UBI @@ -38,6 +40,14 @@ config UBIFS_FS_ZLIB  	help  	  Zlib compresses better than LZO but it is slower. Say 'Y' if unsure. +config UBIFS_FS_ZSTD +	bool "ZSTD compression support" if UBIFS_FS_ADVANCED_COMPR +	depends on UBIFS_FS +	default y +	help +	  ZSTD compresses is a big win in speed over Zlib and +	  in compression ratio over LZO. Say 'Y' if unsure. +  config UBIFS_ATIME_SUPPORT  	bool "Access time support"  	default n diff --git a/fs/ubifs/compress.c b/fs/ubifs/compress.c index 99c53ad11e93..3a92e6af69b2 100644 --- a/fs/ubifs/compress.c +++ b/fs/ubifs/compress.c @@ -59,6 +59,24 @@ static struct ubifs_compressor zlib_compr = {  };  #endif +#ifdef CONFIG_UBIFS_FS_ZSTD +static DEFINE_MUTEX(zstd_enc_mutex); +static DEFINE_MUTEX(zstd_dec_mutex); + +static struct ubifs_compressor zstd_compr = { +	.compr_type = UBIFS_COMPR_ZSTD, +	.comp_mutex = &zstd_enc_mutex, +	.decomp_mutex = &zstd_dec_mutex, +	.name = "zstd", +	.capi_name = "zstd", +}; +#else +static struct ubifs_compressor zstd_compr = { +	.compr_type = UBIFS_COMPR_ZSTD, +	.name = "zstd", +}; +#endif +  /* All UBIFS compressors */  struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT]; @@ -216,13 +234,19 @@ int __init ubifs_compressors_init(void)  	if (err)  		return err; -	err = compr_init(&zlib_compr); +	err = compr_init(&zstd_compr);  	if (err)  		goto out_lzo; +	err = compr_init(&zlib_compr); +	if (err) +		goto out_zstd; +  	ubifs_compressors[UBIFS_COMPR_NONE] = &none_compr;  	return 0; +out_zstd: +	compr_exit(&zstd_compr);  out_lzo:  	compr_exit(&lzo_compr);  	return err; @@ -235,4 +259,5 @@ void ubifs_compressors_exit(void)  {  	compr_exit(&lzo_compr);  	compr_exit(&zlib_compr); +	compr_exit(&zstd_compr);  } diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 13b8f68f6c24..5c472cca3876 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -1045,6 +1045,8 @@ static int ubifs_parse_options(struct ubifs_info *c, char *options,  				c->mount_opts.compr_type = UBIFS_COMPR_LZO;  			else if (!strcmp(name, "zlib"))  				c->mount_opts.compr_type = UBIFS_COMPR_ZLIB; +			else if (!strcmp(name, "zstd")) +				c->mount_opts.compr_type = UBIFS_COMPR_ZSTD;  			else {  				ubifs_err(c, "unknown compressor \"%s\"", name); //FIXME: is c ready?  				kfree(name); diff --git a/fs/ubifs/ubifs-media.h b/fs/ubifs/ubifs-media.h index 355d3081d882..3c9792cbb6ff 100644 --- a/fs/ubifs/ubifs-media.h +++ b/fs/ubifs/ubifs-media.h @@ -340,12 +340,14 @@ enum {   * UBIFS_COMPR_NONE: no compression   * UBIFS_COMPR_LZO: LZO compression   * UBIFS_COMPR_ZLIB: ZLIB compression + * UBIFS_COMPR_ZSTD: ZSTD compression   * UBIFS_COMPR_TYPES_CNT: count of supported compression types   */  enum {  	UBIFS_COMPR_NONE,  	UBIFS_COMPR_LZO,  	UBIFS_COMPR_ZLIB, +	UBIFS_COMPR_ZSTD,  	UBIFS_COMPR_TYPES_CNT,  };  |