pc87360: Check for error on sysfs files creation
Jim Cromie [Sun, 24 Sep 2006 19:03:25 +0000 (21:03 +0200)]
pc87360: Check for error on sysfs files creation

Use sysfs_create_group() for 2 sensor-types which are chip-model
invariant, i.e. all-or-nothing attribute groups.
Other 2 groups vary too much due to configuration, etc, so we keep the
loops of device_create_file(), but now check their returns.

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

drivers/hwmon/pc87360.c

index ce3232c..3b8b819 100644 (file)
@@ -1018,60 +1018,69 @@ static int pc87360_detect(struct i2c_adapter *adapter)
                pc87360_init_client(client, use_thermistors);
        }
 
-       /* Register sysfs hooks */
-       data->class_dev = hwmon_device_register(&client->dev);
-       if (IS_ERR(data->class_dev)) {
-               err = PTR_ERR(data->class_dev);
+       /* Register all-or-nothing sysfs groups */
+
+       if (data->innr &&
+           (err = sysfs_create_group(&client->dev.kobj,
+                                     &pc8736x_vin_group)))
                goto ERROR3;
-       }
 
-       if (data->innr) {
-               for (i = 0; i < 11; i++) {
-                       device_create_file(dev, &in_input[i].dev_attr);
-                       device_create_file(dev, &in_min[i].dev_attr);
-                       device_create_file(dev, &in_max[i].dev_attr);
-                       device_create_file(dev, &in_status[i].dev_attr);
-               }
-               device_create_file(dev, &dev_attr_cpu0_vid);
-               device_create_file(dev, &dev_attr_vrm);
-               device_create_file(dev, &dev_attr_alarms_in);
-       }
+       if (data->innr == 14 &&
+           (err = sysfs_create_group(&client->dev.kobj,
+                                     &pc8736x_therm_group)))
+               goto ERROR3;
+
+       /* create device attr-files for varying sysfs groups */
 
        if (data->tempnr) {
                for (i = 0; i < data->tempnr; i++) {
-                       device_create_file(dev, &temp_input[i].dev_attr);
-                       device_create_file(dev, &temp_min[i].dev_attr);
-                       device_create_file(dev, &temp_max[i].dev_attr);
-                       device_create_file(dev, &temp_crit[i].dev_attr);
-                       device_create_file(dev, &temp_status[i].dev_attr);
-               }
-               device_create_file(dev, &dev_attr_alarms_temp);
-       }
-
-       if (data->innr == 14) {
-               for (i = 0; i < 3; i++) {
-                       device_create_file(dev, &therm_input[i].dev_attr);
-                       device_create_file(dev, &therm_min[i].dev_attr);
-                       device_create_file(dev, &therm_max[i].dev_attr);
-                       device_create_file(dev, &therm_crit[i].dev_attr);
-                       device_create_file(dev, &therm_status[i].dev_attr);
+                       if ((err = device_create_file(dev,
+                                       &temp_input[i].dev_attr))
+                           || (err = device_create_file(dev,
+                                       &temp_min[i].dev_attr))
+                           || (err = device_create_file(dev,
+                                       &temp_max[i].dev_attr))
+                           || (err = device_create_file(dev,
+                                       &temp_crit[i].dev_attr))
+                           || (err = device_create_file(dev,
+                                       &temp_status[i].dev_attr)))
+                               goto ERROR3;
                }
+               if ((err = device_create_file(dev, &dev_attr_alarms_temp)))
+                       goto ERROR3;
        }
 
        for (i = 0; i < data->fannr; i++) {
-               if (FAN_CONFIG_MONITOR(data->fan_conf, i)) {
-                       device_create_file(dev, &fan_input[i].dev_attr);
-                       device_create_file(dev, &fan_min[i].dev_attr);
-                       device_create_file(dev, &fan_div[i].dev_attr);
-                       device_create_file(dev, &fan_status[i].dev_attr);
-               }
-               if (FAN_CONFIG_CONTROL(data->fan_conf, i))
-                       device_create_file(dev, &pwm[i].dev_attr);
+               if (FAN_CONFIG_MONITOR(data->fan_conf, i)
+                   && ((err = device_create_file(dev,
+                                       &fan_input[i].dev_attr))
+                       || (err = device_create_file(dev,
+                                       &fan_min[i].dev_attr))
+                       || (err = device_create_file(dev,
+                                       &fan_div[i].dev_attr))
+                       || (err = device_create_file(dev,
+                                       &fan_status[i].dev_attr))))
+                       goto ERROR3;
+
+               if (FAN_CONFIG_CONTROL(data->fan_conf, i)
+                   && (err = device_create_file(dev, &pwm[i].dev_attr)))
+                       goto ERROR3;
        }
 
+       data->class_dev = hwmon_device_register(&client->dev);
+       if (IS_ERR(data->class_dev)) {
+               err = PTR_ERR(data->class_dev);
+               goto ERROR3;
+       }
        return 0;
 
 ERROR3:
+       /* can still remove groups whose members were added individually */
+       sysfs_remove_group(&client->dev.kobj, &pc8736x_temp_group);
+       sysfs_remove_group(&client->dev.kobj, &pc8736x_fan_group);
+       sysfs_remove_group(&client->dev.kobj, &pc8736x_therm_group);
+       sysfs_remove_group(&client->dev.kobj, &pc8736x_vin_group);
+
        i2c_detach_client(client);
 ERROR2:
        for (i = 0; i < 3; i++) {