| From 02073798a6b081bf74e6c10d6f7e7a693c067ecd Mon Sep 17 00:00:00 2001 |
| From: Piotr Sarna <p.sarna@partner.samsung.com> |
| Date: Mon, 29 Jul 2013 12:25:20 +0200 |
| Subject: staging: zcache: fix "zcache=" kernel parameter |
| |
| From: Piotr Sarna <p.sarna@partner.samsung.com> |
| |
| commit 02073798a6b081bf74e6c10d6f7e7a693c067ecd upstream. |
| |
| Commit 835f2f5 ("staging: zcache: enable zcache to be built/loaded as |
| a module") introduced an incorrect handling of "zcache=" parameter. |
| |
| Inside zcache_comp_init() function, zcache_comp_name variable is |
| checked for being empty. If not empty, the above variable is tested |
| for being compatible with Crypto API. Unfortunately, after that |
| function ends unconditionally (by the "goto out" directive) and returns: |
| - non-zero value if verification succeeded, wrongly indicating an error |
| - zero value if verification failed, falsely informing that function |
| zcache_comp_init() ended properly. |
| |
| A solution to this problem is as following: |
| 1. Move the "goto out" directive inside the "if (!ret)" statement |
| 2. In case that crypto_has_comp() returned 0, change the value of ret |
| to non-zero before "goto out" to indicate an error. |
| |
| This patch replaces an earlier one from Michal Hocko (based on report |
| from Cristian Rodriguez): |
| |
| http://permalink.gmane.org/gmane.linux.kernel.mm/102484 |
| |
| It also addressed the same issue but didn't fix the zcache_comp_init() |
| for case when the compressor data passed to "zcache=" option was invalid |
| or unsupported. |
| |
| Signed-off-by: Piotr Sarna <p.sarna@partner.samsung.com> |
| [bzolnier: updated patch description] |
| Acked-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> |
| Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> |
| Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Acked-by: Michal Hocko <mhocko@suse.cz> |
| Cc: Cristian Rodriguez <crrodriguez@opensuse.org> |
| Cc: Bob Liu <bob.liu@oracle.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/staging/zcache/zcache-main.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/staging/zcache/zcache-main.c |
| +++ b/drivers/staging/zcache/zcache-main.c |
| @@ -1811,10 +1811,12 @@ static int zcache_comp_init(void) |
| #else |
| if (*zcache_comp_name != '\0') { |
| ret = crypto_has_comp(zcache_comp_name, 0, 0); |
| - if (!ret) |
| + if (!ret) { |
| pr_info("zcache: %s not supported\n", |
| zcache_comp_name); |
| - goto out; |
| + ret = 1; |
| + goto out; |
| + } |
| } |
| if (!ret) |
| strcpy(zcache_comp_name, "lzo"); |