Commit 6ae4e48b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'thermal-6.11-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull thermal control fixes from Rafael Wysocki:
 "These fix error handling in the thermal debug code and OF node
  reference leaks in the thermal OF driver.

  Specifics:

   - Use IS_ERR() in checks of debugfs_create_dir() return value instead
     of checking it against NULL in the thermal debug code (Yang Ruibin)

   - Fix three OF node reference leaks in thermal_of (Krzysztof
     Kozlowski)"

* tag 'thermal-6.11-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  thermal: of: Fix OF node leak in of_thermal_zone_find() error paths
  thermal: of: Fix OF node leak in thermal_of_zone_register()
  thermal: of: Fix OF node leak in thermal_of_trips_init() error path
  thermal/debugfs: Fix the NULL vs IS_ERR() confusion in debugfs_create_dir()
parents f76a30a9 c0a1ef9c
...@@ -178,11 +178,11 @@ struct thermal_debugfs { ...@@ -178,11 +178,11 @@ struct thermal_debugfs {
void thermal_debug_init(void) void thermal_debug_init(void)
{ {
d_root = debugfs_create_dir("thermal", NULL); d_root = debugfs_create_dir("thermal", NULL);
if (!d_root) if (IS_ERR(d_root))
return; return;
d_cdev = debugfs_create_dir("cooling_devices", d_root); d_cdev = debugfs_create_dir("cooling_devices", d_root);
if (!d_cdev) if (IS_ERR(d_cdev))
return; return;
d_tz = debugfs_create_dir("thermal_zones", d_root); d_tz = debugfs_create_dir("thermal_zones", d_root);
...@@ -202,7 +202,7 @@ static struct thermal_debugfs *thermal_debugfs_add_id(struct dentry *d, int id) ...@@ -202,7 +202,7 @@ static struct thermal_debugfs *thermal_debugfs_add_id(struct dentry *d, int id)
snprintf(ids, IDSLENGTH, "%d", id); snprintf(ids, IDSLENGTH, "%d", id);
thermal_dbg->d_top = debugfs_create_dir(ids, d); thermal_dbg->d_top = debugfs_create_dir(ids, d);
if (!thermal_dbg->d_top) { if (IS_ERR(thermal_dbg->d_top)) {
kfree(thermal_dbg); kfree(thermal_dbg);
return NULL; return NULL;
} }
......
...@@ -125,7 +125,7 @@ static int thermal_of_populate_trip(struct device_node *np, ...@@ -125,7 +125,7 @@ static int thermal_of_populate_trip(struct device_node *np,
static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *ntrips) static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *ntrips)
{ {
struct thermal_trip *tt; struct thermal_trip *tt;
struct device_node *trips, *trip; struct device_node *trips;
int ret, count; int ret, count;
trips = of_get_child_by_name(np, "trips"); trips = of_get_child_by_name(np, "trips");
...@@ -150,7 +150,7 @@ static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *n ...@@ -150,7 +150,7 @@ static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *n
*ntrips = count; *ntrips = count;
count = 0; count = 0;
for_each_child_of_node(trips, trip) { for_each_child_of_node_scoped(trips, trip) {
ret = thermal_of_populate_trip(trip, &tt[count++]); ret = thermal_of_populate_trip(trip, &tt[count++]);
if (ret) if (ret)
goto out_kfree; goto out_kfree;
...@@ -184,14 +184,14 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, int ...@@ -184,14 +184,14 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, int
* Search for each thermal zone, a defined sensor * Search for each thermal zone, a defined sensor
* corresponding to the one passed as parameter * corresponding to the one passed as parameter
*/ */
for_each_available_child_of_node(np, tz) { for_each_available_child_of_node_scoped(np, child) {
int count, i; int count, i;
count = of_count_phandle_with_args(tz, "thermal-sensors", count = of_count_phandle_with_args(child, "thermal-sensors",
"#thermal-sensor-cells"); "#thermal-sensor-cells");
if (count <= 0) { if (count <= 0) {
pr_err("%pOFn: missing thermal sensor\n", tz); pr_err("%pOFn: missing thermal sensor\n", child);
tz = ERR_PTR(-EINVAL); tz = ERR_PTR(-EINVAL);
goto out; goto out;
} }
...@@ -200,18 +200,19 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, int ...@@ -200,18 +200,19 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, int
int ret; int ret;
ret = of_parse_phandle_with_args(tz, "thermal-sensors", ret = of_parse_phandle_with_args(child, "thermal-sensors",
"#thermal-sensor-cells", "#thermal-sensor-cells",
i, &sensor_specs); i, &sensor_specs);
if (ret < 0) { if (ret < 0) {
pr_err("%pOFn: Failed to read thermal-sensors cells: %d\n", tz, ret); pr_err("%pOFn: Failed to read thermal-sensors cells: %d\n", child, ret);
tz = ERR_PTR(ret); tz = ERR_PTR(ret);
goto out; goto out;
} }
if ((sensor == sensor_specs.np) && id == (sensor_specs.args_count ? if ((sensor == sensor_specs.np) && id == (sensor_specs.args_count ?
sensor_specs.args[0] : 0)) { sensor_specs.args[0] : 0)) {
pr_debug("sensor %pOFn id=%d belongs to %pOFn\n", sensor, id, tz); pr_debug("sensor %pOFn id=%d belongs to %pOFn\n", sensor, id, child);
tz = no_free_ptr(child);
goto out; goto out;
} }
} }
...@@ -491,7 +492,8 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node * ...@@ -491,7 +492,8 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
trips = thermal_of_trips_init(np, &ntrips); trips = thermal_of_trips_init(np, &ntrips);
if (IS_ERR(trips)) { if (IS_ERR(trips)) {
pr_err("Failed to find trip points for %pOFn id=%d\n", sensor, id); pr_err("Failed to find trip points for %pOFn id=%d\n", sensor, id);
return ERR_CAST(trips); ret = PTR_ERR(trips);
goto out_of_node_put;
} }
ret = thermal_of_monitor_init(np, &delay, &pdelay); ret = thermal_of_monitor_init(np, &delay, &pdelay);
...@@ -519,6 +521,7 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node * ...@@ -519,6 +521,7 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
goto out_kfree_trips; goto out_kfree_trips;
} }
of_node_put(np);
kfree(trips); kfree(trips);
ret = thermal_zone_device_enable(tz); ret = thermal_zone_device_enable(tz);
...@@ -533,6 +536,8 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node * ...@@ -533,6 +536,8 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
out_kfree_trips: out_kfree_trips:
kfree(trips); kfree(trips);
out_of_node_put:
of_node_put(np);
return ERR_PTR(ret); return ERR_PTR(ret);
} }
......
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