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

leds: lm3533: fix attribute-creation race

Use the attribute groups of the led-class to create the attributes
during probe in order to avoid racing with userspace.

Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Bryan Wu <cooloney@gmail.com>

authored by

Johan Hovold and committed by
Bryan Wu
9db93860 74c85039

+8 -12
+8 -12
drivers/leds/leds-lm3533.c
··· 645 645 .attrs = lm3533_led_attributes 646 646 }; 647 647 648 + static const struct attribute_group *lm3533_led_attribute_groups[] = { 649 + &lm3533_led_attribute_group, 650 + NULL 651 + }; 652 + 648 653 static int lm3533_led_setup(struct lm3533_led *led, 649 654 struct lm3533_led_platform_data *pdata) 650 655 { ··· 697 692 led->cdev.brightness_get = lm3533_led_get; 698 693 led->cdev.blink_set = lm3533_led_blink_set; 699 694 led->cdev.brightness = LED_OFF; 695 + led->cdev.groups = lm3533_led_attribute_groups, 700 696 led->id = pdev->id; 701 697 702 698 mutex_init(&led->mutex); ··· 721 715 722 716 led->cb.dev = led->cdev.dev; 723 717 724 - ret = sysfs_create_group(&led->cdev.dev->kobj, 725 - &lm3533_led_attribute_group); 726 - if (ret < 0) { 727 - dev_err(&pdev->dev, "failed to create sysfs attributes\n"); 728 - goto err_unregister; 729 - } 730 - 731 718 ret = lm3533_led_setup(led, pdata); 732 719 if (ret) 733 - goto err_sysfs_remove; 720 + goto err_unregister; 734 721 735 722 ret = lm3533_ctrlbank_enable(&led->cb); 736 723 if (ret) 737 - goto err_sysfs_remove; 724 + goto err_unregister; 738 725 739 726 return 0; 740 727 741 - err_sysfs_remove: 742 - sysfs_remove_group(&led->cdev.dev->kobj, &lm3533_led_attribute_group); 743 728 err_unregister: 744 729 led_classdev_unregister(&led->cdev); 745 730 flush_work(&led->work); ··· 745 748 dev_dbg(&pdev->dev, "%s\n", __func__); 746 749 747 750 lm3533_ctrlbank_disable(&led->cb); 748 - sysfs_remove_group(&led->cdev.dev->kobj, &lm3533_led_attribute_group); 749 751 led_classdev_unregister(&led->cdev); 750 752 flush_work(&led->work); 751 753