| From 98b8cd7f75643e0a442d7a4c1cef2c9d53b7e92b Mon Sep 17 00:00:00 2001 |
| From: Michal Suchanek <msuchanek@suse.de> |
| Date: Sat, 27 May 2017 17:46:15 +0200 |
| Subject: powerpc/fadump: Return error when fadump registration fails |
| |
| From: Michal Suchanek <msuchanek@suse.de> |
| |
| commit 98b8cd7f75643e0a442d7a4c1cef2c9d53b7e92b upstream. |
| |
| - log an error message when registration fails and no error code listed |
| in the switch is returned |
| - translate the hv error code to posix error code and return it from |
| fw_register |
| - return the posix error code from fw_register to the process writing |
| to sysfs |
| - return EEXIST on re-registration |
| - return success on deregistration when fadump is not registered |
| - return ENODEV when no memory is reserved for fadump |
| |
| Signed-off-by: Michal Suchanek <msuchanek@suse.de> |
| Tested-by: Hari Bathini <hbathini@linux.vnet.ibm.com> |
| [mpe: Use pr_err() to shrink the error print] |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Cc: Kleber Sacilotto de Souza <kleber.souza@canonical.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/kernel/fadump.c | 23 +++++++++++++++-------- |
| 1 file changed, 15 insertions(+), 8 deletions(-) |
| |
| --- a/arch/powerpc/kernel/fadump.c |
| +++ b/arch/powerpc/kernel/fadump.c |
| @@ -365,9 +365,9 @@ static int __init early_fadump_reserve_m |
| } |
| early_param("fadump_reserve_mem", early_fadump_reserve_mem); |
| |
| -static void register_fw_dump(struct fadump_mem_struct *fdm) |
| +static int register_fw_dump(struct fadump_mem_struct *fdm) |
| { |
| - int rc; |
| + int rc, err; |
| unsigned int wait_time; |
| |
| pr_debug("Registering for firmware-assisted kernel dump...\n"); |
| @@ -384,7 +384,11 @@ static void register_fw_dump(struct fadu |
| |
| } while (wait_time); |
| |
| + err = -EIO; |
| switch (rc) { |
| + default: |
| + pr_err("Failed to register. Unknown Error(%d).\n", rc); |
| + break; |
| case -1: |
| printk(KERN_ERR "Failed to register firmware-assisted kernel" |
| " dump. Hardware Error(%d).\n", rc); |
| @@ -392,18 +396,22 @@ static void register_fw_dump(struct fadu |
| case -3: |
| printk(KERN_ERR "Failed to register firmware-assisted kernel" |
| " dump. Parameter Error(%d).\n", rc); |
| + err = -EINVAL; |
| break; |
| case -9: |
| printk(KERN_ERR "firmware-assisted kernel dump is already " |
| " registered."); |
| fw_dump.dump_registered = 1; |
| + err = -EEXIST; |
| break; |
| case 0: |
| printk(KERN_INFO "firmware-assisted kernel dump registration" |
| " is successful\n"); |
| fw_dump.dump_registered = 1; |
| + err = 0; |
| break; |
| } |
| + return err; |
| } |
| |
| void crash_fadump(struct pt_regs *regs, const char *str) |
| @@ -1006,7 +1014,7 @@ static unsigned long init_fadump_header( |
| return addr; |
| } |
| |
| -static void register_fadump(void) |
| +static int register_fadump(void) |
| { |
| unsigned long addr; |
| void *vaddr; |
| @@ -1017,7 +1025,7 @@ static void register_fadump(void) |
| * assisted dump. |
| */ |
| if (!fw_dump.reserve_dump_area_size) |
| - return; |
| + return -ENODEV; |
| |
| ret = fadump_setup_crash_memory_ranges(); |
| if (ret) |
| @@ -1032,7 +1040,7 @@ static void register_fadump(void) |
| fadump_create_elfcore_headers(vaddr); |
| |
| /* register the future kernel dump with firmware. */ |
| - register_fw_dump(&fdm); |
| + return register_fw_dump(&fdm); |
| } |
| |
| static int fadump_unregister_dump(struct fadump_mem_struct *fdm) |
| @@ -1218,7 +1226,6 @@ static ssize_t fadump_register_store(str |
| switch (buf[0]) { |
| case '0': |
| if (fw_dump.dump_registered == 0) { |
| - ret = -EINVAL; |
| goto unlock_out; |
| } |
| /* Un-register Firmware-assisted dump */ |
| @@ -1226,11 +1233,11 @@ static ssize_t fadump_register_store(str |
| break; |
| case '1': |
| if (fw_dump.dump_registered == 1) { |
| - ret = -EINVAL; |
| + ret = -EEXIST; |
| goto unlock_out; |
| } |
| /* Register Firmware-assisted dump */ |
| - register_fadump(); |
| + ret = register_fadump(); |
| break; |
| default: |
| ret = -EINVAL; |