From: Henrique de Moraes Holschuh Date: Tue, 22 Jul 2008 00:18:18 +0000 (-0300) Subject: rfkill: fix led-trigger unregister order in error unwind X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=37f55e9d78d1b63047b1b7ae175cdce650547ba8;p=openwrt%2Fstaging%2Fblogic.git rfkill: fix led-trigger unregister order in error unwind rfkill needs to unregister the led trigger AFTER a call to rfkill_remove_switch(), otherwise it will not update the LED state, possibly leaving it ON when it should be OFF. To make led-trigger unregistering safer, guard against unregistering a trigger twice, and also against issuing trigger events to a led trigger that was unregistered. This makes the error unwind paths more resilient. Refer to "rfkill: Register LED triggers before registering switch". Signed-off-by: Henrique de Moraes Holschuh Acked-by: Ivo van Doorn Cc: Michael Buesch Cc: Dmitry Baryshkov Signed-off-by: John W. Linville --- diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c index 022fe50ab0e0..fc3a4fd88995 100644 --- a/net/rfkill/rfkill.c +++ b/net/rfkill/rfkill.c @@ -590,8 +590,10 @@ static void rfkill_led_trigger_register(struct rfkill *rfkill) static void rfkill_led_trigger_unregister(struct rfkill *rfkill) { #ifdef CONFIG_RFKILL_LEDS - if (rfkill->led_trigger.name) + if (rfkill->led_trigger.name) { led_trigger_unregister(&rfkill->led_trigger); + rfkill->led_trigger.name = NULL; + } #endif } @@ -627,8 +629,8 @@ int rfkill_register(struct rfkill *rfkill) error = device_add(dev); if (error) { - rfkill_led_trigger_unregister(rfkill); rfkill_remove_switch(rfkill); + rfkill_led_trigger_unregister(rfkill); return error; }