From: Greg Kroah-Hartman Date: Tue, 27 Jan 2015 18:00:55 +0000 (-0800) Subject: 3.14-stable patches X-Git-Tag: v3.10.67~51 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0c32375c73427991664afafa1614a91ae5224e62;p=thirdparty%2Fkernel%2Fstable-queue.git 3.14-stable patches added patches: gpio-sysfs-fix-gpio-chip-device-attribute-leak.patch gpio-sysfs-fix-gpio-device-attribute-leak.patch --- diff --git a/queue-3.14/gpio-sysfs-fix-gpio-chip-device-attribute-leak.patch b/queue-3.14/gpio-sysfs-fix-gpio-chip-device-attribute-leak.patch new file mode 100644 index 00000000000..35ad17e42ec --- /dev/null +++ b/queue-3.14/gpio-sysfs-fix-gpio-chip-device-attribute-leak.patch @@ -0,0 +1,68 @@ +From 121b6a79955a3a3fd7bbb9b8cb88d5b9dad6283d Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Tue, 13 Jan 2015 13:00:04 +0100 +Subject: gpio: sysfs: fix gpio-chip device-attribute leak + +From: Johan Hovold + +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 +Signed-off-by: Linus Walleij +Signed-off-by: Greg Kroah-Hartman + + +--- + drivers/gpio/gpiolib.c | 19 ++++++++----------- + 1 file changed, 8 insertions(+), 11 deletions(-) + +--- a/drivers/gpio/gpiolib.c ++++ b/drivers/gpio/gpiolib.c +@@ -680,16 +680,13 @@ static ssize_t chip_ngpio_show(struct de + } + static DEVICE_ATTR(ngpio, 0444, chip_ngpio_show, NULL); + +-static const struct attribute *gpiochip_attrs[] = { ++static struct attribute *gpiochip_attrs[] = { + &dev_attr_base.attr, + &dev_attr_label.attr, + &dev_attr_ngpio.attr, + NULL, + }; +- +-static const struct attribute_group gpiochip_attr_group = { +- .attrs = (struct attribute **) gpiochip_attrs, +-}; ++ATTRIBUTE_GROUPS(gpiochip); + + /* + * /sys/class/gpio/export ... write-only +@@ -1030,13 +1027,13 @@ static int gpiochip_export(struct gpio_c + + /* use chip->base for the ID; it's already known to be unique */ + mutex_lock(&sysfs_lock); +- dev = device_create(&gpio_class, chip->dev, MKDEV(0, 0), chip, +- "gpiochip%d", chip->base); +- if (!IS_ERR(dev)) { +- status = sysfs_create_group(&dev->kobj, +- &gpiochip_attr_group); +- } else ++ dev = device_create_with_groups(&gpio_class, chip->dev, MKDEV(0, 0), ++ chip, gpiochip_groups, ++ "gpiochip%d", chip->base); ++ if (IS_ERR(dev)) + status = PTR_ERR(dev); ++ else ++ status = 0; + chip->exported = (status == 0); + mutex_unlock(&sysfs_lock); + diff --git a/queue-3.14/gpio-sysfs-fix-gpio-device-attribute-leak.patch b/queue-3.14/gpio-sysfs-fix-gpio-device-attribute-leak.patch new file mode 100644 index 00000000000..dd9e3caa175 --- /dev/null +++ b/queue-3.14/gpio-sysfs-fix-gpio-device-attribute-leak.patch @@ -0,0 +1,110 @@ +From 0915e6feb38de8d3601819992a5bd050201a56fa Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Tue, 13 Jan 2015 13:00:05 +0100 +Subject: gpio: sysfs: fix gpio device-attribute leak + +From: Johan Hovold + +commit 0915e6feb38de8d3601819992a5bd050201a56fa upstream. + +The gpio device attributes were never destroyed when the gpio was +unexported (or on export failures). + +Use device_create_with_groups() to create the default device attributes +of the gpio class device. Note that this also fixes the +attribute-creation race with userspace for these attributes. + +Remove contingent attributes in export error path and on unexport. + +Fixes: d8f388d8dc8d ("gpio: sysfs interface") +Signed-off-by: Johan Hovold +Signed-off-by: Linus Walleij +Signed-off-by: Greg Kroah-Hartman + + +--- + drivers/gpio/gpiolib.c | 27 +++++++++++++-------------- + 1 file changed, 13 insertions(+), 14 deletions(-) + +--- a/drivers/gpio/gpiolib.c ++++ b/drivers/gpio/gpiolib.c +@@ -408,7 +408,7 @@ static ssize_t gpio_value_store(struct d + return status; + } + +-static const DEVICE_ATTR(value, 0644, ++static DEVICE_ATTR(value, 0644, + gpio_value_show, gpio_value_store); + + static irqreturn_t gpio_sysfs_irq(int irq, void *priv) +@@ -633,18 +633,16 @@ static ssize_t gpio_active_low_store(str + return status ? : size; + } + +-static const DEVICE_ATTR(active_low, 0644, ++static DEVICE_ATTR(active_low, 0644, + gpio_active_low_show, gpio_active_low_store); + +-static const struct attribute *gpio_attrs[] = { ++static struct attribute *gpio_attrs[] = { + &dev_attr_value.attr, + &dev_attr_active_low.attr, + NULL, + }; + +-static const struct attribute_group gpio_attr_group = { +- .attrs = (struct attribute **) gpio_attrs, +-}; ++ATTRIBUTE_GROUPS(gpio); + + /* + * /sys/class/gpio/gpiochipN/ +@@ -841,18 +839,15 @@ int gpiod_export(struct gpio_desc *desc, + if (desc->chip->names && desc->chip->names[offset]) + ioname = desc->chip->names[offset]; + +- dev = device_create(&gpio_class, desc->chip->dev, MKDEV(0, 0), +- desc, ioname ? ioname : "gpio%u", +- desc_to_gpio(desc)); ++ dev = device_create_with_groups(&gpio_class, desc->chip->dev, ++ MKDEV(0, 0), desc, gpio_groups, ++ ioname ? ioname : "gpio%u", ++ desc_to_gpio(desc)); + if (IS_ERR(dev)) { + status = PTR_ERR(dev); + goto fail_unlock; + } + +- status = sysfs_create_group(&dev->kobj, &gpio_attr_group); +- if (status) +- goto fail_unregister_device; +- + if (direction_may_change) { + status = device_create_file(dev, &dev_attr_direction); + if (status) +@@ -863,13 +858,15 @@ int gpiod_export(struct gpio_desc *desc, + !test_bit(FLAG_IS_OUT, &desc->flags))) { + status = device_create_file(dev, &dev_attr_edge); + if (status) +- goto fail_unregister_device; ++ goto fail_remove_attr_direction; + } + + set_bit(FLAG_EXPORT, &desc->flags); + mutex_unlock(&sysfs_lock); + return 0; + ++fail_remove_attr_direction: ++ device_remove_file(dev, &dev_attr_direction); + fail_unregister_device: + device_unregister(dev); + fail_unlock: +@@ -994,6 +991,8 @@ void gpiod_unexport(struct gpio_desc *de + + dev = class_find_device(&gpio_class, NULL, desc, match_export); + if (dev) { ++ device_remove_file(dev, &dev_attr_edge); ++ device_remove_file(dev, &dev_attr_direction); + gpio_setup_irq(desc, dev, 0); + clear_bit(FLAG_EXPORT, &desc->flags); + } else diff --git a/queue-3.14/series b/queue-3.14/series index 86200baee11..40c40b6fc54 100644 --- a/queue-3.14/series +++ b/queue-3.14/series @@ -1 +1,2 @@ gpio-sysfs-fix-gpio-chip-device-attribute-leak.patch +gpio-sysfs-fix-gpio-device-attribute-leak.patch