lkml.org 
[lkml]   [2014]   [Jun]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 13/13] leds: lp55xx-common: fix attribute-creation race
    Date
    Use the attribute groups of the led-class to create the LED attributes
    during probe in order to avoid racing with userspace.

    Signed-off-by: Johan Hovold <johan@kernel.org>
    ---
    drivers/leds/leds-lp55xx-common.c | 22 +++-------------------
    1 file changed, 3 insertions(+), 19 deletions(-)

    diff --git a/drivers/leds/leds-lp55xx-common.c b/drivers/leds/leds-lp55xx-common.c
    index 3fbfb31602c7..77c26bc32eed 100644
    --- a/drivers/leds/leds-lp55xx-common.c
    +++ b/drivers/leds/leds-lp55xx-common.c
    @@ -127,15 +127,12 @@ static DEVICE_ATTR(led_current, S_IRUGO | S_IWUSR, lp55xx_show_current,
    lp55xx_store_current);
    static DEVICE_ATTR(max_current, S_IRUGO , lp55xx_show_max_current, NULL);

    -static struct attribute *lp55xx_led_attributes[] = {
    +static struct attribute *lp55xx_led_attrs[] = {
    &dev_attr_led_current.attr,
    &dev_attr_max_current.attr,
    NULL,
    };
    -
    -static struct attribute_group lp55xx_led_attr_group = {
    - .attrs = lp55xx_led_attributes
    -};
    +ATTRIBUTE_GROUPS(lp55xx_led);

    static void lp55xx_set_brightness(struct led_classdev *cdev,
    enum led_brightness brightness)
    @@ -176,6 +173,7 @@ static int lp55xx_init_led(struct lp55xx_led *led,
    }

    led->cdev.brightness_set = lp55xx_set_brightness;
    + led->cdev.groups = lp55xx_led_groups;

    if (pdata->led_config[chan].name) {
    led->cdev.name = pdata->led_config[chan].name;
    @@ -185,24 +183,12 @@ static int lp55xx_init_led(struct lp55xx_led *led,
    led->cdev.name = name;
    }

    - /*
    - * register led class device for each channel and
    - * add device attributes
    - */
    -
    ret = led_classdev_register(dev, &led->cdev);
    if (ret) {
    dev_err(dev, "led register err: %d\n", ret);
    return ret;
    }

    - ret = sysfs_create_group(&led->cdev.dev->kobj, &lp55xx_led_attr_group);
    - if (ret) {
    - dev_err(dev, "led sysfs err: %d\n", ret);
    - led_classdev_unregister(&led->cdev);
    - return ret;
    - }
    -
    return 0;
    }

    @@ -520,8 +506,6 @@ void lp55xx_unregister_leds(struct lp55xx_led *led, struct lp55xx_chip *chip)

    for (i = 0; i < chip->num_leds; i++) {
    each = led + i;
    - sysfs_remove_group(&each->cdev.dev->kobj,
    - &lp55xx_led_attr_group);
    led_classdev_unregister(&each->cdev);
    flush_work(&each->brightness_work);
    }
    --
    1.8.5.5


    \
     
     \ /
      Last update: 2014-06-25 23:21    [W:2.989 / U:0.264 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site