Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 95047b05 authored by Kees Cook's avatar Kees Cook
Browse files

pstore: Refactor compression initialization



This refactors compression initialization slightly to better handle
getting potentially called twice (via early pstore_register() calls
and later pstore_init()) and improves the comments and reporting to be
more verbose.

Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Tested-by: default avatarGuenter Roeck <groeck@chromium.org>
parent 41603165
Loading
Loading
Loading
Loading
+33 −15
Original line number Diff line number Diff line
@@ -274,36 +274,56 @@ static int pstore_decompress(void *in, void *out,

static void allocate_buf_for_compression(void)
{
	struct crypto_comp *ctx;
	int size;
	char *buf;

	/* Skip if not built-in or compression backend not selected yet. */
	if (!IS_ENABLED(CONFIG_PSTORE_COMPRESS) || !zbackend)
		return;

	/* Skip if no pstore backend yet or compression init already done. */
	if (!psinfo || tfm)
		return;

	if (!crypto_has_comp(zbackend->name, 0, 0)) {
		pr_err("No %s compression\n", zbackend->name);
		pr_err("Unknown compression: %s\n", zbackend->name);
		return;
	}

	big_oops_buf_sz = zbackend->zbufsize(psinfo->bufsize);
	if (big_oops_buf_sz <= 0)
	size = zbackend->zbufsize(psinfo->bufsize);
	if (size <= 0) {
		pr_err("Invalid compression size for %s: %d\n",
		       zbackend->name, size);
		return;
	}

	big_oops_buf = kmalloc(big_oops_buf_sz, GFP_KERNEL);
	if (!big_oops_buf) {
		pr_err("allocate compression buffer error!\n");
	buf = kmalloc(size, GFP_KERNEL);
	if (!buf) {
		pr_err("Failed %d byte compression buffer allocation for: %s\n",
		       size, zbackend->name);
		return;
	}

	tfm = crypto_alloc_comp(zbackend->name, 0, 0);
	if (IS_ERR_OR_NULL(tfm)) {
		kfree(big_oops_buf);
		big_oops_buf = NULL;
		pr_err("crypto_alloc_comp() failed!\n");
	ctx = crypto_alloc_comp(zbackend->name, 0, 0);
	if (IS_ERR_OR_NULL(ctx)) {
		kfree(buf);
		pr_err("crypto_alloc_comp('%s') failed: %ld\n", zbackend->name,
		       PTR_ERR(ctx));
		return;
	}

	/* A non-NULL big_oops_buf indicates compression is available. */
	tfm = ctx;
	big_oops_buf_sz = size;
	big_oops_buf = buf;

	pr_info("Using compression: %s\n", zbackend->name);
}

static void free_buf_for_compression(void)
{
	if (IS_ENABLED(CONFIG_PSTORE_COMPRESS) && !IS_ERR_OR_NULL(tfm))
	if (IS_ENABLED(CONFIG_PSTORE_COMPRESS) && tfm)
		crypto_free_comp(tfm);
	kfree(big_oops_buf);
	big_oops_buf = NULL;
@@ -774,7 +794,6 @@ void __init pstore_choose_compression(void)
	for (step = zbackends; step->name; step++) {
		if (!strcmp(compress, step->name)) {
			zbackend = step;
			pr_info("using %s compression\n", zbackend->name);
			return;
		}
	}
@@ -791,7 +810,6 @@ static int __init pstore_init(void)
	 * initialize compression because crypto was not ready. If so,
	 * initialize compression now.
	 */
	if (psinfo && !tfm)
	allocate_buf_for_compression();

	ret = pstore_init_fs();