Commit 1c5e3d9b authored by Rob Herring's avatar Rob Herring

of: Add a helper to free property struct

Freeing a property struct is 3 kfree()'s which is duplicated in multiple
spots. Add a helper, __of_prop_free(), and replace all the open coded
cases in the DT code.
Reviewed-by: default avatarSaravana Kannan <saravanak@google.com>
Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/20240409-dt-cleanup-free-v2-1-5b419a4af38d@kernel.orgSigned-off-by: default avatarRob Herring <robh@kernel.org>
parent 15f3df36
...@@ -305,15 +305,20 @@ int of_detach_node(struct device_node *np) ...@@ -305,15 +305,20 @@ int of_detach_node(struct device_node *np)
} }
EXPORT_SYMBOL_GPL(of_detach_node); EXPORT_SYMBOL_GPL(of_detach_node);
void __of_prop_free(struct property *prop)
{
kfree(prop->name);
kfree(prop->value);
kfree(prop);
}
static void property_list_free(struct property *prop_list) static void property_list_free(struct property *prop_list)
{ {
struct property *prop, *next; struct property *prop, *next;
for (prop = prop_list; prop != NULL; prop = next) { for (prop = prop_list; prop != NULL; prop = next) {
next = prop->next; next = prop->next;
kfree(prop->name); __of_prop_free(prop);
kfree(prop->value);
kfree(prop);
} }
} }
...@@ -426,9 +431,7 @@ struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags) ...@@ -426,9 +431,7 @@ struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags)
return new; return new;
err_free: err_free:
kfree(new->name); __of_prop_free(new);
kfree(new->value);
kfree(new);
return NULL; return NULL;
} }
...@@ -470,9 +473,7 @@ struct device_node *__of_node_dup(const struct device_node *np, ...@@ -470,9 +473,7 @@ struct device_node *__of_node_dup(const struct device_node *np,
if (!new_pp) if (!new_pp)
goto err_prop; goto err_prop;
if (__of_add_property(node, new_pp)) { if (__of_add_property(node, new_pp)) {
kfree(new_pp->name); __of_prop_free(new_pp);
kfree(new_pp->value);
kfree(new_pp);
goto err_prop; goto err_prop;
} }
} }
...@@ -921,11 +922,8 @@ static int of_changeset_add_prop_helper(struct of_changeset *ocs, ...@@ -921,11 +922,8 @@ static int of_changeset_add_prop_helper(struct of_changeset *ocs,
return -ENOMEM; return -ENOMEM;
ret = of_changeset_add_property(ocs, np, new_pp); ret = of_changeset_add_property(ocs, np, new_pp);
if (ret) { if (ret)
kfree(new_pp->name); __of_prop_free(new_pp);
kfree(new_pp->value);
kfree(new_pp);
}
return ret; return ret;
} }
......
...@@ -123,6 +123,7 @@ extern void *__unflatten_device_tree(const void *blob, ...@@ -123,6 +123,7 @@ extern void *__unflatten_device_tree(const void *blob,
* own the devtree lock or work on detached trees only. * own the devtree lock or work on detached trees only.
*/ */
struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags); struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags);
void __of_prop_free(struct property *prop);
struct device_node *__of_node_dup(const struct device_node *np, struct device_node *__of_node_dup(const struct device_node *np,
const char *full_name); const char *full_name);
......
...@@ -262,9 +262,7 @@ static struct property *dup_and_fixup_symbol_prop( ...@@ -262,9 +262,7 @@ static struct property *dup_and_fixup_symbol_prop(
return new_prop; return new_prop;
err_free_new_prop: err_free_new_prop:
kfree(new_prop->name); __of_prop_free(new_prop);
kfree(new_prop->value);
kfree(new_prop);
err_free_target_path: err_free_target_path:
kfree(target_path); kfree(target_path);
...@@ -361,11 +359,8 @@ static int add_changeset_property(struct overlay_changeset *ovcs, ...@@ -361,11 +359,8 @@ static int add_changeset_property(struct overlay_changeset *ovcs,
pr_err("WARNING: memory leak will occur if overlay removed, property: %pOF/%s\n", pr_err("WARNING: memory leak will occur if overlay removed, property: %pOF/%s\n",
target->np, new_prop->name); target->np, new_prop->name);
if (ret) { if (ret)
kfree(new_prop->name); __of_prop_free(new_prop);
kfree(new_prop->value);
kfree(new_prop);
}
return ret; return ret;
} }
......
...@@ -795,15 +795,11 @@ static void __init of_unittest_property_copy(void) ...@@ -795,15 +795,11 @@ static void __init of_unittest_property_copy(void)
new = __of_prop_dup(&p1, GFP_KERNEL); new = __of_prop_dup(&p1, GFP_KERNEL);
unittest(new && propcmp(&p1, new), "empty property didn't copy correctly\n"); unittest(new && propcmp(&p1, new), "empty property didn't copy correctly\n");
kfree(new->value); __of_prop_free(new);
kfree(new->name);
kfree(new);
new = __of_prop_dup(&p2, GFP_KERNEL); new = __of_prop_dup(&p2, GFP_KERNEL);
unittest(new && propcmp(&p2, new), "non-empty property didn't copy correctly\n"); unittest(new && propcmp(&p2, new), "non-empty property didn't copy correctly\n");
kfree(new->value); __of_prop_free(new);
kfree(new->name);
kfree(new);
#endif #endif
} }
...@@ -3718,9 +3714,7 @@ static __init void of_unittest_overlay_high_level(void) ...@@ -3718,9 +3714,7 @@ static __init void of_unittest_overlay_high_level(void)
goto err_unlock; goto err_unlock;
} }
if (__of_add_property(of_symbols, new_prop)) { if (__of_add_property(of_symbols, new_prop)) {
kfree(new_prop->name); __of_prop_free(new_prop);
kfree(new_prop->value);
kfree(new_prop);
/* "name" auto-generated by unflatten */ /* "name" auto-generated by unflatten */
if (!strcmp(prop->name, "name")) if (!strcmp(prop->name, "name"))
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment