powerpc/pseries: Introduce pSeries_reconfig_notify()
authorAkinobu Mita <akinobu.mita@gmail.com>
Tue, 21 Jun 2011 03:35:55 +0000 (03:35 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 29 Jun 2011 07:48:22 +0000 (17:48 +1000)
This introduces pSeries_reconfig_notify() as a just wrapper of
blocking_notifier_call_chain() for pSeries_reconfig_chain.

This is a preparation to improvement of error code on reconfiguration
notifier failure.

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/include/asm/pSeries_reconfig.h
arch/powerpc/platforms/pseries/dlpar.c
arch/powerpc/platforms/pseries/reconfig.c

index 89d2f99c1bf4720d98bcd0ab091d1f9ff0fadfa8..23cd6cc30bcf8fa54ed2b48faa530e495f611bb4 100644 (file)
@@ -17,7 +17,7 @@
 #ifdef CONFIG_PPC_PSERIES
 extern int pSeries_reconfig_notifier_register(struct notifier_block *);
 extern void pSeries_reconfig_notifier_unregister(struct notifier_block *);
-extern struct blocking_notifier_head pSeries_reconfig_chain;
+extern int pSeries_reconfig_notify(unsigned long action, void *p);
 /* Not the best place to put this, will be fixed when we move some
  * of the rtas suspend-me stuff to pseries */
 extern void pSeries_coalesce_init(void);
index 57ceb92b2288a36e2e35f719b959ac0294974b2a..e9be25bc571bbb254b91ceea6639ff6ee0f053ef 100644 (file)
@@ -262,12 +262,11 @@ int dlpar_attach_node(struct device_node *dn)
        if (!dn->parent)
                return -ENOMEM;
 
-       rc = blocking_notifier_call_chain(&pSeries_reconfig_chain,
-                                         PSERIES_RECONFIG_ADD, dn);
-       if (rc == NOTIFY_BAD) {
+       rc = pSeries_reconfig_notify(PSERIES_RECONFIG_ADD, dn);
+       if (rc) {
                printk(KERN_ERR "Failed to add device node %s\n",
                       dn->full_name);
-               return -ENOMEM; /* For now, safe to assume kmalloc failure */
+               return rc;
        }
 
        of_attach_node(dn);
@@ -297,8 +296,7 @@ int dlpar_detach_node(struct device_node *dn)
                remove_proc_entry(dn->pde->name, parent->pde);
 #endif
 
-       blocking_notifier_call_chain(&pSeries_reconfig_chain,
-                           PSERIES_RECONFIG_REMOVE, dn);
+       pSeries_reconfig_notify(PSERIES_RECONFIG_REMOVE, dn);
        of_detach_node(dn);
        of_node_put(dn); /* Must decrement the refcount */
 
index 1de2cbb92303c880cf9c41b4635baf03f13d1a6b..286b6af3d55d207e73092a2c0550e44f2476780b 100644 (file)
@@ -97,7 +97,7 @@ static struct device_node *derive_parent(const char *path)
        return parent;
 }
 
-BLOCKING_NOTIFIER_HEAD(pSeries_reconfig_chain);
+static BLOCKING_NOTIFIER_HEAD(pSeries_reconfig_chain);
 
 int pSeries_reconfig_notifier_register(struct notifier_block *nb)
 {
@@ -109,6 +109,16 @@ void pSeries_reconfig_notifier_unregister(struct notifier_block *nb)
        blocking_notifier_chain_unregister(&pSeries_reconfig_chain, nb);
 }
 
+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;
+}
+
 static int pSeries_reconfig_add_node(const char *path, struct property *proplist)
 {
        struct device_node *np;
@@ -132,11 +142,9 @@ static int pSeries_reconfig_add_node(const char *path, struct property *proplist
                goto out_err;
        }
 
-       err = blocking_notifier_call_chain(&pSeries_reconfig_chain,
-                                 PSERIES_RECONFIG_ADD, np);
-       if (err == NOTIFY_BAD) {
+       err = pSeries_reconfig_notify(PSERIES_RECONFIG_ADD, np);
+       if (err) {
                printk(KERN_ERR "Failed to add device node %s\n", path);
-               err = -ENOMEM; /* For now, safe to assume kmalloc failure */
                goto out_err;
        }
 
@@ -173,8 +181,7 @@ static int pSeries_reconfig_remove_node(struct device_node *np)
 
        remove_node_proc_entries(np);
 
-       blocking_notifier_call_chain(&pSeries_reconfig_chain,
-                           PSERIES_RECONFIG_REMOVE, np);
+       pSeries_reconfig_notify(PSERIES_RECONFIG_REMOVE, np);
        of_detach_node(np);
 
        of_node_put(parent);
@@ -472,11 +479,10 @@ static int do_update_property(char *buf, size_t bufsize)
                else
                        action = PSERIES_DRCONF_MEM_REMOVE;
 
-               rc = blocking_notifier_call_chain(&pSeries_reconfig_chain,
-                                                 action, value);
-               if (rc == NOTIFY_BAD) {
-                       rc = prom_update_property(np, oldprop, newprop);
-                       return -ENOMEM;
+               rc = pSeries_reconfig_notify(action, value);
+               if (rc) {
+                       prom_update_property(np, oldprop, newprop);
+                       return rc;
                }
        }
 
This page took 0.028843 seconds and 5 git commands to generate.