]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
powerpc/pseries: Improve error code on reconfiguration notifier failure
authorAkinobu Mita <akinobu.mita@gmail.com>
Tue, 21 Jun 2011 03:35:56 +0000 (03:35 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 29 Jun 2011 07:48:24 +0000 (17:48 +1000)
Reconfiguration notifier call for device node may fail by several reasons,
but it always assumes kmalloc failures.

This enables reconfiguration notifier call chain to get the actual error
code rather than -ENOMEM by converting all reconfiguration notifier calls
to return encapsulate error code with notifier_from_errno().

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: linuxppc-dev@lists.ozlabs.org
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/kernel/prom.c
arch/powerpc/platforms/pseries/hotplug-cpu.c
arch/powerpc/platforms/pseries/hotplug-memory.c
arch/powerpc/platforms/pseries/reconfig.c

index 534c50359e061055abd07befb7b5839750760ac5..b8e6189298f4e5e9b48219165f4d5e432d7b8d94 100644 (file)
@@ -849,16 +849,14 @@ static int prom_reconfig_notifier(struct notifier_block *nb,
        switch (action) {
        case PSERIES_RECONFIG_ADD:
                err = of_finish_dynamic_node(node);
-               if (err < 0) {
+               if (err < 0)
                        printk(KERN_ERR "finish_node returned %d\n", err);
-                       err = NOTIFY_BAD;
-               }
                break;
        default:
-               err = NOTIFY_DONE;
+               err = 0;
                break;
        }
-       return err;
+       return notifier_from_errno(err);
 }
 
 static struct notifier_block prom_reconfig_nb = {
index 46f13a3c5d09eb5c88e01c1356b018a67622b546..bc0288501f17c41388b998f7ac722337ad4c7821 100644 (file)
@@ -330,21 +330,17 @@ static void pseries_remove_processor(struct device_node *np)
 static int pseries_smp_notifier(struct notifier_block *nb,
                                unsigned long action, void *node)
 {
-       int err = NOTIFY_OK;
+       int err = 0;
 
        switch (action) {
        case PSERIES_RECONFIG_ADD:
-               if (pseries_add_processor(node))
-                       err = NOTIFY_BAD;
+               err = pseries_add_processor(node);
                break;
        case PSERIES_RECONFIG_REMOVE:
                pseries_remove_processor(node);
                break;
-       default:
-               err = NOTIFY_DONE;
-               break;
        }
-       return err;
+       return notifier_from_errno(err);
 }
 
 static struct notifier_block pseries_smp_nb = {
index 33867ec4a234086b6b0ede0c39dc2df26883956b..1eaefd661d36561d028118e46b90887b164631b9 100644 (file)
@@ -197,27 +197,21 @@ static int pseries_drconf_memory(unsigned long *base, unsigned int action)
 static int pseries_memory_notifier(struct notifier_block *nb,
                                unsigned long action, void *node)
 {
-       int err = NOTIFY_OK;
+       int err = 0;
 
        switch (action) {
        case PSERIES_RECONFIG_ADD:
-               if (pseries_add_memory(node))
-                       err = NOTIFY_BAD;
+               err = pseries_add_memory(node);
                break;
        case PSERIES_RECONFIG_REMOVE:
-               if (pseries_remove_memory(node))
-                       err = NOTIFY_BAD;
+               err = pseries_remove_memory(node);
                break;
        case PSERIES_DRCONF_MEM_ADD:
        case PSERIES_DRCONF_MEM_REMOVE:
-               if (pseries_drconf_memory(node, action))
-                       err = NOTIFY_BAD;
-               break;
-       default:
-               err = NOTIFY_DONE;
+               err = pseries_drconf_memory(node, action);
                break;
        }
-       return err;
+       return notifier_from_errno(err);
 }
 
 static struct notifier_block pseries_mem_nb = {
index 286b6af3d55d207e73092a2c0550e44f2476780b..168651acdd83e003dae22f9bdee6147e89c1b1f5 100644 (file)
@@ -114,9 +114,7 @@ int pSeries_reconfig_notify(unsigned long action, void *p)
        int err = blocking_notifier_call_chain(&pSeries_reconfig_chain,
                                                action, p);
 
-       if (err == NOTIFY_BAD)
-               return -ENOMEM; /* For now, safe to assume kmalloc failure */
-       return 0;
+       return notifier_to_errno(err);
 }
 
 static int pSeries_reconfig_add_node(const char *path, struct property *proplist)