linux/drivers/leds
Sasha Levin 14f5716bc2 leds: make sure we unregister a trigger only once
Currently, we may attempt to unregister a trigger more than once, for
example when we receive two consecutive reboot notifications, or when
we do a regular unregistration plus reboot notification.

This leads to the following error since we try to delete the list node
twice:

[ 2780.254922] WARNING: CPU: 0 PID: 13764 at lib/list_debug.c:53 __list_del_entry+0x3e/0xe0()
[ 2780.265559] list_del corruption, ffffffffa5eb6470->next is LIST_POISON1 (dead000000100100)
[ 2780.271710] Modules linked in:
[ 2780.274156] CPU: 0 PID: 13764 Comm: kworker/0:2 Tainted: G        W     3.14.0-next-20140403-sasha-00012-gef5fa7d-dirty #373
[ 2780.283063] Workqueue: events do_poweroff
[ 2780.285644]  0000000000000009 ffff8800330dbb38 ffffffffa34bfa33 0000000000002fe0
[ 2780.291571]  ffff8800330dbb88 ffff8800330dbb78 ffffffffa015a37c ffff8800330dbb68
[ 2780.296670]  ffffffffa5eb6470 0000000000000000 ffffffffa5eb6400 ffffffffa5ad7430
[ 2780.299756] Call Trace:
[ 2780.301530] dump_stack (lib/dump_stack.c:52)
[ 2780.303802] warn_slowpath_common (kernel/panic.c:418)
[ 2780.306151] warn_slowpath_fmt (kernel/panic.c:433)
[ 2780.308156] __list_del_entry (lib/list_debug.c:51 (discriminator 1))
[ 2780.310800] list_del (lib/list_debug.c:78)
[ 2780.313175] led_trigger_unregister (drivers/leds/led-triggers.c:225)
[ 2780.315599] heartbeat_reboot_notifier (drivers/leds/trigger/ledtrig-heartbeat.c:119)
[ 2780.317247] notifier_call_chain (kernel/notifier.c:95)
[ 2780.320014] __blocking_notifier_call_chain (kernel/notifier.c:316)
[ 2780.323263] blocking_notifier_call_chain (kernel/notifier.c:326)
[ 2780.326096] kernel_power_off (include/linux/kmod.h:95 kernel/reboot.c:153 kernel/reboot.c:179)
[ 2780.327883] do_poweroff (kernel/power/poweroff.c:23)
[ 2780.330748] process_one_work (kernel/workqueue.c:2221 include/linux/jump_label.h:105 include/trace/events/workqueue.h:111 kernel/workqueue.c:2226)
[ 2780.333027] ? process_one_work (include/linux/workqueue.h:186 kernel/workqueue.c:611 kernel/workqueue.c:638 kernel/workqueue.c:2214)
[ 2780.335487] process_scheduled_works (include/linux/list.h:188 kernel/workqueue.c:2277)
[ 2780.337101] worker_thread (kernel/workqueue.c:2352)
[ 2780.338712] ? rescuer_thread (kernel/workqueue.c:2297)
[ 2780.341326] kthread (kernel/kthread.c:219)
[ 2780.343446] ? kthread_create_on_node (kernel/kthread.c:185)
[ 2780.345733] ret_from_fork (arch/x86/kernel/entry_64.S:555)
[ 2780.347168] ? kthread_create_on_node (kernel/kthread.c:185)

Prevent it by making sure we don't attempt to unregister a trigger that
is not in the triggers list.

Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
Signed-off-by: Bryan Wu <cooloney@gmail.com>
2014-04-07 14:47:25 -07:00
..
trigger ledtrig-cpu: Handle CPU hot(un)plugging 2014-02-27 09:56:54 -08:00
dell-led.c drivers/leds: Add module.h to files using it implicitly 2011-10-31 19:31:49 -04:00
Kconfig leds-ot200: Fix dependencies 2014-03-11 10:29:08 -07:00
led-class.c leds: convert class code to use dev_groups 2013-07-26 18:05:17 -07:00
led-core.c leds: Turn off led if blinking is disabled 2014-02-27 09:56:55 -08:00
led-triggers.c leds: make sure we unregister a trigger only once 2014-04-07 14:47:25 -07:00
leds-88pm860x.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-adp5520.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-asic3.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-atmel-pwm.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-bd2802.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-blinkm.c leds: blinkm: remove unnecessary spaces 2014-02-27 10:19:57 -08:00
leds-clevo-mail.c leds: clevo-mail: Make probe function __init 2014-03-13 15:53:31 -07:00
leds-cobalt-qube.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-cobalt-raq.c Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds 2012-12-15 12:52:42 -08:00
leds-da903x.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-da9052.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-dac124s085.c leds: dac124s085: Remove redundant spi_set_drvdata 2013-10-22 10:57:34 -07:00
leds-fsg.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-gpio-register.c leds: provide helper to register "leds-gpio" devices 2011-05-25 08:39:51 -07:00
leds-gpio.c leds-gpio: of: introduce MODULE_DEVICE_TABLE for module autoloading 2014-03-06 11:56:59 -08:00
leds-hp6xx.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-lm355x.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-lm3530.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-lm3533.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-lm3642.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-locomo.c drivers/leds: Add module.h to files using it implicitly 2011-10-31 19:31:49 -04:00
leds-lp55xx-common.c leds: lp5523: Support LED MUX configuration on running a pattern 2014-01-27 17:28:48 -08:00
leds-lp55xx-common.h leds: lp55xx: add common macros for device attributes 2013-08-26 17:22:12 -07:00
leds-lp3944.c leds: leds-lp3944, fix "sparse" warning "mixing different enum types" 2013-08-26 17:22:11 -07:00
leds-lp5521.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-lp5523.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-lp5562.c leds: lp5562: remove unnecessary parentheses 2014-02-27 10:17:15 -08:00
leds-lp8501.c lp5523, lp8501: comment improvements 2014-01-10 11:44:44 +01:00
leds-lp8788.c leds-lp8788: fix a parent device in _probe() 2013-02-01 17:47:05 -08:00
leds-lt3593.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-max8997.c leds: remove use of __devexit 2012-11-28 12:35:06 -08:00
leds-mc13783.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-net48xx.c leds: leds-net48xx: Use linux/io.h instead of asm/io.h 2012-11-27 14:49:28 -08:00
leds-netxbig.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-ns2.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-ot200.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-pca955x.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-pca963x.c leds-pca963x: Fix device tree parsing 2013-08-26 17:22:14 -07:00
leds-pca9532.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-pca9685.c leds: Added driver for the NXP PCA9685 I2C chip 2013-10-22 10:57:35 -07:00
leds-pwm.c leds: leds-pwm: properly clean up after probe failure 2014-04-07 14:41:50 -07:00
leds-rb532.c Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds 2012-12-15 12:52:42 -08:00
leds-regulator.c leds: use dev_get_platdata() 2013-08-26 17:22:11 -07:00
leds-s3c24xx.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-ss4200.c leds: leds-ss4200: remove __initdata marker 2014-02-28 14:34:58 -08:00
leds-sunfire.c leds: use platform_{get,set}_drvdata() 2013-06-20 16:21:33 -07:00
leds-tca6507.c drivers: leds: leds-tca6507: check CONFIG_GPIOLIB whether defined for 'gpio_base' 2014-01-27 17:28:49 -08:00
leds-wm831x-status.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-wm8350.c drivers/leds: delete non-required instances of include <linux/init.h> 2014-02-27 09:56:56 -08:00
leds-wrap.c leds: leds-wrap: Use <linux/io.h> instead of <asm/io.h> 2012-11-27 14:49:30 -08:00
leds.h leds: delay led_set_brightness if stopping soft-blink 2012-09-11 18:32:40 +08:00
Makefile leds: Added driver for the NXP PCA9685 I2C chip 2013-10-22 10:57:35 -07:00