From: Jeff Garzik Signed-off-by: Jeff Garzik Cc: Alessandro Zummo Signed-off-by: Andrew Morton --- drivers/rtc/rtc-ds1672.c | 9 +++++++-- drivers/rtc/rtc-rs5c372.c | 12 ++++++++++-- drivers/rtc/rtc-test.c | 9 ++++++++- drivers/rtc/rtc-x1205.c | 12 ++++++++++-- 4 files changed, 35 insertions(+), 7 deletions(-) diff -puN drivers/rtc/rtc-ds1672.c~rtc-handle-sysfs-errors drivers/rtc/rtc-ds1672.c --- a/drivers/rtc/rtc-ds1672.c~rtc-handle-sysfs-errors +++ a/drivers/rtc/rtc-ds1672.c @@ -237,17 +237,22 @@ static int ds1672_probe(struct i2c_adapt /* read control register */ err = ds1672_get_control(client, &control); if (err) - goto exit_detach; + goto exit_devreg; if (control & DS1672_REG_CONTROL_EOSC) dev_warn(&client->dev, "Oscillator not enabled. " "Set time to enable.\n"); /* Register sysfs hooks */ - device_create_file(&client->dev, &dev_attr_control); + err = device_create_file(&client->dev, &dev_attr_control); + if (err) + goto exit_devreg; return 0; +exit_devreg: + rtc_device_unregister(rtc); + exit_detach: i2c_detach_client(client); diff -puN drivers/rtc/rtc-rs5c372.c~rtc-handle-sysfs-errors drivers/rtc/rtc-rs5c372.c --- a/drivers/rtc/rtc-rs5c372.c~rtc-handle-sysfs-errors +++ a/drivers/rtc/rtc-rs5c372.c @@ -238,11 +238,19 @@ static int rs5c372_probe(struct i2c_adap i2c_set_clientdata(client, rtc); - device_create_file(&client->dev, &dev_attr_trim); - device_create_file(&client->dev, &dev_attr_osc); + err = device_create_file(&client->dev, &dev_attr_trim); + if (err) goto exit_devreg; + err = device_create_file(&client->dev, &dev_attr_osc); + if (err) goto exit_trim; return 0; +exit_trim: + device_remove_file(&client->dev, &dev_attr_trim); + +exit_devreg: + rtc_device_unregister(rtc); + exit_detach: i2c_detach_client(client); diff -puN drivers/rtc/rtc-test.c~rtc-handle-sysfs-errors drivers/rtc/rtc-test.c --- a/drivers/rtc/rtc-test.c~rtc-handle-sysfs-errors +++ a/drivers/rtc/rtc-test.c @@ -121,11 +121,18 @@ static int test_probe(struct platform_de err = PTR_ERR(rtc); return err; } - device_create_file(&plat_dev->dev, &dev_attr_irq); + + err = device_create_file(&plat_dev->dev, &dev_attr_irq); + if (err) + goto err; platform_set_drvdata(plat_dev, rtc); return 0; + +err: + rtc_device_unregister(rtc); + return err; } static int __devexit test_remove(struct platform_device *plat_dev) diff -puN drivers/rtc/rtc-x1205.c~rtc-handle-sysfs-errors drivers/rtc/rtc-x1205.c --- a/drivers/rtc/rtc-x1205.c~rtc-handle-sysfs-errors +++ a/drivers/rtc/rtc-x1205.c @@ -562,11 +562,19 @@ static int x1205_probe(struct i2c_adapte else dev_err(&client->dev, "couldn't read status\n"); - device_create_file(&client->dev, &dev_attr_atrim); - device_create_file(&client->dev, &dev_attr_dtrim); + err = device_create_file(&client->dev, &dev_attr_atrim); + if (err) goto exit_devreg; + err = device_create_file(&client->dev, &dev_attr_dtrim); + if (err) goto exit_atrim; return 0; +exit_atrim: + device_remove_file(&client->dev, &dev_attr_atrim); + +exit_devreg: + rtc_device_unregister(rtc); + exit_detach: i2c_detach_client(client); _