Revert "of: fix of_update_property()"
authorGrant Likely <grant.likely@linaro.org>
Tue, 4 Mar 2014 08:07:17 +0000 (16:07 +0800)
committerGrant Likely <grant.likely@linaro.org>
Tue, 4 Mar 2014 08:20:42 +0000 (16:20 +0800)
This reverts commit 02ed594e7113644c06ae3a89bc9215d839510efc.

The change is completely broken. It attempt to get the previous item in
a linked list by grabbing the address of a stack variable. Outright
wrong.

Signed-off-by: Grant Likely <grant.likely@linaro.org>
drivers/of/base.c

index 239e3da9e7280720e002b937efee831245788185..a63e77694d0f877c433e0a4341dd7aa7778d2233 100644 (file)
@@ -1597,7 +1597,7 @@ int of_update_property(struct device_node *np, struct property *newprop)
 {
        struct property **next, *oldprop;
        unsigned long flags;
-       int rc = 0;
+       int rc, found = 0;
 
        rc = of_property_notify(OF_RECONFIG_UPDATE_PROPERTY, np, newprop);
        if (rc)
@@ -1606,28 +1606,36 @@ int of_update_property(struct device_node *np, struct property *newprop)
        if (!newprop->name)
                return -EINVAL;
 
+       oldprop = of_find_property(np, newprop->name, NULL);
+       if (!oldprop)
+               return of_add_property(np, newprop);
+
        raw_spin_lock_irqsave(&devtree_lock, flags);
-       oldprop = __of_find_property(np, newprop->name, NULL);
-       if (!oldprop) {
-               /* add the node */
-               rc = __of_add_property(np, newprop);
-       } else {
-               /* replace the node */
-               next = &oldprop;
-               newprop->next = oldprop->next;
-               *next = newprop;
-               oldprop->next = np->deadprops;
-               np->deadprops = oldprop;
+       next = &np->properties;
+       while (*next) {
+               if (*next == oldprop) {
+                       /* found the node */
+                       newprop->next = oldprop->next;
+                       *next = newprop;
+                       oldprop->next = np->deadprops;
+                       np->deadprops = oldprop;
+                       found = 1;
+                       break;
+               }
+               next = &(*next)->next;
        }
        raw_spin_unlock_irqrestore(&devtree_lock, flags);
 
+       if (!found)
+               return -ENODEV;
+
 #ifdef CONFIG_PROC_DEVICETREE
        /* try to add to proc as well if it was initialized */
        if (!rc && np->pde)
                proc_device_tree_update_prop(np->pde, newprop, oldprop);
 #endif /* CONFIG_PROC_DEVICETREE */
 
-       return rc;
+       return 0;
 }
 
 #if defined(CONFIG_OF_DYNAMIC)