Commit 3d6b88b3423115d32d60531413b1fb83f462c1d1

Authored by Johan Hovold
Committed by Greg Kroah-Hartman
1 parent 72d8d4dd17

gpio: sysfs: fix gpio-chip device-attribute leak

commit 121b6a79955a3a3fd7bbb9b8cb88d5b9dad6283d upstream.

The gpio-chip device attributes were never destroyed when the device was
removed.

Fix by using device_create_with_groups() to create the device attributes
of the chip class device.

Note that this also fixes the attribute-creation race with userspace.

Fixes: d8f388d8dc8d ("gpio: sysfs interface")
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Showing 1 changed file with 8 additions and 11 deletions Side-by-side Diff

drivers/gpio/gpiolib-sysfs.c
... ... @@ -400,17 +400,14 @@
400 400 }
401 401 static DEVICE_ATTR(ngpio, 0444, chip_ngpio_show, NULL);
402 402  
403   -static const struct attribute *gpiochip_attrs[] = {
  403 +static struct attribute *gpiochip_attrs[] = {
404 404 &dev_attr_base.attr,
405 405 &dev_attr_label.attr,
406 406 &dev_attr_ngpio.attr,
407 407 NULL,
408 408 };
  409 +ATTRIBUTE_GROUPS(gpiochip);
409 410  
410   -static const struct attribute_group gpiochip_attr_group = {
411   - .attrs = (struct attribute **) gpiochip_attrs,
412   -};
413   -
414 411 /*
415 412 * /sys/class/gpio/export ... write-only
416 413 * integer N ... number of GPIO to export (full access)
417 414  
... ... @@ -750,13 +747,13 @@
750 747  
751 748 /* use chip->base for the ID; it's already known to be unique */
752 749 mutex_lock(&sysfs_lock);
753   - dev = device_create(&gpio_class, chip->dev, MKDEV(0, 0), chip,
754   - "gpiochip%d", chip->base);
755   - if (!IS_ERR(dev)) {
756   - status = sysfs_create_group(&dev->kobj,
757   - &gpiochip_attr_group);
758   - } else
  750 + dev = device_create_with_groups(&gpio_class, chip->dev, MKDEV(0, 0),
  751 + chip, gpiochip_groups,
  752 + "gpiochip%d", chip->base);
  753 + if (IS_ERR(dev))
759 754 status = PTR_ERR(dev);
  755 + else
  756 + status = 0;
760 757 chip->exported = (status == 0);
761 758 mutex_unlock(&sysfs_lock);
762 759