Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] RTC: handle sysfs errors

Signed-off-by: Jeff Garzik <jeff@garzik.org>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Jeff Garzik and committed by
Linus Torvalds
91046a8a bfc7ee20

+35 -7
+7 -2
drivers/rtc/rtc-ds1672.c
··· 237 237 /* read control register */ 238 238 err = ds1672_get_control(client, &control); 239 239 if (err) 240 - goto exit_detach; 240 + goto exit_devreg; 241 241 242 242 if (control & DS1672_REG_CONTROL_EOSC) 243 243 dev_warn(&client->dev, "Oscillator not enabled. " 244 244 "Set time to enable.\n"); 245 245 246 246 /* Register sysfs hooks */ 247 - device_create_file(&client->dev, &dev_attr_control); 247 + err = device_create_file(&client->dev, &dev_attr_control); 248 + if (err) 249 + goto exit_devreg; 248 250 249 251 return 0; 252 + 253 + exit_devreg: 254 + rtc_device_unregister(rtc); 250 255 251 256 exit_detach: 252 257 i2c_detach_client(client);
+10 -2
drivers/rtc/rtc-rs5c372.c
··· 238 238 239 239 i2c_set_clientdata(client, rtc); 240 240 241 - device_create_file(&client->dev, &dev_attr_trim); 242 - device_create_file(&client->dev, &dev_attr_osc); 241 + err = device_create_file(&client->dev, &dev_attr_trim); 242 + if (err) goto exit_devreg; 243 + err = device_create_file(&client->dev, &dev_attr_osc); 244 + if (err) goto exit_trim; 243 245 244 246 return 0; 247 + 248 + exit_trim: 249 + device_remove_file(&client->dev, &dev_attr_trim); 250 + 251 + exit_devreg: 252 + rtc_device_unregister(rtc); 245 253 246 254 exit_detach: 247 255 i2c_detach_client(client);
+8 -1
drivers/rtc/rtc-test.c
··· 123 123 err = PTR_ERR(rtc); 124 124 return err; 125 125 } 126 - device_create_file(&plat_dev->dev, &dev_attr_irq); 126 + 127 + err = device_create_file(&plat_dev->dev, &dev_attr_irq); 128 + if (err) 129 + goto err; 127 130 128 131 platform_set_drvdata(plat_dev, rtc); 129 132 130 133 return 0; 134 + 135 + err: 136 + rtc_device_unregister(rtc); 137 + return err; 131 138 } 132 139 133 140 static int __devexit test_remove(struct platform_device *plat_dev)
+10 -2
drivers/rtc/rtc-x1205.c
··· 562 562 else 563 563 dev_err(&client->dev, "couldn't read status\n"); 564 564 565 - device_create_file(&client->dev, &dev_attr_atrim); 566 - device_create_file(&client->dev, &dev_attr_dtrim); 565 + err = device_create_file(&client->dev, &dev_attr_atrim); 566 + if (err) goto exit_devreg; 567 + err = device_create_file(&client->dev, &dev_attr_dtrim); 568 + if (err) goto exit_atrim; 567 569 568 570 return 0; 571 + 572 + exit_atrim: 573 + device_remove_file(&client->dev, &dev_attr_atrim); 574 + 575 + exit_devreg: 576 + rtc_device_unregister(rtc); 569 577 570 578 exit_detach: 571 579 i2c_detach_client(client);