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()
This commit is contained in:
@@ -178,11 +178,11 @@ struct thermal_debugfs {
|
||||
void thermal_debug_init(void)
|
||||
{
|
||||
d_root = debugfs_create_dir("thermal", NULL);
|
||||
if (!d_root)
|
||||
if (IS_ERR(d_root))
|
||||
return;
|
||||
|
||||
d_cdev = debugfs_create_dir("cooling_devices", d_root);
|
||||
if (!d_cdev)
|
||||
if (IS_ERR(d_cdev))
|
||||
return;
|
||||
|
||||
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)
|
||||
snprintf(ids, IDSLENGTH, "%d", id);
|
||||
|
||||
thermal_dbg->d_top = debugfs_create_dir(ids, d);
|
||||
if (!thermal_dbg->d_top) {
|
||||
if (IS_ERR(thermal_dbg->d_top)) {
|
||||
kfree(thermal_dbg);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
struct thermal_trip *tt;
|
||||
struct device_node *trips, *trip;
|
||||
struct device_node *trips;
|
||||
int ret, count;
|
||||
|
||||
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
|
||||
*ntrips = count;
|
||||
|
||||
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++]);
|
||||
if (ret)
|
||||
goto out_kfree;
|
||||
@@ -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
|
||||
* 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;
|
||||
|
||||
count = of_count_phandle_with_args(tz, "thermal-sensors",
|
||||
count = of_count_phandle_with_args(child, "thermal-sensors",
|
||||
"#thermal-sensor-cells");
|
||||
if (count <= 0) {
|
||||
pr_err("%pOFn: missing thermal sensor\n", tz);
|
||||
pr_err("%pOFn: missing thermal sensor\n", child);
|
||||
tz = ERR_PTR(-EINVAL);
|
||||
goto out;
|
||||
}
|
||||
@@ -200,18 +200,19 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, int
|
||||
|
||||
int ret;
|
||||
|
||||
ret = of_parse_phandle_with_args(tz, "thermal-sensors",
|
||||
ret = of_parse_phandle_with_args(child, "thermal-sensors",
|
||||
"#thermal-sensor-cells",
|
||||
i, &sensor_specs);
|
||||
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);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ((sensor == sensor_specs.np) && id == (sensor_specs.args_count ?
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -491,7 +492,8 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
|
||||
trips = thermal_of_trips_init(np, &ntrips);
|
||||
if (IS_ERR(trips)) {
|
||||
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);
|
||||
@@ -519,6 +521,7 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
|
||||
goto out_kfree_trips;
|
||||
}
|
||||
|
||||
of_node_put(np);
|
||||
kfree(trips);
|
||||
|
||||
ret = thermal_zone_device_enable(tz);
|
||||
@@ -533,6 +536,8 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
|
||||
|
||||
out_kfree_trips:
|
||||
kfree(trips);
|
||||
out_of_node_put:
|
||||
of_node_put(np);
|
||||
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user