* @target may be either in the live devicetree or in a new subtree that
  * is contained in the changeset.
  *
- * Some special properties are not updated (no error returned).
+ * Some special properties are not added or updated (no error returned):
+ * "name", "phandle", "linux,phandle".
+ *
+ * Properties "#address-cells" and "#size-cells" are not updated if they
+ * are already in the live tree, but if present in the live tree, the values
+ * in the overlay must match the values in the live tree.
  *
  * Update of property in symbols node is not allowed.
  *
 {
        struct property *new_prop = NULL, *prop;
        int ret = 0;
+       bool check_for_non_overlay_node = false;
 
        if (!of_prop_cmp(overlay_prop->name, "name") ||
            !of_prop_cmp(overlay_prop->name, "phandle") ||
        if (!new_prop)
                return -ENOMEM;
 
-       if (!prop)
+       if (!prop) {
+               check_for_non_overlay_node = true;
                ret = of_changeset_add_property(&ovcs->cset, target->np,
                                                new_prop);
-       else
+       } else if (!of_prop_cmp(prop->name, "#address-cells")) {
+               if (!of_prop_val_eq(prop, new_prop)) {
+                       pr_err("ERROR: changing value of #address-cells is not allowed in %pOF\n",
+                              target->np);
+                       ret = -EINVAL;
+               }
+       } else if (!of_prop_cmp(prop->name, "#size-cells")) {
+               if (!of_prop_val_eq(prop, new_prop)) {
+                       pr_err("ERROR: changing value of #size-cells is not allowed in %pOF\n",
+                              target->np);
+                       ret = -EINVAL;
+               }
+       } else {
+               check_for_non_overlay_node = true;
                ret = of_changeset_update_property(&ovcs->cset, target->np,
                                                   new_prop);
+       }
+
+       if (check_for_non_overlay_node &&
+           !of_node_check_flag(target->np, OF_OVERLAY))
+               pr_err("WARNING: memory leak will occur if overlay removed, property: %pOF/%s\n",
+                      target->np, new_prop->name);
 
        if (ret) {
                kfree(new_prop->name);
 
 #define of_node_cmp(s1, s2)            strcasecmp((s1), (s2))
 #endif
 
+static inline int of_prop_val_eq(struct property *p1, struct property *p2)
+{
+       return p1->length == p2->length &&
+              !memcmp(p1->value, p2->value, (size_t)p1->length);
+}
+
 #if defined(CONFIG_OF) && defined(CONFIG_NUMA)
 extern int of_node_to_nid(struct device_node *np);
 #else