linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] pstore: use crypto compress API
@ 2018-03-09 10:51 Geliang Tang
  2018-03-09 22:00 ` Kees Cook
  0 siblings, 1 reply; 2+ messages in thread
From: Geliang Tang @ 2018-03-09 10:51 UTC (permalink / raw)
  To: Kees Cook, Anton Vorontsov, Colin Cross, Tony Luck
  Cc: Geliang Tang, linux-kernel

In the pstore compression part, we use zlib/lzo/lz4/lz4hc/842
compression algorithm API to implement pstore compression backends. But
there are many repeat codes in these implementations. This patch uses
crypto compress API to simplify these codes.

1) rewrite allocate_buf_for_compression, free_buf_for_compression,
pstore_compress, pstore_decompress functions using crypto compress API.
2) drop compress, decompress, allocate, free functions in pstore_zbackend,
and add zbufsize function to get each different compress buffer size.
3) use late_initcall to call ramoops_init later, to make sure the crypto
subsystem has already initialized.
4) use 'unsigned int' type instead of 'size_t' in pstore_compress,
pstore_decompress functions' length arguments.
5) rename 'zlib' to 'deflate' to follow the crypto API's name
convention.

Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
 fs/pstore/Kconfig    |  33 ++--
 fs/pstore/platform.c | 413 ++++++++-------------------------------------------
 fs/pstore/ram.c      |   2 +-
 3 files changed, 80 insertions(+), 368 deletions(-)

diff --git a/fs/pstore/Kconfig b/fs/pstore/Kconfig
index e4e22026c7a1..26f1c0fcada3 100644
--- a/fs/pstore/Kconfig
+++ b/fs/pstore/Kconfig
@@ -12,51 +12,46 @@ config PSTORE
 	   If you don't have a platform persistent store driver,
 	   say N.
 
-config PSTORE_ZLIB_COMPRESS
-	bool "ZLIB compression"
+config PSTORE_DEFLATE_COMPRESS
+	bool "DEFLATE compression"
 	default y
 	depends on PSTORE
-	select ZLIB_DEFLATE
-	select ZLIB_INFLATE
+	select CRYPTO_DEFLATE
 	help
-	  This option enables ZLIB compression algorithm support.
+	  This option enables DEFLATE compression algorithm support.
 
 config PSTORE_LZO_COMPRESS
 	bool "LZO compression"
 	depends on PSTORE
-	select LZO_COMPRESS
-	select LZO_DECOMPRESS
+	select CRYPTO_LZO
 	help
 	  This option enables LZO compression algorithm support.
 
 config PSTORE_LZ4_COMPRESS
 	bool "LZ4 compression"
 	depends on PSTORE
-	select LZ4_COMPRESS
-	select LZ4_DECOMPRESS
+	select CRYPTO_LZ4
 	help
 	  This option enables LZ4 compression algorithm support.
 
 config PSTORE_LZ4HC_COMPRESS
 	bool "LZ4HC compression"
 	depends on PSTORE
-	select LZ4HC_COMPRESS
-	select LZ4_DECOMPRESS
+	select CRYPTO_LZ4HC
 	help
 	  This option enables LZ4HC (high compression) mode algorithm.
 
 config PSTORE_842_COMPRESS
 	bool "842 compression"
 	depends on PSTORE
-	select 842_COMPRESS
-	select 842_DECOMPRESS
+	select CRYPTO_842
 	help
 	  This option enables 842 compression algorithm support.
 
 config PSTORE_COMPRESS
 	def_bool y
 	depends on PSTORE
-	depends on PSTORE_ZLIB_COMPRESS || PSTORE_LZO_COMPRESS ||	\
+	depends on PSTORE_DEFLATE_COMPRESS || PSTORE_LZO_COMPRESS ||	\
 		   PSTORE_LZ4_COMPRESS || PSTORE_LZ4HC_COMPRESS ||	\
 		   PSTORE_842_COMPRESS
 
@@ -69,12 +64,12 @@ choice
 	  the kernel command line.
 
 	  Currently, pstore has support for 5 compression algorithms:
-	  zlib, lzo, lz4, lz4hc and 842.
+	  deflate, lzo, lz4, lz4hc and 842.
 
-	  The default compression algorithm is zlib.
+	  The default compression algorithm is deflate.
 
-	config PSTORE_ZLIB_COMPRESS_DEFAULT
-		bool "zlib" if PSTORE_ZLIB_COMPRESS=y
+	config PSTORE_DEFLATE_COMPRESS_DEFAULT
+		bool "deflate" if PSTORE_DEFLATE_COMPRESS=y
 
 	config PSTORE_LZO_COMPRESS_DEFAULT
 		bool "lzo" if PSTORE_LZO_COMPRESS=y
@@ -93,7 +88,7 @@ endchoice
 config PSTORE_COMPRESS_DEFAULT
 	string
 	depends on PSTORE_COMPRESS
-	default "zlib" if PSTORE_ZLIB_COMPRESS_DEFAULT
+	default "deflate" if PSTORE_DEFLATE_COMPRESS_DEFAULT
 	default "lzo" if PSTORE_LZO_COMPRESS_DEFAULT
 	default "lz4" if PSTORE_LZ4_COMPRESS_DEFAULT
 	default "lz4hc" if PSTORE_LZ4HC_COMPRESS_DEFAULT
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c
index 06e3b280c3a5..1d40b4588d68 100644
--- a/fs/pstore/platform.c
+++ b/fs/pstore/platform.c
@@ -28,18 +28,13 @@
 #include <linux/console.h>
 #include <linux/module.h>
 #include <linux/pstore.h>
-#ifdef CONFIG_PSTORE_ZLIB_COMPRESS
-#include <linux/zlib.h>
-#endif
 #ifdef CONFIG_PSTORE_LZO_COMPRESS
 #include <linux/lzo.h>
 #endif
 #if defined(CONFIG_PSTORE_LZ4_COMPRESS) || defined(CONFIG_PSTORE_LZ4HC_COMPRESS)
 #include <linux/lz4.h>
 #endif
-#ifdef CONFIG_PSTORE_842_COMPRESS
-#include <linux/sw842.h>
-#endif
+#include <linux/crypto.h>
 #include <linux/string.h>
 #include <linux/timer.h>
 #include <linux/slab.h>
@@ -85,25 +80,10 @@ static char *compress =
 #endif
 
 /* Compression parameters */
-#ifdef CONFIG_PSTORE_ZLIB_COMPRESS
-#define COMPR_LEVEL 6
-#define WINDOW_BITS 12
-#define MEM_LEVEL 4
-static struct z_stream_s stream;
-#endif
-#if defined(CONFIG_PSTORE_LZO_COMPRESS)   || \
-    defined(CONFIG_PSTORE_LZ4_COMPRESS)   || \
-    defined(CONFIG_PSTORE_LZ4HC_COMPRESS) || \
-    defined(CONFIG_PSTORE_842_COMPRESS)
-static unsigned char *workspace;
-#endif
+static struct crypto_comp *tfm;
 
 struct pstore_zbackend {
-	int (*compress)(const void *in, void *out, size_t inlen, size_t outlen);
-	int (*decompress)(void *in, void *out, size_t inlen, size_t outlen);
-	void (*allocate)(void);
-	void (*free)(void);
-
+	int (*zbufsize)(size_t size);
 	const char *name;
 };
 
@@ -162,77 +142,12 @@ bool pstore_cannot_block_path(enum kmsg_dump_reason reason)
 }
 EXPORT_SYMBOL_GPL(pstore_cannot_block_path);
 
-#ifdef CONFIG_PSTORE_ZLIB_COMPRESS
-/* Derived from logfs_compress() */
-static int compress_zlib(const void *in, void *out, size_t inlen, size_t outlen)
+#ifdef CONFIG_PSTORE_DEFLATE_COMPRESS
+static int zbufsize_deflate(size_t size)
 {
-	int err, ret;
-
-	ret = -EIO;
-	err = zlib_deflateInit2(&stream, COMPR_LEVEL, Z_DEFLATED, WINDOW_BITS,
-						MEM_LEVEL, Z_DEFAULT_STRATEGY);
-	if (err != Z_OK)
-		goto error;
-
-	stream.next_in = in;
-	stream.avail_in = inlen;
-	stream.total_in = 0;
-	stream.next_out = out;
-	stream.avail_out = outlen;
-	stream.total_out = 0;
-
-	err = zlib_deflate(&stream, Z_FINISH);
-	if (err != Z_STREAM_END)
-		goto error;
-
-	err = zlib_deflateEnd(&stream);
-	if (err != Z_OK)
-		goto error;
-
-	if (stream.total_out >= stream.total_in)
-		goto error;
-
-	ret = stream.total_out;
-error:
-	return ret;
-}
-
-/* Derived from logfs_uncompress */
-static int decompress_zlib(void *in, void *out, size_t inlen, size_t outlen)
-{
-	int err, ret;
-
-	ret = -EIO;
-	err = zlib_inflateInit2(&stream, WINDOW_BITS);
-	if (err != Z_OK)
-		goto error;
-
-	stream.next_in = in;
-	stream.avail_in = inlen;
-	stream.total_in = 0;
-	stream.next_out = out;
-	stream.avail_out = outlen;
-	stream.total_out = 0;
-
-	err = zlib_inflate(&stream, Z_FINISH);
-	if (err != Z_STREAM_END)
-		goto error;
-
-	err = zlib_inflateEnd(&stream);
-	if (err != Z_OK)
-		goto error;
-
-	ret = stream.total_out;
-error:
-	return ret;
-}
-
-static void allocate_zlib(void)
-{
-	size_t size;
 	size_t cmpr;
 
-	switch (psinfo->bufsize) {
+	switch (size) {
 	/* buffer range for efivars */
 	case 1000 ... 2000:
 		cmpr = 56;
@@ -252,287 +167,61 @@ static void allocate_zlib(void)
 		break;
 	}
 
-	big_oops_buf_sz = (psinfo->bufsize * 100) / cmpr;
-	big_oops_buf = kmalloc(big_oops_buf_sz, GFP_KERNEL);
-	if (big_oops_buf) {
-		size = max(zlib_deflate_workspacesize(WINDOW_BITS, MEM_LEVEL),
-			zlib_inflate_workspacesize());
-		stream.workspace = kmalloc(size, GFP_KERNEL);
-		if (!stream.workspace) {
-			pr_err("No memory for compression workspace; skipping compression\n");
-			kfree(big_oops_buf);
-			big_oops_buf = NULL;
-		}
-	} else {
-		pr_err("No memory for uncompressed data; skipping compression\n");
-		stream.workspace = NULL;
-	}
-
-}
-
-static void free_zlib(void)
-{
-	kfree(stream.workspace);
-	stream.workspace = NULL;
-	kfree(big_oops_buf);
-	big_oops_buf = NULL;
-	big_oops_buf_sz = 0;
+	return (size * 100) / cmpr;
 }
 #endif
 
 #ifdef CONFIG_PSTORE_LZO_COMPRESS
-static int compress_lzo(const void *in, void *out, size_t inlen, size_t outlen)
+static int zbufsize_lzo(size_t size)
 {
-	int ret;
-
-	ret = lzo1x_1_compress(in, inlen, out, &outlen, workspace);
-	if (ret != LZO_E_OK) {
-		pr_err("lzo_compress error, ret = %d!\n", ret);
-		return -EIO;
-	}
-
-	return outlen;
-}
-
-static int decompress_lzo(void *in, void *out, size_t inlen, size_t outlen)
-{
-	int ret;
-
-	ret = lzo1x_decompress_safe(in, inlen, out, &outlen);
-	if (ret != LZO_E_OK) {
-		pr_err("lzo_decompress error, ret = %d!\n", ret);
-		return -EIO;
-	}
-
-	return outlen;
-}
-
-static void allocate_lzo(void)
-{
-	big_oops_buf_sz = lzo1x_worst_compress(psinfo->bufsize);
-	big_oops_buf = kmalloc(big_oops_buf_sz, GFP_KERNEL);
-	if (big_oops_buf) {
-		workspace = kmalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL);
-		if (!workspace) {
-			pr_err("No memory for compression workspace; skipping compression\n");
-			kfree(big_oops_buf);
-			big_oops_buf = NULL;
-		}
-	} else {
-		pr_err("No memory for uncompressed data; skipping compression\n");
-		workspace = NULL;
-	}
-}
-
-static void free_lzo(void)
-{
-	kfree(workspace);
-	kfree(big_oops_buf);
-	big_oops_buf = NULL;
-	big_oops_buf_sz = 0;
+	return lzo1x_worst_compress(size);
 }
 #endif
 
 #if defined(CONFIG_PSTORE_LZ4_COMPRESS) || defined(CONFIG_PSTORE_LZ4HC_COMPRESS)
-static int decompress_lz4(void *in, void *out, size_t inlen, size_t outlen)
-{
-	int ret;
-
-	ret = LZ4_decompress_safe(in, out, inlen, outlen);
-	if (ret < 0) {
-		/*
-		 * LZ4_decompress_safe will return an error code
-		 * (< 0) if decompression failed
-		 */
-		pr_err("LZ4_decompress_safe error, ret = %d!\n", ret);
-		return -EIO;
-	}
-
-	return ret;
-}
-
-static void free_lz4(void)
-{
-	kfree(workspace);
-	kfree(big_oops_buf);
-	big_oops_buf = NULL;
-	big_oops_buf_sz = 0;
-}
-#endif
-
-#ifdef CONFIG_PSTORE_LZ4_COMPRESS
-static int compress_lz4(const void *in, void *out, size_t inlen, size_t outlen)
-{
-	int ret;
-
-	ret = LZ4_compress_default(in, out, inlen, outlen, workspace);
-	if (!ret) {
-		pr_err("LZ4_compress_default error; compression failed!\n");
-		return -EIO;
-	}
-
-	return ret;
-}
-
-static void allocate_lz4(void)
-{
-	big_oops_buf_sz = LZ4_compressBound(psinfo->bufsize);
-	big_oops_buf = kmalloc(big_oops_buf_sz, GFP_KERNEL);
-	if (big_oops_buf) {
-		workspace = kmalloc(LZ4_MEM_COMPRESS, GFP_KERNEL);
-		if (!workspace) {
-			pr_err("No memory for compression workspace; skipping compression\n");
-			kfree(big_oops_buf);
-			big_oops_buf = NULL;
-		}
-	} else {
-		pr_err("No memory for uncompressed data; skipping compression\n");
-		workspace = NULL;
-	}
-}
-#endif
-
-#ifdef CONFIG_PSTORE_LZ4HC_COMPRESS
-static int compress_lz4hc(const void *in, void *out,
-			  size_t inlen, size_t outlen)
+static int zbufsize_lz4(size_t size)
 {
-	int ret;
-
-	ret = LZ4_compress_HC(in, out, inlen, outlen,
-			      LZ4HC_DEFAULT_CLEVEL, workspace);
-	if (!ret) {
-		pr_err("LZ4_compress_HC error; compression failed!\n");
-		return -EIO;
-	}
-
-	return ret;
-}
-
-static void allocate_lz4hc(void)
-{
-	big_oops_buf_sz = LZ4_compressBound(psinfo->bufsize);
-	big_oops_buf = kmalloc(big_oops_buf_sz, GFP_KERNEL);
-	if (big_oops_buf) {
-		workspace = kmalloc(LZ4HC_MEM_COMPRESS, GFP_KERNEL);
-		if (!workspace) {
-			pr_err("No memory for compression workspace; skipping compression\n");
-			kfree(big_oops_buf);
-			big_oops_buf = NULL;
-		}
-	} else {
-		pr_err("No memory for uncompressed data; skipping compression\n");
-		workspace = NULL;
-	}
+	return LZ4_compressBound(size);
 }
 #endif
 
 #ifdef CONFIG_PSTORE_842_COMPRESS
-static int compress_842(const void *in, void *out, size_t inlen, size_t outlen)
-{
-	int ret;
-	unsigned int size;
-
-	if (outlen > UINT_MAX)
-		return -EIO;
-	size = outlen;
-
-	ret = sw842_compress(in, inlen, out, &size, workspace);
-	if (ret) {
-		pr_err("sw842_compress error; compression failed!\n");
-		return ret;
-	}
-
-	return size;
-}
-
-static int decompress_842(void *in, void *out, size_t inlen, size_t outlen)
+static int zbufsize_842(size_t size)
 {
-	int ret;
-	unsigned int size;
-
-	if (outlen > UINT_MAX)
-		return -EIO;
-	size = outlen;
-
-	ret = sw842_decompress(in, inlen, out, &size);
-	if (ret) {
-		pr_err("sw842_decompress error, ret = %d!\n", ret);
-		return ret;
-	}
-
 	return size;
 }
-
-static void allocate_842(void)
-{
-	big_oops_buf_sz = psinfo->bufsize;
-	big_oops_buf = kmalloc(big_oops_buf_sz, GFP_KERNEL);
-	if (big_oops_buf) {
-		workspace = kmalloc(SW842_MEM_COMPRESS, GFP_KERNEL);
-		if (!workspace) {
-			kfree(big_oops_buf);
-			big_oops_buf = NULL;
-		}
-	} else {
-		pr_err("No memory for uncompressed data; skipping compression\n");
-		workspace = NULL;
-	}
-}
-
-static void free_842(void)
-{
-	kfree(workspace);
-	kfree(big_oops_buf);
-	big_oops_buf = NULL;
-	big_oops_buf_sz = 0;
-}
 #endif
 
 static const struct pstore_zbackend *zbackend __ro_after_init;
 
 static const struct pstore_zbackend zbackends[] = {
-#ifdef CONFIG_PSTORE_ZLIB_COMPRESS
+#ifdef CONFIG_PSTORE_DEFLATE_COMPRESS
 	{
-		.compress	= compress_zlib,
-		.decompress	= decompress_zlib,
-		.allocate	= allocate_zlib,
-		.free		= free_zlib,
-		.name		= "zlib",
+		.zbufsize	= zbufsize_deflate,
+		.name		= "deflate",
 	},
 #endif
 #ifdef CONFIG_PSTORE_LZO_COMPRESS
 	{
-		.compress	= compress_lzo,
-		.decompress	= decompress_lzo,
-		.allocate	= allocate_lzo,
-		.free		= free_lzo,
+		.zbufsize	= zbufsize_lzo,
 		.name		= "lzo",
 	},
 #endif
 #ifdef CONFIG_PSTORE_LZ4_COMPRESS
 	{
-		.compress	= compress_lz4,
-		.decompress	= decompress_lz4,
-		.allocate	= allocate_lz4,
-		.free		= free_lz4,
+		.zbufsize	= zbufsize_lz4,
 		.name		= "lz4",
 	},
 #endif
 #ifdef CONFIG_PSTORE_LZ4HC_COMPRESS
 	{
-		.compress	= compress_lz4hc,
-		.decompress	= decompress_lz4,
-		.allocate	= allocate_lz4hc,
-		.free		= free_lz4,
+		.zbufsize	= zbufsize_lz4,
 		.name		= "lz4hc",
 	},
 #endif
 #ifdef CONFIG_PSTORE_842_COMPRESS
 	{
-		.compress	= compress_842,
-		.decompress	= decompress_842,
-		.allocate	= allocate_842,
-		.free		= free_842,
+		.zbufsize	= zbufsize_842,
 		.name		= "842",
 	},
 #endif
@@ -540,37 +229,65 @@ static const struct pstore_zbackend zbackends[] = {
 };
 
 static int pstore_compress(const void *in, void *out,
-			   size_t inlen, size_t outlen)
+			   unsigned int inlen, unsigned int outlen)
 {
-	if (zbackend)
-		return zbackend->compress(in, out, inlen, outlen);
-	else
-		return -EIO;
+	int ret;
+
+	ret = crypto_comp_compress(tfm, in, inlen, out, &outlen);
+	if (ret) {
+		pr_err("crypto_comp_compress failed, ret = %d!\n", ret);
+		return ret;
+	}
+
+	return outlen;
 }
 
-static int pstore_decompress(void *in, void *out, size_t inlen, size_t outlen)
+static int pstore_decompress(void *in, void *out,
+			     unsigned int inlen, unsigned int outlen)
 {
-	if (zbackend)
-		return zbackend->decompress(in, out, inlen, outlen);
-	else
-		return -EIO;
+	int ret;
+
+	ret = crypto_comp_decompress(tfm, in, inlen, out, &outlen);
+	if (ret) {
+		pr_err("crypto_comp_decompress failed, ret = %d!\n", ret);
+		return ret;
+	}
+
+	return outlen;
 }
 
 static void allocate_buf_for_compression(void)
 {
-	if (zbackend) {
-		zbackend->allocate();
-	} else {
-		pr_err("allocate compression buffer error!\n");
+	if (!zbackend)
+		return;
+
+	if (!crypto_has_comp(zbackend->name, 0, 0)) {
+		pr_err("No %s compression\n", zbackend->name);
+		return;
+	}
+
+	big_oops_buf_sz = zbackend->zbufsize(psinfo->bufsize);
+	if (big_oops_buf_sz <= 0)
+		return;
+
+	big_oops_buf = kmalloc(big_oops_buf_sz, GFP_KERNEL);
+	if (!big_oops_buf)
+		return;
+
+	tfm = crypto_alloc_comp(zbackend->name, 0, 0);
+	if (IS_ERR_OR_NULL(tfm)) {
+		kfree(big_oops_buf);
+		big_oops_buf = NULL;
 	}
 }
 
 static void free_buf_for_compression(void)
 {
-	if (zbackend)
-		zbackend->free();
-	else
-		pr_err("free compression buffer error!\n");
+	if (!IS_ERR_OR_NULL(tfm))
+		crypto_free_comp(tfm);
+	kfree(big_oops_buf);
+	big_oops_buf = NULL;
+	big_oops_buf_sz = 0;
 }
 
 /*
diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
index 7125b398d312..49b2bc114868 100644
--- a/fs/pstore/ram.c
+++ b/fs/pstore/ram.c
@@ -938,7 +938,7 @@ static int __init ramoops_init(void)
 	ramoops_register_dummy();
 	return platform_driver_register(&ramoops_driver);
 }
-postcore_initcall(ramoops_init);
+late_initcall(ramoops_init);
 
 static void __exit ramoops_exit(void)
 {
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] pstore: use crypto compress API
  2018-03-09 10:51 [PATCH] pstore: use crypto compress API Geliang Tang
@ 2018-03-09 22:00 ` Kees Cook
  0 siblings, 0 replies; 2+ messages in thread
From: Kees Cook @ 2018-03-09 22:00 UTC (permalink / raw)
  To: Geliang Tang; +Cc: Anton Vorontsov, Colin Cross, Tony Luck, LKML

On Fri, Mar 9, 2018 at 2:51 AM, Geliang Tang <geliangtang@gmail.com> wrote:
> In the pstore compression part, we use zlib/lzo/lz4/lz4hc/842
> compression algorithm API to implement pstore compression backends. But
> there are many repeat codes in these implementations. This patch uses
> crypto compress API to simplify these codes.
>
> 1) rewrite allocate_buf_for_compression, free_buf_for_compression,
> pstore_compress, pstore_decompress functions using crypto compress API.
> 2) drop compress, decompress, allocate, free functions in pstore_zbackend,
> and add zbufsize function to get each different compress buffer size.
> 3) use late_initcall to call ramoops_init later, to make sure the crypto
> subsystem has already initialized.
> 4) use 'unsigned int' type instead of 'size_t' in pstore_compress,
> pstore_decompress functions' length arguments.
> 5) rename 'zlib' to 'deflate' to follow the crypto API's name
> convention.
>
> Signed-off-by: Geliang Tang <geliangtang@gmail.com>
> ---
>  fs/pstore/Kconfig    |  33 ++--
>  fs/pstore/platform.c | 413 ++++++++-------------------------------------------
>  fs/pstore/ram.c      |   2 +-
>  3 files changed, 80 insertions(+), 368 deletions(-)

Yay code removal! This is very nice. Thanks!

-Kees

-- 
Kees Cook
Pixel Security<div class="gmail_extra"><br><div class="gmail_quote">On
Fri, Mar 9, 2018 at 2:51 AM, Geliang Tang <span dir="ltr">&lt;<a
href="mailto:geliangtang@gmail.com"
target="_blank">geliangtang@gmail.com</a>&gt;</span>
wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">In the pstore
compression part, we use zlib/lzo/lz4/lz4hc/842<br>
compression algorithm API to implement pstore compression backends. But<br>
there are many repeat codes in these implementations. This patch uses<br>
crypto compress API to simplify these codes.<br>
<br>
1) rewrite allocate_buf_for_compression, free_buf_for_compression,<br>
pstore_compress, pstore_decompress functions using crypto compress API.<br>
2) drop compress, decompress, allocate, free functions in pstore_zbackend,<br>
and add zbufsize function to get each different compress buffer size.<br>
3) use late_initcall to call ramoops_init later, to make sure the crypto<br>
subsystem has already initialized.<br>
4) use 'unsigned int' type instead of 'size_t' in pstore_compress,<br>
pstore_decompress functions' length arguments.<br>
5) rename 'zlib' to 'deflate' to follow the crypto API's name<br>
convention.<br>
<br>
Signed-off-by: Geliang Tang &lt;<a
href="mailto:geliangtang@gmail.com">geliangtang@gmail.com</a>&gt;<br>
---<br>
&nbsp;fs/pstore/Kconfig&nbsp; &nbsp; |&nbsp; 33 ++--<br>
&nbsp;fs/pstore/platform.c | 413
++++++++----------------------<wbr>---------------------<br>
&nbsp;fs/pstore/ram.c&nbsp; &nbsp; &nbsp; |&nbsp; &nbsp;2 +-<br>
&nbsp;3 files changed, 80 insertions(+), 368 deletions(-)<br>
<br>
diff --git a/fs/pstore/Kconfig b/fs/pstore/Kconfig<br>
index e4e22026c7a1..26f1c0fcada3 100644<br>
--- a/fs/pstore/Kconfig<br>
+++ b/fs/pstore/Kconfig<br>
@@ -12,51 +12,46 @@ config PSTORE<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;If you don't have a platform
persistent store driver,<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;say N.<br>
<br>
-config PSTORE_ZLIB_COMPRESS<br>
-&nbsp; &nbsp; &nbsp; &nbsp;bool "ZLIB compression"<br>
+config PSTORE_DEFLATE_COMPRESS<br>
+&nbsp; &nbsp; &nbsp; &nbsp;bool "DEFLATE compression"<br>
&nbsp; &nbsp; &nbsp; &nbsp; default y<br>
&nbsp; &nbsp; &nbsp; &nbsp; depends on PSTORE<br>
-&nbsp; &nbsp; &nbsp; &nbsp;select ZLIB_DEFLATE<br>
-&nbsp; &nbsp; &nbsp; &nbsp;select ZLIB_INFLATE<br>
+&nbsp; &nbsp; &nbsp; &nbsp;select CRYPTO_DEFLATE<br>
&nbsp; &nbsp; &nbsp; &nbsp; help<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;This option enables ZLIB
compression algorithm support.<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;This option enables DEFLATE
compression algorithm support.<br>
<br>
&nbsp;config PSTORE_LZO_COMPRESS<br>
&nbsp; &nbsp; &nbsp; &nbsp; bool "LZO compression"<br>
&nbsp; &nbsp; &nbsp; &nbsp; depends on PSTORE<br>
-&nbsp; &nbsp; &nbsp; &nbsp;select LZO_COMPRESS<br>
-&nbsp; &nbsp; &nbsp; &nbsp;select LZO_DECOMPRESS<br>
+&nbsp; &nbsp; &nbsp; &nbsp;select CRYPTO_LZO<br>
&nbsp; &nbsp; &nbsp; &nbsp; help<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; This option enables LZO compression
algorithm support.<br>
<br>
&nbsp;config PSTORE_LZ4_COMPRESS<br>
&nbsp; &nbsp; &nbsp; &nbsp; bool "LZ4 compression"<br>
&nbsp; &nbsp; &nbsp; &nbsp; depends on PSTORE<br>
-&nbsp; &nbsp; &nbsp; &nbsp;select LZ4_COMPRESS<br>
-&nbsp; &nbsp; &nbsp; &nbsp;select LZ4_DECOMPRESS<br>
+&nbsp; &nbsp; &nbsp; &nbsp;select CRYPTO_LZ4<br>
&nbsp; &nbsp; &nbsp; &nbsp; help<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; This option enables LZ4 compression
algorithm support.<br>
<br>
&nbsp;config PSTORE_LZ4HC_COMPRESS<br>
&nbsp; &nbsp; &nbsp; &nbsp; bool "LZ4HC compression"<br>
&nbsp; &nbsp; &nbsp; &nbsp; depends on PSTORE<br>
-&nbsp; &nbsp; &nbsp; &nbsp;select LZ4HC_COMPRESS<br>
-&nbsp; &nbsp; &nbsp; &nbsp;select LZ4_DECOMPRESS<br>
+&nbsp; &nbsp; &nbsp; &nbsp;select CRYPTO_LZ4HC<br>
&nbsp; &nbsp; &nbsp; &nbsp; help<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; This option enables LZ4HC (high
compression) mode algorithm.<br>
<br>
&nbsp;config PSTORE_842_COMPRESS<br>
&nbsp; &nbsp; &nbsp; &nbsp; bool "842 compression"<br>
&nbsp; &nbsp; &nbsp; &nbsp; depends on PSTORE<br>
-&nbsp; &nbsp; &nbsp; &nbsp;select 842_COMPRESS<br>
-&nbsp; &nbsp; &nbsp; &nbsp;select 842_DECOMPRESS<br>
+&nbsp; &nbsp; &nbsp; &nbsp;select CRYPTO_842<br>
&nbsp; &nbsp; &nbsp; &nbsp; help<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; This option enables 842 compression
algorithm support.<br>
<br>
&nbsp;config PSTORE_COMPRESS<br>
&nbsp; &nbsp; &nbsp; &nbsp; def_bool y<br>
&nbsp; &nbsp; &nbsp; &nbsp; depends on PSTORE<br>
-&nbsp; &nbsp; &nbsp; &nbsp;depends on PSTORE_ZLIB_COMPRESS ||
PSTORE_LZO_COMPRESS ||&nbsp; &nbsp; &nbsp; &nbsp;\<br>
+&nbsp; &nbsp; &nbsp; &nbsp;depends on PSTORE_DEFLATE_COMPRESS ||
PSTORE_LZO_COMPRESS ||&nbsp; &nbsp; \<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;PSTORE_LZ4_COMPRESS || PSTORE_LZ4HC_COMPRESS ||&nbsp; &nbsp;
&nbsp; \<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;PSTORE_842_COMPRESS<br>
<br>
@@ -69,12 +64,12 @@ choice<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; the kernel command line.<br>
<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Currently, pstore has support for 5
compression algorithms:<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;zlib, lzo, lz4, lz4hc and 842.<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;deflate, lzo, lz4, lz4hc and 842.<br>
<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;The default compression algorithm
is zlib.<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;The default compression algorithm
is deflate.<br>
<br>
-&nbsp; &nbsp; &nbsp; &nbsp;config PSTORE_ZLIB_COMPRESS_DEFAULT<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bool "zlib" if
PSTORE_ZLIB_COMPRESS=y<br>
+&nbsp; &nbsp; &nbsp; &nbsp;config PSTORE_DEFLATE_COMPRESS_<wbr>DEFAULT<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bool "deflate"
if PSTORE_DEFLATE_COMPRESS=y<br>
<br>
&nbsp; &nbsp; &nbsp; &nbsp; config PSTORE_LZO_COMPRESS_DEFAULT<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool "lzo" if
PSTORE_LZO_COMPRESS=y<br>
@@ -93,7 +88,7 @@ endchoice<br>
&nbsp;config PSTORE_COMPRESS_DEFAULT<br>
&nbsp; &nbsp; &nbsp; &nbsp; string<br>
&nbsp; &nbsp; &nbsp; &nbsp; depends on PSTORE_COMPRESS<br>
-&nbsp; &nbsp; &nbsp; &nbsp;default "zlib" if PSTORE_ZLIB_COMPRESS_DEFAULT<br>
+&nbsp; &nbsp; &nbsp; &nbsp;default "deflate" if
PSTORE_DEFLATE_COMPRESS_<wbr>DEFAULT<br>
&nbsp; &nbsp; &nbsp; &nbsp; default "lzo" if PSTORE_LZO_COMPRESS_DEFAULT<br>
&nbsp; &nbsp; &nbsp; &nbsp; default "lz4" if PSTORE_LZ4_COMPRESS_DEFAULT<br>
&nbsp; &nbsp; &nbsp; &nbsp; default "lz4hc" if PSTORE_LZ4HC_COMPRESS_DEFAULT<br>
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c<br>
index 06e3b280c3a5..1d40b4588d68 100644<br>
--- a/fs/pstore/platform.c<br>
+++ b/fs/pstore/platform.c<br>
@@ -28,18 +28,13 @@<br>
&nbsp;#include &lt;linux/console.h&gt;<br>
&nbsp;#include &lt;linux/module.h&gt;<br>
&nbsp;#include &lt;linux/pstore.h&gt;<br>
-#ifdef CONFIG_PSTORE_ZLIB_COMPRESS<br>
-#include &lt;linux/zlib.h&gt;<br>
-#endif<br>
&nbsp;#ifdef CONFIG_PSTORE_LZO_COMPRESS<br>
&nbsp;#include &lt;linux/lzo.h&gt;<br>
&nbsp;#endif<br>
&nbsp;#if defined(CONFIG_PSTORE_LZ4_<wbr>COMPRESS) ||
defined(CONFIG_PSTORE_LZ4HC_<wbr>COMPRESS)<br>
&nbsp;#include &lt;linux/lz4.h&gt;<br>
&nbsp;#endif<br>
-#ifdef CONFIG_PSTORE_842_COMPRESS<br>
-#include &lt;linux/sw842.h&gt;<br>
-#endif<br>
+#include &lt;linux/crypto.h&gt;<br>
&nbsp;#include &lt;linux/string.h&gt;<br>
&nbsp;#include &lt;linux/timer.h&gt;<br>
&nbsp;#include &lt;linux/slab.h&gt;<br>
@@ -85,25 +80,10 @@ static char *compress =<br>
&nbsp;#endif<br>
<br>
&nbsp;/* Compression parameters */<br>
-#ifdef CONFIG_PSTORE_ZLIB_COMPRESS<br>
-#define COMPR_LEVEL 6<br>
-#define WINDOW_BITS 12<br>
-#define MEM_LEVEL 4<br>
-static struct z_stream_s stream;<br>
-#endif<br>
-#if defined(CONFIG_PSTORE_LZO_<wbr>COMPRESS)&nbsp; &nbsp;|| \<br>
-&nbsp; &nbsp; defined(CONFIG_PSTORE_LZ4_<wbr>COMPRESS)&nbsp; &nbsp;|| \<br>
-&nbsp; &nbsp; defined(CONFIG_PSTORE_LZ4HC_<wbr>COMPRESS) || \<br>
-&nbsp; &nbsp; defined(CONFIG_PSTORE_842_<wbr>COMPRESS)<br>
-static unsigned char *workspace;<br>
-#endif<br>
+static struct crypto_comp *tfm;<br>
<br>
&nbsp;struct pstore_zbackend {<br>
-&nbsp; &nbsp; &nbsp; &nbsp;int (*compress)(const void *in, void *out,
size_t inlen, size_t outlen);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;int (*decompress)(void *in, void *out,
size_t inlen, size_t outlen);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;void (*allocate)(void);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;void (*free)(void);<br>
-<br>
+&nbsp; &nbsp; &nbsp; &nbsp;int (*zbufsize)(size_t size);<br>
&nbsp; &nbsp; &nbsp; &nbsp; const char *name;<br>
&nbsp;};<br>
<br>
@@ -162,77 +142,12 @@ bool pstore_cannot_block_path(enum
kmsg_dump_reason reason)<br>
&nbsp;}<br>
&nbsp;EXPORT_SYMBOL_GPL(pstore_<wbr>cannot_block_path);<br>
<br>
-#ifdef CONFIG_PSTORE_ZLIB_COMPRESS<br>
-/* Derived from logfs_compress() */<br>
-static int compress_zlib(const void *in, void *out, size_t inlen,
size_t outlen)<br>
+#ifdef CONFIG_PSTORE_DEFLATE_COMPRESS<br>
+static int zbufsize_deflate(size_t size)<br>
&nbsp;{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;int err, ret;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;ret = -EIO;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;err = zlib_deflateInit2(&amp;stream,
COMPR_LEVEL, Z_DEFLATED, WINDOW_BITS,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;MEM_LEVEL, Z_DEFAULT_STRATEGY);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (err != Z_OK)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto error;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;stream.next_in = in;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;stream.avail_in = inlen;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;stream.total_in = 0;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;stream.next_out = out;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;stream.avail_out = outlen;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;stream.total_out = 0;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;err = zlib_deflate(&amp;stream, Z_FINISH);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (err != Z_STREAM_END)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto error;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;err = zlib_deflateEnd(&amp;stream);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (err != Z_OK)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto error;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (stream.total_out &gt;= stream.total_in)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto error;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;ret = stream.total_out;<br>
-error:<br>
-&nbsp; &nbsp; &nbsp; &nbsp;return ret;<br>
-}<br>
-<br>
-/* Derived from logfs_uncompress */<br>
-static int decompress_zlib(void *in, void *out, size_t inlen, size_t
outlen)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;int err, ret;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;ret = -EIO;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;err = zlib_inflateInit2(&amp;stream,
WINDOW_BITS);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (err != Z_OK)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto error;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;stream.next_in = in;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;stream.avail_in = inlen;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;stream.total_in = 0;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;stream.next_out = out;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;stream.avail_out = outlen;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;stream.total_out = 0;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;err = zlib_inflate(&amp;stream, Z_FINISH);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (err != Z_STREAM_END)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto error;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;err = zlib_inflateEnd(&amp;stream);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (err != Z_OK)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto error;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;ret = stream.total_out;<br>
-error:<br>
-&nbsp; &nbsp; &nbsp; &nbsp;return ret;<br>
-}<br>
-<br>
-static void allocate_zlib(void)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;size_t size;<br>
&nbsp; &nbsp; &nbsp; &nbsp; size_t cmpr;<br>
<br>
-&nbsp; &nbsp; &nbsp; &nbsp;switch (psinfo-&gt;bufsize) {<br>
+&nbsp; &nbsp; &nbsp; &nbsp;switch (size) {<br>
&nbsp; &nbsp; &nbsp; &nbsp; /* buffer range for efivars */<br>
&nbsp; &nbsp; &nbsp; &nbsp; case 1000 ... 2000:<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cmpr = 56;<br>
@@ -252,287 +167,61 @@ static void allocate_zlib(void)<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br>
&nbsp; &nbsp; &nbsp; &nbsp; }<br>
<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf_sz = (psinfo-&gt;bufsize *
100) / cmpr;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf = kmalloc(big_oops_buf_sz,
GFP_KERNEL);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (big_oops_buf) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;size =
max(zlib_deflate_<wbr>workspacesize(WINDOW_BITS, MEM_LEVEL),<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;zlib_inflate_workspacesize());<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;stream.workspace = kmalloc(size, GFP_KERNEL);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if
(!stream.workspace) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;pr_err("No memory for compression workspace; skipping
compression\n");<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;kfree(big_oops_buf);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;big_oops_buf = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
-&nbsp; &nbsp; &nbsp; &nbsp;} else {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pr_err("No
memory for uncompressed data; skipping compression\n");<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;stream.workspace = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;}<br>
-<br>
-}<br>
-<br>
-static void free_zlib(void)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;kfree(stream.workspace);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;stream.workspace = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;kfree(big_oops_buf);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf_sz = 0;<br>
+&nbsp; &nbsp; &nbsp; &nbsp;return (size * 100) / cmpr;<br>
&nbsp;}<br>
&nbsp;#endif<br>
<br>
&nbsp;#ifdef CONFIG_PSTORE_LZO_COMPRESS<br>
-static int compress_lzo(const void *in, void *out, size_t inlen,
size_t outlen)<br>
+static int zbufsize_lzo(size_t size)<br>
&nbsp;{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;int ret;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;ret = lzo1x_1_compress(in, inlen, out,
&amp;outlen, workspace);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (ret != LZO_E_OK) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;pr_err("lzo_compress error, ret = %d!\n", ret);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -EIO;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;}<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;return outlen;<br>
-}<br>
-<br>
-static int decompress_lzo(void *in, void *out, size_t inlen, size_t outlen)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;int ret;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;ret = lzo1x_decompress_safe(in, inlen,
out, &amp;outlen);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (ret != LZO_E_OK) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;pr_err("lzo_decompress error, ret = %d!\n", ret);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -EIO;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;}<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;return outlen;<br>
-}<br>
-<br>
-static void allocate_lzo(void)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf_sz =
lzo1x_worst_compress(psinfo-&gt;<wbr>bufsize);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf = kmalloc(big_oops_buf_sz,
GFP_KERNEL);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (big_oops_buf) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;workspace =
kmalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!workspace) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;pr_err("No memory for compression workspace; skipping
compression\n");<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;kfree(big_oops_buf);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;big_oops_buf = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
-&nbsp; &nbsp; &nbsp; &nbsp;} else {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pr_err("No
memory for uncompressed data; skipping compression\n");<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;workspace = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;}<br>
-}<br>
-<br>
-static void free_lzo(void)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;kfree(workspace);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;kfree(big_oops_buf);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf_sz = 0;<br>
+&nbsp; &nbsp; &nbsp; &nbsp;return lzo1x_worst_compress(size);<br>
&nbsp;}<br>
&nbsp;#endif<br>
<br>
&nbsp;#if defined(CONFIG_PSTORE_LZ4_<wbr>COMPRESS) ||
defined(CONFIG_PSTORE_LZ4HC_<wbr>COMPRESS)<br>
-static int decompress_lz4(void *in, void *out, size_t inlen, size_t outlen)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;int ret;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;ret = LZ4_decompress_safe(in, out, inlen,
outlen);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (ret &lt; 0) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/*<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *
LZ4_decompress_safe will return an error code<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; * (&lt; 0) if
decompression failed<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;pr_err("LZ4_decompress_safe error, ret = %d!\n", ret);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -EIO;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;}<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;return ret;<br>
-}<br>
-<br>
-static void free_lz4(void)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;kfree(workspace);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;kfree(big_oops_buf);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf_sz = 0;<br>
-}<br>
-#endif<br>
-<br>
-#ifdef CONFIG_PSTORE_LZ4_COMPRESS<br>
-static int compress_lz4(const void *in, void *out, size_t inlen,
size_t outlen)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;int ret;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;ret = LZ4_compress_default(in, out, inlen,
outlen, workspace);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (!ret) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;pr_err("LZ4_compress_default error; compression failed!\n");<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -EIO;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;}<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;return ret;<br>
-}<br>
-<br>
-static void allocate_lz4(void)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf_sz =
LZ4_compressBound(psinfo-&gt;<wbr>bufsize);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf = kmalloc(big_oops_buf_sz,
GFP_KERNEL);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (big_oops_buf) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;workspace =
kmalloc(LZ4_MEM_COMPRESS, GFP_KERNEL);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!workspace) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;pr_err("No memory for compression workspace; skipping
compression\n");<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;kfree(big_oops_buf);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;big_oops_buf = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
-&nbsp; &nbsp; &nbsp; &nbsp;} else {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pr_err("No
memory for uncompressed data; skipping compression\n");<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;workspace = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;}<br>
-}<br>
-#endif<br>
-<br>
-#ifdef CONFIG_PSTORE_LZ4HC_COMPRESS<br>
-static int compress_lz4hc(const void *in, void *out,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp;size_t inlen, size_t outlen)<br>
+static int zbufsize_lz4(size_t size)<br>
&nbsp;{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;int ret;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;ret = LZ4_compress_HC(in, out, inlen, outlen,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LZ4HC_DEFAULT_CLEVEL,
workspace);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (!ret) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;pr_err("LZ4_compress_HC error; compression failed!\n");<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -EIO;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;}<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;return ret;<br>
-}<br>
-<br>
-static void allocate_lz4hc(void)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf_sz =
LZ4_compressBound(psinfo-&gt;<wbr>bufsize);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf = kmalloc(big_oops_buf_sz,
GFP_KERNEL);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (big_oops_buf) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;workspace =
kmalloc(LZ4HC_MEM_COMPRESS, GFP_KERNEL);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!workspace) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;pr_err("No memory for compression workspace; skipping
compression\n");<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;kfree(big_oops_buf);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;big_oops_buf = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
-&nbsp; &nbsp; &nbsp; &nbsp;} else {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pr_err("No
memory for uncompressed data; skipping compression\n");<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;workspace = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;}<br>
+&nbsp; &nbsp; &nbsp; &nbsp;return LZ4_compressBound(size);<br>
&nbsp;}<br>
&nbsp;#endif<br>
<br>
&nbsp;#ifdef CONFIG_PSTORE_842_COMPRESS<br>
-static int compress_842(const void *in, void *out, size_t inlen,
size_t outlen)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;int ret;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;unsigned int size;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (outlen &gt; UINT_MAX)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -EIO;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;size = outlen;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;ret = sw842_compress(in, inlen, out,
&amp;size, workspace);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (ret) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;pr_err("sw842_compress error; compression failed!\n");<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return ret;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;}<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;return size;<br>
-}<br>
-<br>
-static int decompress_842(void *in, void *out, size_t inlen, size_t outlen)<br>
+static int zbufsize_842(size_t size)<br>
&nbsp;{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;int ret;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;unsigned int size;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (outlen &gt; UINT_MAX)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -EIO;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;size = outlen;<br>
-<br>
-&nbsp; &nbsp; &nbsp; &nbsp;ret = sw842_decompress(in, inlen, out,
&amp;size);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (ret) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;pr_err("sw842_decompress error, ret = %d!\n", ret);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return ret;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;}<br>
-<br>
&nbsp; &nbsp; &nbsp; &nbsp; return size;<br>
&nbsp;}<br>
-<br>
-static void allocate_842(void)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf_sz = psinfo-&gt;bufsize;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf = kmalloc(big_oops_buf_sz,
GFP_KERNEL);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (big_oops_buf) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;workspace =
kmalloc(SW842_MEM_COMPRESS, GFP_KERNEL);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!workspace) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;kfree(big_oops_buf);<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;big_oops_buf = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
-&nbsp; &nbsp; &nbsp; &nbsp;} else {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pr_err("No
memory for uncompressed data; skipping compression\n");<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;workspace = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;}<br>
-}<br>
-<br>
-static void free_842(void)<br>
-{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;kfree(workspace);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;kfree(big_oops_buf);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf = NULL;<br>
-&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf_sz = 0;<br>
-}<br>
&nbsp;#endif<br>
<br>
&nbsp;static const struct pstore_zbackend *zbackend __ro_after_init;<br>
<br>
&nbsp;static const struct pstore_zbackend zbackends[] = {<br>
-#ifdef CONFIG_PSTORE_ZLIB_COMPRESS<br>
+#ifdef CONFIG_PSTORE_DEFLATE_COMPRESS<br>
&nbsp; &nbsp; &nbsp; &nbsp; {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.compress&nbsp; &nbsp; &nbsp; &nbsp;= compress_zlib,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.decompress&nbsp; &nbsp; &nbsp;= decompress_zlib,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.allocate&nbsp; &nbsp; &nbsp; &nbsp;= allocate_zlib,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.free&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= free_zlib,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.name&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= "zlib",<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.zbufsize&nbsp; &nbsp; &nbsp; &nbsp;= zbufsize_deflate,<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.name&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= "deflate",<br>
&nbsp; &nbsp; &nbsp; &nbsp; },<br>
&nbsp;#endif<br>
&nbsp;#ifdef CONFIG_PSTORE_LZO_COMPRESS<br>
&nbsp; &nbsp; &nbsp; &nbsp; {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.compress&nbsp; &nbsp; &nbsp; &nbsp;= compress_lzo,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.decompress&nbsp; &nbsp; &nbsp;= decompress_lzo,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.allocate&nbsp; &nbsp; &nbsp; &nbsp;= allocate_lzo,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.free&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= free_lzo,<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.zbufsize&nbsp; &nbsp; &nbsp; &nbsp;= zbufsize_lzo,<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .name&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= "lzo",<br>
&nbsp; &nbsp; &nbsp; &nbsp; },<br>
&nbsp;#endif<br>
&nbsp;#ifdef CONFIG_PSTORE_LZ4_COMPRESS<br>
&nbsp; &nbsp; &nbsp; &nbsp; {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.compress&nbsp; &nbsp; &nbsp; &nbsp;= compress_lz4,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.decompress&nbsp; &nbsp; &nbsp;= decompress_lz4,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.allocate&nbsp; &nbsp; &nbsp; &nbsp;= allocate_lz4,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.free&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= free_lz4,<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.zbufsize&nbsp; &nbsp; &nbsp; &nbsp;= zbufsize_lz4,<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .name&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= "lz4",<br>
&nbsp; &nbsp; &nbsp; &nbsp; },<br>
&nbsp;#endif<br>
&nbsp;#ifdef CONFIG_PSTORE_LZ4HC_COMPRESS<br>
&nbsp; &nbsp; &nbsp; &nbsp; {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.compress&nbsp; &nbsp; &nbsp; &nbsp;= compress_lz4hc,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.decompress&nbsp; &nbsp; &nbsp;= decompress_lz4,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.allocate&nbsp; &nbsp; &nbsp; &nbsp;= allocate_lz4hc,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.free&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= free_lz4,<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.zbufsize&nbsp; &nbsp; &nbsp; &nbsp;= zbufsize_lz4,<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .name&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= "lz4hc",<br>
&nbsp; &nbsp; &nbsp; &nbsp; },<br>
&nbsp;#endif<br>
&nbsp;#ifdef CONFIG_PSTORE_842_COMPRESS<br>
&nbsp; &nbsp; &nbsp; &nbsp; {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.compress&nbsp; &nbsp; &nbsp; &nbsp;= compress_842,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.decompress&nbsp; &nbsp; &nbsp;= decompress_842,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.allocate&nbsp; &nbsp; &nbsp; &nbsp;= allocate_842,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.free&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= free_842,<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;.zbufsize&nbsp; &nbsp; &nbsp; &nbsp;= zbufsize_842,<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .name&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= "842",<br>
&nbsp; &nbsp; &nbsp; &nbsp; },<br>
&nbsp;#endif<br>
@@ -540,37 +229,65 @@ static const struct pstore_zbackend zbackends[] = {<br>
&nbsp;};<br>
<br>
&nbsp;static int pstore_compress(const void *in, void *out,<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; size_t inlen, size_t outlen)<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; unsigned int inlen, unsigned int outlen)<br>
&nbsp;{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (zbackend)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return
zbackend-&gt;compress(in, out, inlen, outlen);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;else<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -EIO;<br>
+&nbsp; &nbsp; &nbsp; &nbsp;int ret;<br>
+<br>
+&nbsp; &nbsp; &nbsp; &nbsp;ret = crypto_comp_compress(tfm, in, inlen,
out, &amp;outlen);<br>
+&nbsp; &nbsp; &nbsp; &nbsp;if (ret) {<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;pr_err("crypto_comp_compress failed, ret = %d!\n", ret);<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return ret;<br>
+&nbsp; &nbsp; &nbsp; &nbsp;}<br>
+<br>
+&nbsp; &nbsp; &nbsp; &nbsp;return outlen;<br>
&nbsp;}<br>
<br>
-static int pstore_decompress(void *in, void *out, size_t inlen,
size_t outlen)<br>
+static int pstore_decompress(void *in, void *out,<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; unsigned int inlen, unsigned int
outlen)<br>
&nbsp;{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (zbackend)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return
zbackend-&gt;decompress(in, out, inlen, outlen);<br>
-&nbsp; &nbsp; &nbsp; &nbsp;else<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -EIO;<br>
+&nbsp; &nbsp; &nbsp; &nbsp;int ret;<br>
+<br>
+&nbsp; &nbsp; &nbsp; &nbsp;ret = crypto_comp_decompress(tfm, in,
inlen, out, &amp;outlen);<br>
+&nbsp; &nbsp; &nbsp; &nbsp;if (ret) {<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;pr_err("crypto_comp_decompress failed, ret = %d!\n", ret);<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return ret;<br>
+&nbsp; &nbsp; &nbsp; &nbsp;}<br>
+<br>
+&nbsp; &nbsp; &nbsp; &nbsp;return outlen;<br>
&nbsp;}<br>
<br>
&nbsp;static void allocate_buf_for_compression(<wbr>void)<br>
&nbsp;{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (zbackend) {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;zbackend-&gt;allocate();<br>
-&nbsp; &nbsp; &nbsp; &nbsp;} else {<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;pr_err("allocate compression buffer error!\n");<br>
+&nbsp; &nbsp; &nbsp; &nbsp;if (!zbackend)<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<br>
+<br>
+&nbsp; &nbsp; &nbsp; &nbsp;if
(!crypto_has_comp(zbackend-&gt;<wbr>name, 0, 0)) {<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pr_err("No %s
compression\n", zbackend-&gt;name);<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<br>
+&nbsp; &nbsp; &nbsp; &nbsp;}<br>
+<br>
+&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf_sz =
zbackend-&gt;zbufsize(psinfo-&gt;<wbr>bufsize);<br>
+&nbsp; &nbsp; &nbsp; &nbsp;if (big_oops_buf_sz &lt;= 0)<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<br>
+<br>
+&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf = kmalloc(big_oops_buf_sz,
GFP_KERNEL);<br>
+&nbsp; &nbsp; &nbsp; &nbsp;if (!big_oops_buf)<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<br>
+<br>
+&nbsp; &nbsp; &nbsp; &nbsp;tfm =
crypto_alloc_comp(zbackend-&gt;<wbr>name, 0, 0);<br>
+&nbsp; &nbsp; &nbsp; &nbsp;if (IS_ERR_OR_NULL(tfm)) {<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;kfree(big_oops_buf);<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf = NULL;<br>
&nbsp; &nbsp; &nbsp; &nbsp; }<br>
&nbsp;}<br>
<br>
&nbsp;static void free_buf_for_compression(void)<br>
&nbsp;{<br>
-&nbsp; &nbsp; &nbsp; &nbsp;if (zbackend)<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;zbackend-&gt;free();<br>
-&nbsp; &nbsp; &nbsp; &nbsp;else<br>
-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pr_err("free
compression buffer error!\n");<br>
+&nbsp; &nbsp; &nbsp; &nbsp;if (!IS_ERR_OR_NULL(tfm))<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;crypto_free_comp(tfm);<br>
+&nbsp; &nbsp; &nbsp; &nbsp;kfree(big_oops_buf);<br>
+&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf = NULL;<br>
+&nbsp; &nbsp; &nbsp; &nbsp;big_oops_buf_sz = 0;<br>
&nbsp;}<br>
<br>
&nbsp;/*<br>
diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c<br>
index 7125b398d312..49b2bc114868 100644<br>
--- a/fs/pstore/ram.c<br>
+++ b/fs/pstore/ram.c<br>
@@ -938,7 +938,7 @@ static int __init ramoops_init(void)<br>
&nbsp; &nbsp; &nbsp; &nbsp; ramoops_register_dummy();<br>
&nbsp; &nbsp; &nbsp; &nbsp; return
platform_driver_register(&amp;<wbr>ramoops_driver);<br>
&nbsp;}<br>
-postcore_initcall(ramoops_<wbr>init);<br>
+late_initcall(ramoops_init);<br>
<br>
&nbsp;static void __exit ramoops_exit(void)<br>
&nbsp;{<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.14.1<br>
<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>--
<br><div class="gmail_signature" data-smartmail="gmail_signature">Kees
Cook<br>Pixel Security</div>
</div>

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-03-09 22:00 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-09 10:51 [PATCH] pstore: use crypto compress API Geliang Tang
2018-03-09 22:00 ` Kees Cook

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).