From: Greg Kroah-Hartman Date: Tue, 27 Jan 2015 18:00:48 +0000 (-0800) Subject: 3.10-stable patches X-Git-Tag: v3.10.67~52 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=17f4de3bcf4a1aa907cdc748303f6eab6981dcf0;p=thirdparty%2Fkernel%2Fstable-queue.git 3.10-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.10/gpio-sysfs-fix-gpio-chip-device-attribute-leak.patch b/queue-3.10/gpio-sysfs-fix-gpio-chip-device-attribute-leak.patch new file mode 100644 index 00000000000..b8f620a6fa4 --- /dev/null +++ b/queue-3.10/gpio-sysfs-fix-gpio-chip-device-attribute-leak.patch @@ -0,0 +1,56 @@ +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 | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- a/drivers/gpio/gpiolib.c ++++ b/drivers/gpio/gpiolib.c +@@ -627,7 +627,7 @@ 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, +@@ -635,7 +635,7 @@ static const struct attribute *gpiochip_ + }; + + static const struct attribute_group gpiochip_attr_group = { +- .attrs = (struct attribute **) gpiochip_attrs, ++ .attrs = gpiochip_attrs, + }; + + /* +@@ -1036,6 +1036,7 @@ static void gpiochip_unexport(struct gpi + mutex_lock(&sysfs_lock); + dev = class_find_device(&gpio_class, NULL, chip, match_export); + if (dev) { ++ sysfs_remove_group(&dev->kobj, &gpiochip_attr_group); + put_device(dev); + device_unregister(dev); + chip->exported = 0; diff --git a/queue-3.10/gpio-sysfs-fix-gpio-device-attribute-leak.patch b/queue-3.10/gpio-sysfs-fix-gpio-device-attribute-leak.patch new file mode 100644 index 00000000000..febb420174f --- /dev/null +++ b/queue-3.10/gpio-sysfs-fix-gpio-device-attribute-leak.patch @@ -0,0 +1,100 @@ +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") +Cc: stable # v2.6.27+ +Signed-off-by: Johan Hovold +Signed-off-by: Linus Walleij +[johan: fix leaks without device_create_with_groups, which wasn't +introduced until 3.11 ] +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpio/gpiolib.c | 19 +++++++++++++------ + 1 file changed, 13 insertions(+), 6 deletions(-) + +--- a/drivers/gpio/gpiolib.c ++++ b/drivers/gpio/gpiolib.c +@@ -362,7 +362,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) +@@ -580,17 +580,17 @@ 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, ++ .attrs = gpio_attrs, + }; + + /* +@@ -806,20 +806,24 @@ static int gpiod_export(struct gpio_desc + if (direction_may_change) { + status = device_create_file(dev, &dev_attr_direction); + if (status) +- goto fail_unregister_device; ++ goto fail_remove_attr_group; + } + + if (gpiod_to_irq(desc) >= 0 && (direction_may_change || + !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_remove_attr_group: ++ sysfs_remove_group(&dev->kobj, &gpio_attr_group); + fail_unregister_device: + device_unregister(dev); + fail_unlock: +@@ -962,6 +966,9 @@ static void gpiod_unexport(struct gpio_d + + 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); ++ sysfs_remove_group(&dev->kobj, &gpio_attr_group); + gpio_setup_irq(desc, dev, 0); + clear_bit(FLAG_EXPORT, &desc->flags); + } else diff --git a/queue-3.10/series b/queue-3.10/series new file mode 100644 index 00000000000..40c40b6fc54 --- /dev/null +++ b/queue-3.10/series @@ -0,0 +1,2 @@ +gpio-sysfs-fix-gpio-chip-device-attribute-leak.patch +gpio-sysfs-fix-gpio-device-attribute-leak.patch diff --git a/queue-3.14/series b/queue-3.14/series new file mode 100644 index 00000000000..86200baee11 --- /dev/null +++ b/queue-3.14/series @@ -0,0 +1 @@ +gpio-sysfs-fix-gpio-chip-device-attribute-leak.patch diff --git a/queue-3.18/series b/queue-3.18/series new file mode 100644 index 00000000000..e69de29bb2d