thermal: Make sysfs attributes of cooling devices default attributes
Default attributes are created when the device is registered. Attributes created after device registration can lead to race conditions, where user space (e.g. udev) sees the device but not the attributes. Signed-off-by: Matthias Kaehlcke <mka@chromium.org> Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
This commit is contained in:
parent
d5bce86777
commit
2dc10f8963
1 changed files with 17 additions and 20 deletions
|
@ -899,6 +899,22 @@ thermal_cooling_device_trip_point_show(struct device *dev,
|
|||
return sprintf(buf, "%d\n", instance->trip);
|
||||
}
|
||||
|
||||
static struct attribute *cooling_device_attrs[] = {
|
||||
&dev_attr_cdev_type.attr,
|
||||
&dev_attr_max_state.attr,
|
||||
&dev_attr_cur_state.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static const struct attribute_group cooling_device_attr_group = {
|
||||
.attrs = cooling_device_attrs,
|
||||
};
|
||||
|
||||
static const struct attribute_group *cooling_device_attr_groups[] = {
|
||||
&cooling_device_attr_group,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/* Device management */
|
||||
|
||||
/**
|
||||
|
@ -1130,6 +1146,7 @@ __thermal_cooling_device_register(struct device_node *np,
|
|||
cdev->ops = ops;
|
||||
cdev->updated = false;
|
||||
cdev->device.class = &thermal_class;
|
||||
cdev->device.groups = cooling_device_attr_groups;
|
||||
cdev->devdata = devdata;
|
||||
dev_set_name(&cdev->device, "cooling_device%d", cdev->id);
|
||||
result = device_register(&cdev->device);
|
||||
|
@ -1139,21 +1156,6 @@ __thermal_cooling_device_register(struct device_node *np,
|
|||
return ERR_PTR(result);
|
||||
}
|
||||
|
||||
/* sys I/F */
|
||||
if (type) {
|
||||
result = device_create_file(&cdev->device, &dev_attr_cdev_type);
|
||||
if (result)
|
||||
goto unregister;
|
||||
}
|
||||
|
||||
result = device_create_file(&cdev->device, &dev_attr_max_state);
|
||||
if (result)
|
||||
goto unregister;
|
||||
|
||||
result = device_create_file(&cdev->device, &dev_attr_cur_state);
|
||||
if (result)
|
||||
goto unregister;
|
||||
|
||||
/* Add 'this' new cdev to the global cdev list */
|
||||
mutex_lock(&thermal_list_lock);
|
||||
list_add(&cdev->node, &thermal_cdev_list);
|
||||
|
@ -1163,11 +1165,6 @@ __thermal_cooling_device_register(struct device_node *np,
|
|||
bind_cdev(cdev);
|
||||
|
||||
return cdev;
|
||||
|
||||
unregister:
|
||||
release_idr(&thermal_cdev_idr, &thermal_idr_lock, cdev->id);
|
||||
device_unregister(&cdev->device);
|
||||
return ERR_PTR(result);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue