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

rtc: fix potential race condition

RTC drivers must not return an error after device registration.

[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: Alessandro Zummo <a.zummo@towertech.it>
Reported-by: Ales Novak <alnovak@suse.cz>
Cc: Alexander Shiyan <shc_work@mail.ru>
Cc: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc: Jiri Kosina <jkosina@suse.cz>
Cc: Srikanth Srinivasan <srikanth.srinivasan@freescale.com>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Alessandro Zummo and committed by
Linus Torvalds
4071ea25 a68b3108

+70 -65
+4 -6
drivers/rtc/rtc-ds1305.c
··· 756 756 status = devm_request_irq(&spi->dev, spi->irq, ds1305_irq, 757 757 0, dev_name(&ds1305->rtc->dev), ds1305); 758 758 if (status < 0) { 759 - dev_dbg(&spi->dev, "request_irq %d --> %d\n", 759 + dev_err(&spi->dev, "request_irq %d --> %d\n", 760 760 spi->irq, status); 761 - return status; 761 + } else { 762 + device_set_wakeup_capable(&spi->dev, 1); 762 763 } 763 - 764 - device_set_wakeup_capable(&spi->dev, 1); 765 764 } 766 765 767 766 /* export NVRAM */ 768 767 status = sysfs_create_bin_file(&spi->dev.kobj, &nvram); 769 768 if (status < 0) { 770 - dev_dbg(&spi->dev, "register nvram --> %d\n", status); 771 - return status; 769 + dev_err(&spi->dev, "register nvram --> %d\n", status); 772 770 } 773 771 774 772 return 0;
+33 -27
drivers/rtc/rtc-ds1307.c
··· 930 930 ds1307->rtc = devm_rtc_device_register(&client->dev, client->name, 931 931 &ds13xx_rtc_ops, THIS_MODULE); 932 932 if (IS_ERR(ds1307->rtc)) { 933 - err = PTR_ERR(ds1307->rtc); 934 - dev_err(&client->dev, 935 - "unable to register the class device\n"); 936 - goto exit; 933 + return PTR_ERR(ds1307->rtc); 937 934 } 938 935 939 936 if (want_irq) { 940 937 err = request_irq(client->irq, ds1307_irq, IRQF_SHARED, 941 938 ds1307->rtc->name, client); 942 939 if (err) { 943 - dev_err(&client->dev, 944 - "unable to request IRQ!\n"); 945 - goto exit; 946 - } 940 + client->irq = 0; 941 + dev_err(&client->dev, "unable to request IRQ!\n"); 942 + } else { 947 943 948 - device_set_wakeup_capable(&client->dev, 1); 949 - set_bit(HAS_ALARM, &ds1307->flags); 950 - dev_dbg(&client->dev, "got IRQ %d\n", client->irq); 944 + device_set_wakeup_capable(&client->dev, 1); 945 + set_bit(HAS_ALARM, &ds1307->flags); 946 + dev_dbg(&client->dev, "got IRQ %d\n", client->irq); 947 + } 951 948 } 952 949 953 950 if (chip->nvram_size) { 951 + 954 952 ds1307->nvram = devm_kzalloc(&client->dev, 955 953 sizeof(struct bin_attribute), 956 954 GFP_KERNEL); 957 955 if (!ds1307->nvram) { 958 - err = -ENOMEM; 959 - goto err_irq; 956 + dev_err(&client->dev, "cannot allocate memory for nvram sysfs\n"); 957 + } else { 958 + 959 + ds1307->nvram->attr.name = "nvram"; 960 + ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR; 961 + 962 + sysfs_bin_attr_init(ds1307->nvram); 963 + 964 + ds1307->nvram->read = ds1307_nvram_read; 965 + ds1307->nvram->write = ds1307_nvram_write; 966 + ds1307->nvram->size = chip->nvram_size; 967 + ds1307->nvram_offset = chip->nvram_offset; 968 + 969 + err = sysfs_create_bin_file(&client->dev.kobj, 970 + ds1307->nvram); 971 + if (err) { 972 + dev_err(&client->dev, 973 + "unable to create sysfs file: %s\n", 974 + ds1307->nvram->attr.name); 975 + } else { 976 + set_bit(HAS_NVRAM, &ds1307->flags); 977 + dev_info(&client->dev, "%zu bytes nvram\n", 978 + ds1307->nvram->size); 979 + } 960 980 } 961 - ds1307->nvram->attr.name = "nvram"; 962 - ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR; 963 - sysfs_bin_attr_init(ds1307->nvram); 964 - ds1307->nvram->read = ds1307_nvram_read; 965 - ds1307->nvram->write = ds1307_nvram_write; 966 - ds1307->nvram->size = chip->nvram_size; 967 - ds1307->nvram_offset = chip->nvram_offset; 968 - err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram); 969 - if (err) 970 - goto err_irq; 971 - set_bit(HAS_NVRAM, &ds1307->flags); 972 - dev_info(&client->dev, "%zu bytes nvram\n", ds1307->nvram->size); 973 981 } 974 982 975 983 return 0; 976 984 977 - err_irq: 978 - free_irq(client->irq, client); 979 985 exit: 980 986 return err; 981 987 }
+10 -8
drivers/rtc/rtc-ds1511.c
··· 473 473 474 474 static int ds1511_rtc_probe(struct platform_device *pdev) 475 475 { 476 - struct rtc_device *rtc; 477 476 struct resource *res; 478 477 struct rtc_plat_data *pdata; 479 478 int ret = 0; ··· 511 512 512 513 spin_lock_init(&pdata->lock); 513 514 platform_set_drvdata(pdev, pdata); 515 + 516 + pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, 517 + &ds1511_rtc_ops, THIS_MODULE); 518 + if (IS_ERR(pdata->rtc)) 519 + return PTR_ERR(pdata->rtc); 520 + 514 521 /* 515 522 * if the platform has an interrupt in mind for this device, 516 523 * then by all means, set it ··· 531 526 } 532 527 } 533 528 534 - rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &ds1511_rtc_ops, 535 - THIS_MODULE); 536 - if (IS_ERR(rtc)) 537 - return PTR_ERR(rtc); 538 - pdata->rtc = rtc; 539 - 540 529 ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr); 530 + if (ret) 531 + dev_err(&pdev->dev, "Unable to create sysfs entry: %s\n", 532 + ds1511_nvram_attr.attr.name); 541 533 542 - return ret; 534 + return 0; 543 535 } 544 536 545 537 static int ds1511_rtc_remove(struct platform_device *pdev)
+10 -8
drivers/rtc/rtc-ds1553.c
··· 278 278 279 279 static int ds1553_rtc_probe(struct platform_device *pdev) 280 280 { 281 - struct rtc_device *rtc; 282 281 struct resource *res; 283 282 unsigned int cen, sec; 284 283 struct rtc_plat_data *pdata; ··· 310 311 spin_lock_init(&pdata->lock); 311 312 pdata->last_jiffies = jiffies; 312 313 platform_set_drvdata(pdev, pdata); 314 + 315 + pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, 316 + &ds1553_rtc_ops, THIS_MODULE); 317 + if (IS_ERR(pdata->rtc)) 318 + return PTR_ERR(pdata->rtc); 319 + 313 320 if (pdata->irq > 0) { 314 321 writeb(0, ioaddr + RTC_INTERRUPTS); 315 322 if (devm_request_irq(&pdev->dev, pdata->irq, ··· 326 321 } 327 322 } 328 323 329 - rtc = devm_rtc_device_register(&pdev->dev, pdev->name, 330 - &ds1553_rtc_ops, THIS_MODULE); 331 - if (IS_ERR(rtc)) 332 - return PTR_ERR(rtc); 333 - pdata->rtc = rtc; 334 - 335 324 ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1553_nvram_attr); 325 + if (ret) 326 + dev_err(&pdev->dev, "unable to create sysfs file: %s\n", 327 + ds1553_nvram_attr.attr.name); 336 328 337 - return ret; 329 + return 0; 338 330 } 339 331 340 332 static int ds1553_rtc_remove(struct platform_device *pdev)
+5 -6
drivers/rtc/rtc-ds1672.c
··· 177 177 178 178 /* read control register */ 179 179 err = ds1672_get_control(client, &control); 180 - if (err) 181 - goto exit_devreg; 180 + if (err) { 181 + dev_warn(&client->dev, "Unable to read the control register\n"); 182 + } 182 183 183 184 if (control & DS1672_REG_CONTROL_EOSC) 184 185 dev_warn(&client->dev, "Oscillator not enabled. " ··· 188 187 /* Register sysfs hooks */ 189 188 err = device_create_file(&client->dev, &dev_attr_control); 190 189 if (err) 191 - goto exit_devreg; 190 + dev_err(&client->dev, "Unable to create sysfs entry: %s\n", 191 + dev_attr_control.attr.name); 192 192 193 193 return 0; 194 - 195 - exit_devreg: 196 - return err; 197 194 } 198 195 199 196 static struct i2c_device_id ds1672_id[] = {
+4 -1
drivers/rtc/rtc-ds1742.c
··· 204 204 return PTR_ERR(rtc); 205 205 206 206 ret = sysfs_create_bin_file(&pdev->dev.kobj, &pdata->nvram_attr); 207 + if (ret) 208 + dev_err(&pdev->dev, "Unable to create sysfs entry: %s\n", 209 + pdata->nvram_attr.attr.name); 207 210 208 - return ret; 211 + return 0; 209 212 } 210 213 211 214 static int ds1742_rtc_remove(struct platform_device *pdev)
-2
drivers/rtc/rtc-ds3232.c
··· 414 414 ds3232->rtc = devm_rtc_device_register(&client->dev, client->name, 415 415 &ds3232_rtc_ops, THIS_MODULE); 416 416 if (IS_ERR(ds3232->rtc)) { 417 - dev_err(&client->dev, "unable to register the class device\n"); 418 417 return PTR_ERR(ds3232->rtc); 419 418 } 420 419 ··· 422 423 "ds3232", client); 423 424 if (ret) { 424 425 dev_err(&client->dev, "unable to request IRQ\n"); 425 - return ret; 426 426 } 427 427 } 428 428
+3 -6
drivers/rtc/rtc-test.c
··· 104 104 rtc = devm_rtc_device_register(&plat_dev->dev, "test", 105 105 &test_rtc_ops, THIS_MODULE); 106 106 if (IS_ERR(rtc)) { 107 - err = PTR_ERR(rtc); 108 - return err; 107 + return PTR_ERR(rtc); 109 108 } 110 109 111 110 err = device_create_file(&plat_dev->dev, &dev_attr_irq); 112 111 if (err) 113 - goto err; 112 + dev_err(&plat_dev->dev, "Unable to create sysfs entry: %s\n", 113 + dev_attr_irq.attr.name); 114 114 115 115 platform_set_drvdata(plat_dev, rtc); 116 116 117 117 return 0; 118 - 119 - err: 120 - return err; 121 118 } 122 119 123 120 static int test_remove(struct platform_device *plat_dev)
+1 -1
drivers/rtc/rtc-x1205.c
··· 660 660 661 661 err = x1205_sysfs_register(&client->dev); 662 662 if (err) 663 - return err; 663 + dev_err(&client->dev, "Unable to create sysfs entries\n"); 664 664 665 665 return 0; 666 666 }