hwmon: unchecked return status fixes (batch #4)
Subsystems (5)
PATCH 1/1 hwmon: unchecked return status fixes (batch #4)
This patch fixes up some hwmon drivers so that they no longer ignore return status from device_create_file(). All 4 drivers were tested.
Note 1: f71805f actually checked the status from device_create_file already. However it did not remove the files on device destruction. It was also an oportunity to use sysfs_create/remove_group instead of hand-made loops. This makes the changes much more important but I think the result is worth it.
Note 2: This patch applies on top of another one which I just posted to the lm-sensors list which adds individual alarm files to all 4 drivers.
--- drivers/hwmon/f71805f.c | 323 +++++++++++++++++++++++++++++------------------ drivers/hwmon/lm63.c | 88 ++++++++----- drivers/hwmon/lm83.c | 124 +++++++++--------- drivers/hwmon/lm90.c | 82 ++++++------ 4 files changed, 353 insertions(+), 264 deletions(-)
drivers/hwmon/lm90.c +41 -41
@@ -366,6 +366,33 @@/* Raw alarm file for compatibility */ static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); +static struct attribute *lm90_attributes[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp2_input.dev_attr.attr, + &sensor_dev_attr_temp1_min.dev_attr.attr, + &sensor_dev_attr_temp2_min.dev_attr.attr, + &sensor_dev_attr_temp1_max.dev_attr.attr, + &sensor_dev_attr_temp2_max.dev_attr.attr, + &sensor_dev_attr_temp1_crit.dev_attr.attr, + &sensor_dev_attr_temp2_crit.dev_attr.attr, + &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr, + &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr, + + &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr, + &sensor_dev_attr_temp2_crit_alarm.dev_attr.attr, + &sensor_dev_attr_temp2_input_fault.dev_attr.attr, + &sensor_dev_attr_temp2_min_alarm.dev_attr.attr, + &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, + &sensor_dev_attr_temp1_min_alarm.dev_attr.attr, + &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, + &dev_attr_alarms.attr, +NULL +}; + +static const struct attribute_group lm90_group = { + .attrs = lm90_attributes, +}; +/* pec used for ADM1032 only */ static ssize_t show_pec (struct device *dev,struct device_attribute *dummy,char *buf)
@@ -589,54 +616,25 @@lm90_init_client (new_client);/* Register sysfs hooks */ +if ((err =sysfs_create_group (&new_client->dev.kobj, &lm90_group))) + goto exit_detach; +if (new_client->flags &I2C_CLIENT_PEC ) { +if ((err =device_create_file (&new_client->dev, + &dev_attr_pec))) + goto exit_remove_files; + } + data->class_dev =hwmon_device_register (&new_client->dev);if (IS_ERR (data->class_dev)) { err =PTR_ERR (data->class_dev); - goto exit_detach; + goto exit_remove_files; } -device_create_file (&new_client->dev, - &sensor_dev_attr_temp1_input.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp2_input.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp1_min.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp2_min.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp1_max.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp2_max.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp1_crit.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp2_crit.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp1_crit_hyst.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp2_crit_hyst.dev_attr); - -device_create_file (&new_client->dev, - &sensor_dev_attr_temp2_input_fault.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp1_min_alarm.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp2_min_alarm.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp1_max_alarm.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp2_max_alarm.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp1_crit_alarm.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_temp2_crit_alarm.dev_attr); -device_create_file (&new_client->dev, &dev_attr_alarms); - -if (new_client->flags &I2C_CLIENT_PEC ) -device_create_file (&new_client->dev, &dev_attr_pec); -return 0 ; +exit_remove_files: +sysfs_remove_group (&new_client->dev.kobj, &lm90_group); +device_remove_file (&new_client->dev, &dev_attr_pec); exit_detach:i2c_detach_client (new_client); exit_free:
@@ -669,6 +667,8 @@int err;hwmon_device_unregister (data->class_dev); +sysfs_remove_group (&client->dev.kobj, &lm90_group); +device_remove_file (&client->dev, &dev_attr_pec);if ((err =i2c_detach_client (client)))return err;
drivers/hwmon/f71805f.c +202 -121
358 lines not on this page · raw message
drivers/hwmon/lm63.c +51 -37
113 lines not on this page · raw message
drivers/hwmon/lm83.c +59 -65
153 lines not on this page · raw message
Signature · 1 line
Jean Delvare
PATCH 1/1 hwmon: unchecked return status fixes (batch #5)
This patch fixes up some hwmon drivers so that they no longer ignore return status from device_create_file(). I could only test it87.
Note: This applies on top of my recent set of it87 patches (adding support for the IT8716F and IT8718F amngst others.)
--- drivers/hwmon/fscher.c | 106 +++++++++------------ drivers/hwmon/fscpos.c | 75 +++++++++------ drivers/hwmon/gl518sm.c | 74 +++++++++------ drivers/hwmon/gl520sm.c | 128 +++++++++++++++++--------- drivers/hwmon/it87.c | 234 ++++++++++++++++++++++++++++++----------------- 5 files changed, 368 insertions(+), 249 deletions(-)
drivers/hwmon/it87.c +149 -85
@@ -37,6 +37,7 @@#include <linux/hwmon-vid.h> #include <linux/err.h> #include <linux/mutex.h> +#include <linux/sysfs.h> #include <asm/io.h>
@@ -758,8 +759,6 @@return count; } static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm_reg, store_vrm_reg); -#define device_create_file_vrm (client) \ -device_create_file(&client->dev, &dev_attr_vrm)static ssize_t show_vid_reg (struct device *dev,struct device_attribute *attr,char *buf)
@@ -768,8 +767,88 @@return sprintf (buf,"%ld\n" , (long )vid_from_reg (data->vid, data->vrm)); } static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL); -#define device_create_file_vid (client) \ -device_create_file(&client->dev, &dev_attr_cpu0_vid) + +static struct attribute *it87_attributes[] = { + &sensor_dev_attr_in0_input.dev_attr.attr, + &sensor_dev_attr_in1_input.dev_attr.attr, + &sensor_dev_attr_in2_input.dev_attr.attr, + &sensor_dev_attr_in3_input.dev_attr.attr, + &sensor_dev_attr_in4_input.dev_attr.attr, + &sensor_dev_attr_in5_input.dev_attr.attr, + &sensor_dev_attr_in6_input.dev_attr.attr, + &sensor_dev_attr_in7_input.dev_attr.attr, + &sensor_dev_attr_in8_input.dev_attr.attr, + &sensor_dev_attr_in0_min.dev_attr.attr, + &sensor_dev_attr_in1_min.dev_attr.attr, + &sensor_dev_attr_in2_min.dev_attr.attr, + &sensor_dev_attr_in3_min.dev_attr.attr, + &sensor_dev_attr_in4_min.dev_attr.attr, + &sensor_dev_attr_in5_min.dev_attr.attr, + &sensor_dev_attr_in6_min.dev_attr.attr, + &sensor_dev_attr_in7_min.dev_attr.attr, + &sensor_dev_attr_in0_max.dev_attr.attr, + &sensor_dev_attr_in1_max.dev_attr.attr, + &sensor_dev_attr_in2_max.dev_attr.attr, + &sensor_dev_attr_in3_max.dev_attr.attr, + &sensor_dev_attr_in4_max.dev_attr.attr, + &sensor_dev_attr_in5_max.dev_attr.attr, + &sensor_dev_attr_in6_max.dev_attr.attr, + &sensor_dev_attr_in7_max.dev_attr.attr, + + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp2_input.dev_attr.attr, + &sensor_dev_attr_temp3_input.dev_attr.attr, + &sensor_dev_attr_temp1_max.dev_attr.attr, + &sensor_dev_attr_temp2_max.dev_attr.attr, + &sensor_dev_attr_temp3_max.dev_attr.attr, + &sensor_dev_attr_temp1_min.dev_attr.attr, + &sensor_dev_attr_temp2_min.dev_attr.attr, + &sensor_dev_attr_temp3_min.dev_attr.attr, + &sensor_dev_attr_temp1_type.dev_attr.attr, + &sensor_dev_attr_temp2_type.dev_attr.attr, + &sensor_dev_attr_temp3_type.dev_attr.attr, + + &dev_attr_alarms.attr, +NULL +}; + +static const struct attribute_group it87_group = { + .attrs = it87_attributes, +}; + +static struct attribute *it87_attributes_opt[] = { + &sensor_dev_attr_fan1_input16.dev_attr.attr, + &sensor_dev_attr_fan1_min16.dev_attr.attr, + &sensor_dev_attr_fan2_input16.dev_attr.attr, + &sensor_dev_attr_fan2_min16.dev_attr.attr, + &sensor_dev_attr_fan3_input16.dev_attr.attr, + &sensor_dev_attr_fan3_min16.dev_attr.attr, + + &sensor_dev_attr_fan1_input.dev_attr.attr, + &sensor_dev_attr_fan1_min.dev_attr.attr, + &sensor_dev_attr_fan1_div.dev_attr.attr, + &sensor_dev_attr_fan2_input.dev_attr.attr, + &sensor_dev_attr_fan2_min.dev_attr.attr, + &sensor_dev_attr_fan2_div.dev_attr.attr, + &sensor_dev_attr_fan3_input.dev_attr.attr, + &sensor_dev_attr_fan3_min.dev_attr.attr, + &sensor_dev_attr_fan3_div.dev_attr.attr, + + &sensor_dev_attr_pwm1_enable.dev_attr.attr, + &sensor_dev_attr_pwm2_enable.dev_attr.attr, + &sensor_dev_attr_pwm3_enable.dev_attr.attr, + &sensor_dev_attr_pwm1.dev_attr.attr, + &sensor_dev_attr_pwm2.dev_attr.attr, + &sensor_dev_attr_pwm3.dev_attr.attr, + + &dev_attr_vrm.attr, + &dev_attr_cpu0_vid.attr, +NULL +}; + +static const struct attribute_group it87_group_opt = { + .attrs = it87_attributes_opt, +};/* This function is called when: * it87_driver is inserted (when this module is loaded), for each
@@ -948,107 +1027,78 @@it87_init_client (new_client, data);/* Register sysfs hooks */ - data->class_dev =hwmon_device_register (&new_client->dev); -if (IS_ERR (data->class_dev)) { - err =PTR_ERR (data->class_dev); +if ((err =sysfs_create_group (&new_client->dev.kobj, &it87_group))) goto ERROR3; - } - -device_create_file (&new_client->dev, &sensor_dev_attr_in0_input.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in1_input.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in2_input.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in3_input.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in4_input.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in5_input.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in6_input.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in7_input.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in8_input.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in0_min.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in1_min.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in2_min.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in3_min.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in4_min.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in5_min.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in6_min.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in7_min.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in0_max.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in1_max.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in2_max.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in3_max.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in4_max.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in5_max.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in6_max.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_in7_max.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_temp1_input.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_temp2_input.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_temp3_input.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_temp1_max.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_temp2_max.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_temp3_max.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_temp1_min.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_temp2_min.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_temp3_min.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_temp1_type.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_temp2_type.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_temp3_type.dev_attr);/* Do not create fan files for disabled fans */ if (data->type = it8716 || data->type = it8718) {/* 16-bit tachometers */ if (data->has_fan & (1 <<0 )) { -device_create_file (&new_client->dev, - &sensor_dev_attr_fan1_input16.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_fan1_min16.dev_attr); +if ((err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan1_input16.dev_attr)) + || (err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan1_min16.dev_attr))) + goto ERROR4; }if (data->has_fan & (1 <<1 )) { -device_create_file (&new_client->dev, - &sensor_dev_attr_fan2_input16.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_fan2_min16.dev_attr); +if ((err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan2_input16.dev_attr)) + || (err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan2_min16.dev_attr))) + goto ERROR4; }if (data->has_fan & (1 <<2 )) { -device_create_file (&new_client->dev, - &sensor_dev_attr_fan3_input16.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_fan3_min16.dev_attr); +if ((err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan3_input16.dev_attr)) + || (err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan3_min16.dev_attr))) + goto ERROR4; } }else {/* 8-bit tachometers with clock divider */ if (data->has_fan & (1 <<0 )) { -device_create_file (&new_client->dev, - &sensor_dev_attr_fan1_input.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_fan1_min.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_fan1_div.dev_attr); +if ((err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan1_input.dev_attr)) + || (err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan1_min.dev_attr)) + || (err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan1_div.dev_attr))) + goto ERROR4; }if (data->has_fan & (1 <<1 )) { -device_create_file (&new_client->dev, - &sensor_dev_attr_fan2_input.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_fan2_min.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_fan2_div.dev_attr); +if ((err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan2_input.dev_attr)) + || (err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan2_min.dev_attr)) + || (device_create_file (&new_client->dev, + &sensor_dev_attr_fan2_div.dev_attr))) + goto ERROR4; }if (data->has_fan & (1 <<2 )) { -device_create_file (&new_client->dev, - &sensor_dev_attr_fan3_input.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_fan3_min.dev_attr); -device_create_file (&new_client->dev, - &sensor_dev_attr_fan3_div.dev_attr); +if ((err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan3_input.dev_attr)) + || (err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan3_min.dev_attr)) + || (err =device_create_file (&new_client->dev, + &sensor_dev_attr_fan3_div.dev_attr))) + goto ERROR4; } } -device_create_file (&new_client->dev, &dev_attr_alarms);if (enable_pwm_interface) { -device_create_file (&new_client->dev, &sensor_dev_attr_pwm1_enable.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_pwm2_enable.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_pwm3_enable.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_pwm1.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_pwm2.dev_attr); -device_create_file (&new_client->dev, &sensor_dev_attr_pwm3.dev_attr); +if ((err =device_create_file (&new_client->dev, + &sensor_dev_attr_pwm1_enable.dev_attr)) + || (err =device_create_file (&new_client->dev, + &sensor_dev_attr_pwm2_enable.dev_attr)) + || (err =device_create_file (&new_client->dev, + &sensor_dev_attr_pwm3_enable.dev_attr)) + || (err =device_create_file (&new_client->dev, + &sensor_dev_attr_pwm1.dev_attr)) + || (err =device_create_file (&new_client->dev, + &sensor_dev_attr_pwm2.dev_attr)) + || (err =device_create_file (&new_client->dev, + &sensor_dev_attr_pwm3.dev_attr))) + goto ERROR4; } if (data->type = it8712 || data->type = it8716
@@ -1056,12 +1106,24 @@ data->vrm =vid_which_vrm ();/* VID reading from Super-I/O config space if available */ data->vid = vid_value; -device_create_file_vrm (new_client); -device_create_file_vid (new_client); +if ((err =device_create_file (&new_client->dev, + &dev_attr_vrm)) + || (err =device_create_file (&new_client->dev, + &dev_attr_cpu0_vid))) + goto ERROR4; + } + + data->class_dev =hwmon_device_register (&new_client->dev); +if (IS_ERR (data->class_dev)) { + err =PTR_ERR (data->class_dev); + goto ERROR4; }return 0 ; +ERROR4: +sysfs_remove_group (&new_client->dev.kobj, &it87_group); +sysfs_remove_group (&new_client->dev.kobj, &it87_group_opt); ERROR3:i2c_detach_client (new_client); ERROR2:
@@ -1079,6 +1141,8 @@int err;hwmon_device_unregister (data->class_dev); +sysfs_remove_group (&client->dev.kobj, &it87_group); +sysfs_remove_group (&client->dev.kobj, &it87_group_opt);if ((err =i2c_detach_client (client)))return err;
drivers/hwmon/fscher.c +47 -59
137 lines not on this page · raw message
drivers/hwmon/fscpos.c +46 -29
106 lines not on this page · raw message
drivers/hwmon/gl518sm.c +44 -30
105 lines not on this page · raw message
drivers/hwmon/gl520sm.c +82 -46
188 lines not on this page · raw message
Signature · 1 line
Jean Delvare
PATCH 1/1 hwmon: unchecked return status fixes
In reply to Jean DelvareFix up 5 more hwmon drivers so that they no longer ignore return status from device_create_file(). Untested.
--- drivers/hwmon/atxp1.c | 24 +++++++++-- drivers/hwmon/ds1621.c | 27 +++++++++---- drivers/hwmon/max1619.c | 32 +++++++++++---- drivers/hwmon/sis5595.c | 100 +++++++++++++++++++++++++++++++++-------------- drivers/hwmon/via686a.c | 82 +++++++++++++++++++++++---------------- 5 files changed, 180 insertions(+), 85 deletions(-)
drivers/hwmon/atxp1.c +19 -5
@@ -250,6 +250,17 @@*/ static DEVICE_ATTR(gpio2, S_IRUGO | S_IWUSR, atxp1_showgpio2, atxp1_storegpio2); +static struct attribute *atxp1_attributes[] = { + &dev_attr_gpio1.attr, + &dev_attr_gpio2.attr, + &dev_attr_cpu0_vid.attr, +NULL +}; + +static const struct attribute_group atxp1_group = { + .attrs = atxp1_attributes, +}; +static int atxp1_attach_adapter (struct i2c_adapter *adapter) {
@@ -319,21 +330,23 @@ goto exit_free; } +/* Register sysfs hooks */ +if ((err =sysfs_create_group (&new_client->dev.kobj, &atxp1_group))) + goto exit_detach; + data->class_dev =hwmon_device_register (&new_client->dev);if (IS_ERR (data->class_dev)) { err =PTR_ERR (data->class_dev); - goto exit_detach; + goto exit_remove_files; } -device_create_file (&new_client->dev, &dev_attr_gpio1); -device_create_file (&new_client->dev, &dev_attr_gpio2); -device_create_file (&new_client->dev, &dev_attr_cpu0_vid); -dev_info (&new_client->dev,"Using VRM: %d.%d\n" , data->vrm /10 , data->vrm %10 );return 0 ; +exit_remove_files: +sysfs_remove_group (&new_client->dev.kobj, &atxp1_group); exit_detach:i2c_detach_client (new_client); exit_free:
@@ -348,6 +361,7 @@int err;hwmon_device_unregister (data->class_dev); +sysfs_remove_group (&client->dev.kobj, &atxp1_group); err =i2c_detach_client (client);
drivers/hwmon/ds1621.c +19 -8
@@ -178,6 +178,18 @@ static DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO , show_temp_min, set_temp_min); static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, set_temp_max); +static struct attribute *ds1621_attributes[] = { + &dev_attr_alarms.attr, + &dev_attr_temp1_input.attr, + &dev_attr_temp1_min.attr, + &dev_attr_temp1_max.attr, +NULL +}; + +static const struct attribute_group ds1621_group = { + .attrs = ds1621_attributes, +}; +static int ds1621_attach_adapter (struct i2c_adapter *adapter) {
@@ -253,21 +265,19 @@ds1621_init_client (new_client);/* Register sysfs hooks */ +if ((err =sysfs_create_group (&new_client->dev.kobj, &ds1621_group))) + goto exit_detach; + data->class_dev =hwmon_device_register (&new_client->dev);if (IS_ERR (data->class_dev)) { err =PTR_ERR (data->class_dev); - goto exit_detach; + goto exit_remove_files; } -device_create_file (&new_client->dev, &dev_attr_alarms); -device_create_file (&new_client->dev, &dev_attr_temp1_input); -device_create_file (&new_client->dev, &dev_attr_temp1_min); -device_create_file (&new_client->dev, &dev_attr_temp1_max); -return 0 ; -/* OK, this is not exactly good programming practice, usually. But it is -very code-efficient in this case. */ + exit_remove_files: +sysfs_remove_group (&new_client->dev.kobj, &ds1621_group); exit_detach:i2c_detach_client (new_client); exit_free:
@@ -282,6 +292,7 @@int err;hwmon_device_unregister (data->class_dev); +sysfs_remove_group (&client->dev.kobj, &ds1621_group);if ((err =i2c_detach_client (client)))return err;
drivers/hwmon/max1619.c +23 -9
@@ -172,6 +172,22 @@ set_temp_hyst2); static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); +static struct attribute *max1619_attributes[] = { + &dev_attr_temp1_input.attr, + &dev_attr_temp2_input.attr, + &dev_attr_temp2_min.attr, + &dev_attr_temp2_max.attr, + &dev_attr_temp2_crit.attr, + &dev_attr_temp2_crit_hyst.attr, + + &dev_attr_alarms.attr, +NULL +}; + +static const struct attribute_group max1619_group = { + .attrs = max1619_attributes, +}; +/* * Real code */
@@ -273,22 +289,19 @@max1619_init_client (new_client);/* Register sysfs hooks */ +if ((err =sysfs_create_group (&new_client->dev.kobj, &max1619_group))) + goto exit_detach; + data->class_dev =hwmon_device_register (&new_client->dev);if (IS_ERR (data->class_dev)) { err =PTR_ERR (data->class_dev); - goto exit_detach; + goto exit_remove_files; } -device_create_file (&new_client->dev, &dev_attr_temp1_input); -device_create_file (&new_client->dev, &dev_attr_temp2_input); -device_create_file (&new_client->dev, &dev_attr_temp2_min); -device_create_file (&new_client->dev, &dev_attr_temp2_max); -device_create_file (&new_client->dev, &dev_attr_temp2_crit); -device_create_file (&new_client->dev, &dev_attr_temp2_crit_hyst); -device_create_file (&new_client->dev, &dev_attr_alarms); -return 0 ; +exit_remove_files: +sysfs_remove_group (&new_client->dev.kobj, &max1619_group); exit_detach:i2c_detach_client (new_client); exit_free:
@@ -318,6 +331,7 @@int err;hwmon_device_unregister (data->class_dev); +sysfs_remove_group (&client->dev.kobj, &max1619_group);if ((err =i2c_detach_client (client)))return err;
drivers/hwmon/sis5595.c +70 -30
125 lines not on this page · raw message
drivers/hwmon/via686a.c +49 -33
107 lines not on this page · raw message
Signature · 1 line
Jean Delvare
PATCH 1/1 hwmon: unchecked return status fixes
In reply to Jean DelvareFix up 2 more hwmon drivers so that they no longer ignore return status from device_create_file(). Untested.
--- drivers/hwmon/smsc47m1.c | 78 ++++++++++++++++++----- drivers/hwmon/smsc47m192.c | 150 +++++++++++++++++++++++++------------------- 2 files changed, 145 insertions(+), 83 deletions(-)
drivers/hwmon/smsc47m1.c +60 -18
@@ -35,6 +35,7 @@#include <linux/err.h> #include <linux/init.h> #include <linux/mutex.h> +#include <linux/sysfs.h> #include <asm/io.h> /* Address is autodetected, there is no default value */
@@ -347,6 +348,30 @@ static DEVICE_ATTR(alarms, S_IRUGO, get_alarms, NULL); +/* Almost all sysfs files may or may not be created depending on the chip +setup so we create them individually. It is still convenient to define a +group to remove them all at once. */ +static struct attribute *smsc47m1_attributes[] = { + &dev_attr_fan1_input.attr, + &dev_attr_fan1_min.attr, + &dev_attr_fan1_div.attr, + &dev_attr_fan2_input.attr, + &dev_attr_fan2_min.attr, + &dev_attr_fan2_div.attr, + + &dev_attr_pwm1.attr, + &dev_attr_pwm1_enable.attr, + &dev_attr_pwm2.attr, + &dev_attr_pwm2_enable.attr, + + &dev_attr_alarms.attr, +NULL +}; + +static const struct attribute_group smsc47m1_group = { + .attrs = smsc47m1_attributes, +}; +static int __init smsc47m1_find (unsigned short *addr) {u8 val;
@@ -447,46 +472,62 @@smsc47m1_update_device (&new_client->dev,1 );/* Register sysfs hooks */ - data->class_dev =hwmon_device_register (&new_client->dev); -if (IS_ERR (data->class_dev)) { - err =PTR_ERR (data->class_dev); - goto error_detach; - } -if (fan1) { -device_create_file (&new_client->dev, &dev_attr_fan1_input); -device_create_file (&new_client->dev, &dev_attr_fan1_min); -device_create_file (&new_client->dev, &dev_attr_fan1_div); +if ((err =device_create_file (&new_client->dev, + &dev_attr_fan1_input)) + || (err =device_create_file (&new_client->dev, + &dev_attr_fan1_min)) + || (err =device_create_file (&new_client->dev, + &dev_attr_fan1_div))) + goto error_remove_files; }else dev_dbg (&new_client->dev,"Fan 1 not enabled by hardware, " "skipping\n" );if (fan2) { -device_create_file (&new_client->dev, &dev_attr_fan2_input); -device_create_file (&new_client->dev, &dev_attr_fan2_min); -device_create_file (&new_client->dev, &dev_attr_fan2_div); +if ((err =device_create_file (&new_client->dev, + &dev_attr_fan2_input)) + || (err =device_create_file (&new_client->dev, + &dev_attr_fan2_min)) + || (err =device_create_file (&new_client->dev, + &dev_attr_fan2_div))) + goto error_remove_files; }else dev_dbg (&new_client->dev,"Fan 2 not enabled by hardware, " "skipping\n" );if (pwm1) { -device_create_file (&new_client->dev, &dev_attr_pwm1); -device_create_file (&new_client->dev, &dev_attr_pwm1_enable); +if ((err =device_create_file (&new_client->dev, + &dev_attr_pwm1)) + || (err =device_create_file (&new_client->dev, + &dev_attr_pwm1_enable))) + goto error_remove_files; }else dev_dbg (&new_client->dev,"PWM 1 not enabled by hardware, " "skipping\n" );if (pwm2) { -device_create_file (&new_client->dev, &dev_attr_pwm2); -device_create_file (&new_client->dev, &dev_attr_pwm2_enable); +if ((err =device_create_file (&new_client->dev, + &dev_attr_pwm2)) + || (err =device_create_file (&new_client->dev, + &dev_attr_pwm2_enable))) + goto error_remove_files; }else dev_dbg (&new_client->dev,"PWM 2 not enabled by hardware, " "skipping\n" ); -device_create_file (&new_client->dev, &dev_attr_alarms); +if ((err =device_create_file (&new_client->dev, &dev_attr_alarms))) + goto error_remove_files; + + data->class_dev =hwmon_device_register (&new_client->dev); +if (IS_ERR (data->class_dev)) { + err =PTR_ERR (data->class_dev); + goto error_remove_files; + }return 0 ; -error_detach: +error_remove_files: +sysfs_remove_group (&new_client->dev.kobj, &smsc47m1_group);i2c_detach_client (new_client); error_free:kfree (data);
@@ -501,6 +542,7 @@int err;hwmon_device_unregister (data->class_dev); +sysfs_remove_group (&client->dev.kobj, &smsc47m1_group);if ((err =i2c_detach_client (client)))return err;
drivers/hwmon/smsc47m192.c +85 -65
183 lines not on this page · raw message
Signature · 1 line
Jean Delvare
PATCH 1/1 hwmon: unchecked return status fixes
In reply to Jean DelvareHi Jean:
Quoted 11 lines · Jean Delvare
Fix up 5 more hwmon drivers so that they no longer ignore return status from
device_create_file(). Untested.Signed-off-by Jean Delvare <khali at linux-fr.org>--- drivers/hwmon/atxp1.c | 24 +++++++++-- drivers/hwmon/ds1621.c | 27 +++++++++---- drivers/hwmon/max1619.c | 32 +++++++++++---- drivers/hwmon/sis5595.c | 100 +++++++++++++++++++++++++++++++++-------------- drivers/hwmon/via686a.c | 82 +++++++++++++++++++++++---------------- 5 files changed, 180 insertions(+), 85 deletions(-)
You should add '#include <linux/sysfs.h>' to all of these. Also...
Quoted 7 lines
drivers/hwmon/sis5595.c +1
-0@@ -566,43 +610,37 @@ }/* Register sysfs hooks */ +if ((err =sysfs_create_group (&new_client->dev.kobj, &sis5595_group)))
drivers/hwmon/sis5595.c line 623
Quoted 10 lines
drivers/hwmon/sis5595.c +10
-0+ goto exit_detach; +if (data->maxins =4 ) { +if ((err =device_create_file (&new_client->dev, + &dev_attr_in4_input)) + || (err =device_create_file (&new_client->dev, + &dev_attr_in4_min)) + || (err =device_create_file (&new_client->dev, + &dev_attr_in4_max))) + goto exit_remove_files; + }else {
This else implies data->maxins = 3 right? Just checking.
Quoted 43 lines
drivers/hwmon/sis5595.c +10
-28+if ((err =device_create_file (&new_client->dev, + &dev_attr_temp1_input)) + || (err =device_create_file (&new_client->dev, + &dev_attr_temp1_max)) + || (err =device_create_file (&new_client->dev, + &dev_attr_temp1_max_hyst))) + goto exit_remove_files; + } + data->class_dev =hwmon_device_register (&new_client->dev);if (IS_ERR (data->class_dev)) { err =PTR_ERR (data->class_dev); - goto exit_detach; + goto exit_remove_files; } -device_create_file (&new_client->dev, &dev_attr_in0_input); -device_create_file (&new_client->dev, &dev_attr_in0_min); -device_create_file (&new_client->dev, &dev_attr_in0_max); -device_create_file (&new_client->dev, &dev_attr_in1_input); -device_create_file (&new_client->dev, &dev_attr_in1_min); -device_create_file (&new_client->dev, &dev_attr_in1_max); -device_create_file (&new_client->dev, &dev_attr_in2_input); -device_create_file (&new_client->dev, &dev_attr_in2_min); -device_create_file (&new_client->dev, &dev_attr_in2_max); -device_create_file (&new_client->dev, &dev_attr_in3_input); -device_create_file (&new_client->dev, &dev_attr_in3_min); -device_create_file (&new_client->dev, &dev_attr_in3_max); -if (data->maxins =4 ) { -device_create_file (&new_client->dev, &dev_attr_in4_input); -device_create_file (&new_client->dev, &dev_attr_in4_min); -device_create_file (&new_client->dev, &dev_attr_in4_max); - } -device_create_file (&new_client->dev, &dev_attr_fan1_input); -device_create_file (&new_client->dev, &dev_attr_fan1_min); -device_create_file (&new_client->dev, &dev_attr_fan1_div); -device_create_file (&new_client->dev, &dev_attr_fan2_input); -device_create_file (&new_client->dev, &dev_attr_fan2_min); -device_create_file (&new_client->dev, &dev_attr_fan2_div); -device_create_file (&new_client->dev, &dev_attr_alarms); -if (data->maxins =3 ) { -device_create_file (&new_client->dev, &dev_attr_temp1_input); -device_create_file (&new_client->dev, &dev_attr_temp1_max);
drivers/hwmon/sis5595.c line 646
Quoted 10 lines
drivers/hwmon/sis5595.c +3
-2-device_create_file (&new_client->dev, &dev_attr_temp1_max_hyst); - }return 0 ; +exit_remove_files: +sysfs_remove_group (&new_client->dev.kobj, &sis5595_group); +sysfs_remove_group (&new_client->dev.kobj, &sis5595_group_opt); exit_detach:i2c_detach_client (new_client); exit_free:
Regards,
Signature · 2 lines
Mark M. Hoffman mhoffman at lightlink.com
PATCH 1/1 hwmon: unchecked return status fixes
In reply to Jean DelvareMark,
Quoted 13 lines · Jean Delvare
Quoted 11 lines
Fix up 5 more hwmon drivers so that they no longer ignore return status from
device_create_file(). Untested.Signed-off-by Jean Delvare <khali at linux-fr.org>--- drivers/hwmon/atxp1.c | 24 +++++++++-- drivers/hwmon/ds1621.c | 27 +++++++++---- drivers/hwmon/max1619.c | 32 +++++++++++---- drivers/hwmon/sis5595.c | 100 +++++++++++++++++++++++++++++++++-------------- drivers/hwmon/via686a.c | 82 +++++++++++++++++++++++---------------- 5 files changed, 180 insertions(+), 85 deletions(-)
Quoted 1 line
You should add '#include <
linux/sysfs.h>' to all of these. Also...
Yes, you're right. I've done so.
BTW, there are a lot of drivers missing it as well (basically all the drivers which were converted early, including all of yours.) Should I edit all the patches before I send them to Greg?
Quoted 5 lines
Quoted 5 lines
drivers/hwmon/sis5595.c +0
-0@@ -566,43 +610,37 @@ }
Quoted 14 lines
drivers/hwmon/sis5595.c line 623
Quoted 12 lines
drivers/hwmon/sis5595.c +11
-0/* Register sysfs hooks */ +if ((err =sysfs_create_group (&new_client->dev.kobj, &sis5595_group))) + goto exit_detach; +if (data->maxins =4 ) { +if ((err =device_create_file (&new_client->dev, + &dev_attr_in4_input)) + || (err =device_create_file (&new_client->dev, + &dev_attr_in4_min)) + || (err =device_create_file (&new_client->dev, + &dev_attr_in4_max))) + goto exit_remove_files; + }else {This else implies
data->maxins= 3 right? Just checking.
I assumed so, but you're right to ask. Fortunately, after checking, it appears to be correct.
Quoted 47 lines
Quoted 47 lines
drivers/hwmon/sis5595.c +10
-30+if ((err =device_create_file (&new_client->dev, + &dev_attr_temp1_input)) + || (err =device_create_file (&new_client->dev, + &dev_attr_temp1_max)) + || (err =device_create_file (&new_client->dev, + &dev_attr_temp1_max_hyst))) + goto exit_remove_files; + } + data->class_dev =hwmon_device_register (&new_client->dev);if (IS_ERR (data->class_dev)) { err =PTR_ERR (data->class_dev); - goto exit_detach; + goto exit_remove_files; } -device_create_file (&new_client->dev, &dev_attr_in0_input); -device_create_file (&new_client->dev, &dev_attr_in0_min); -device_create_file (&new_client->dev, &dev_attr_in0_max); -device_create_file (&new_client->dev, &dev_attr_in1_input); -device_create_file (&new_client->dev, &dev_attr_in1_min); -device_create_file (&new_client->dev, &dev_attr_in1_max); -device_create_file (&new_client->dev, &dev_attr_in2_input); -device_create_file (&new_client->dev, &dev_attr_in2_min); -device_create_file (&new_client->dev, &dev_attr_in2_max); -device_create_file (&new_client->dev, &dev_attr_in3_input); -device_create_file (&new_client->dev, &dev_attr_in3_min); -device_create_file (&new_client->dev, &dev_attr_in3_max); -if (data->maxins =4 ) { -device_create_file (&new_client->dev, &dev_attr_in4_input); -device_create_file (&new_client->dev, &dev_attr_in4_min); -device_create_file (&new_client->dev, &dev_attr_in4_max); - } -device_create_file (&new_client->dev, &dev_attr_fan1_input); -device_create_file (&new_client->dev, &dev_attr_fan1_min); -device_create_file (&new_client->dev, &dev_attr_fan1_div); -device_create_file (&new_client->dev, &dev_attr_fan2_input); -device_create_file (&new_client->dev, &dev_attr_fan2_min); -device_create_file (&new_client->dev, &dev_attr_fan2_div); -device_create_file (&new_client->dev, &dev_attr_alarms); -if (data->maxins =3 ) { -device_create_file (&new_client->dev, &dev_attr_temp1_input); -device_create_file (&new_client->dev, &dev_attr_temp1_max); -device_create_file (&new_client->dev, &dev_attr_temp1_max_hyst); - }return 0 ;
Quoted 6 lines
drivers/hwmon/sis5595.c line 646
Quoted 6 lines
drivers/hwmon/sis5595.c +3
-0+exit_remove_files: +sysfs_remove_group (&new_client->dev.kobj, &sis5595_group); +sysfs_remove_group (&new_client->dev.kobj, &sis5595_group_opt); exit_detach:i2c_detach_client (new_client); exit_free:
Thanks for the review!
Signature · 1 line
Jean Delvare