summaryrefslogtreecommitdiffstats
path: root/drivers/of
diff options
context:
space:
mode:
authorJulia Lawall <Julia.Lawall@lip6.fr>2015-10-22 11:02:49 +0200
committerRob Herring <robh@kernel.org>2015-10-22 09:26:44 -0500
commit7fad948a7c22cf47ef4e3c3127cd961ff5e2d394 (patch)
tree3b46cf115cb65a5aeaddaf30393f499c69886e44 /drivers/of
parent8363ccb917c6bd497392f5a6b716f46213d86495 (diff)
downloadlinux-7fad948a7c22cf47ef4e3c3127cd961ff5e2d394.tar.gz
linux-7fad948a7c22cf47ef4e3c3127cd961ff5e2d394.tar.bz2
linux-7fad948a7c22cf47ef4e3c3127cd961ff5e2d394.zip
of/platform: add missing of_node_put
for_each_child_of_node performs an of_node_get on each iteration, so a break out of the loop requires an of_node_put. A simplified version of the semantic patch that fixes this problem is as follows (http://coccinelle.lip6.fr): // <smpl> @@ local idexpression n; expression root,e; @@ for_each_child_of_node(root,n) { ... ( of_node_put(n); | e = n | + of_node_put(n); ? break; ) ... } ... when != n // </smpl> Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr> Signed-off-by: Rob Herring <robh@kernel.org>
Diffstat (limited to 'drivers/of')
-rw-r--r--drivers/of/platform.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index 1001efaedcb8..af98343614d8 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -405,8 +405,10 @@ int of_platform_bus_probe(struct device_node *root,
if (!of_match_node(matches, child))
continue;
rc = of_platform_bus_create(child, matches, NULL, parent, false);
- if (rc)
+ if (rc) {
+ of_node_put(child);
break;
+ }
}
of_node_put(root);
@@ -447,8 +449,10 @@ int of_platform_populate(struct device_node *root,
for_each_child_of_node(root, child) {
rc = of_platform_bus_create(child, matches, lookup, parent, true);
- if (rc)
+ if (rc) {
+ of_node_put(child);
break;
+ }
}
of_node_set_flag(root, OF_POPULATED_BUS);