Commit beeb9432 authored by Anton Vorontsov's avatar Anton Vorontsov Committed by Greg Kroah-Hartman
Browse files

pstore/ram_core: Proper checking for post_init errors (e.g. improper ECC size)



We will implement variable-sized ECC buffers soon, so post_init routine
might fail much more likely, so we'd better check for its errors.

To make error handling simple, modify persistent_ram_free() to it be safe
at all times.

Signed-off-by: default avatarAnton Vorontsov <anton.vorontsov@linaro.org>
Acked-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 90b58d96
Loading
Loading
Loading
Loading
+15 −7
Original line number Diff line number Diff line
@@ -427,12 +427,18 @@ static int __devinit persistent_ram_post_init(struct persistent_ram_zone *prz,

void persistent_ram_free(struct persistent_ram_zone *prz)
{
	if (!prz)
		return;

	if (prz->vaddr) {
		if (pfn_valid(prz->paddr >> PAGE_SHIFT)) {
			vunmap(prz->vaddr);
		} else {
			iounmap(prz->vaddr);
			release_mem_region(prz->paddr, prz->size);
		}
		prz->vaddr = NULL;
	}
	persistent_ram_free_old(prz);
	kfree(prz);
}
@@ -454,10 +460,12 @@ struct persistent_ram_zone * __devinit persistent_ram_new(phys_addr_t start,
	if (ret)
		goto err;

	persistent_ram_post_init(prz, ecc);
	ret = persistent_ram_post_init(prz, ecc);
	if (ret)
		goto err;

	return prz;
err:
	kfree(prz);
	persistent_ram_free(prz);
	return ERR_PTR(ret);
}