Parcourir la source

iwlwifi: fix oops in iwl3945_led_brightness_set

fix race between:
ieee80211_open->ieee80211_led_radio->led_trigger_event->led_set_brightness->iwl3945_led_brightness_set
(which assumes that "led->priv" is not NULL)
and
iwl3945_pci_probe->iwl3945_setup_deferred_work->(...)->iwl3945_bg_alive_start->iwl3945_alive_start->iwl3945_led_register->iwl3945_led_register_led
which sets priv field in struct iwl3945_led
after
led->led_dev.brightness_set = iwl3945_led_brightness_set;
(...)
led_classdev_register(device, &led->led_dev);

http://kerneloops.org/guilty.php?guilty=iwl3945_led_brightness_set&version=2.6.25-release&start=1671168&end=1703935&class=oops

Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
Cc: Zhu Yi <yi.zhu@intel.com>
Cc: Reinette Chatre <reinette.chatre@intel.com>
Cc: Tomas Winkler <tomas.winkler@intel.com>
Cc: linux-wireless@vger.kernel.org
Cc: ipw3945-devel@lists.sourceforge.net
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Marcin Slusarz il y a 17 ans
Parent
commit
b6b16196b0
1 fichiers modifiés avec 3 ajouts et 2 suppressions
  1. 3 2
      drivers/net/wireless/iwlwifi/iwl-3945-led.c

+ 3 - 2
drivers/net/wireless/iwlwifi/iwl-3945-led.c

@@ -229,14 +229,15 @@ static int iwl3945_led_register_led(struct iwl3945_priv *priv,
 	led->led_dev.brightness_set = iwl3945_led_brightness_set;
 	led->led_dev.brightness_set = iwl3945_led_brightness_set;
 	led->led_dev.default_trigger = trigger;
 	led->led_dev.default_trigger = trigger;
 
 
+	led->priv = priv;
+	led->type = type;
+
 	ret = led_classdev_register(device, &led->led_dev);
 	ret = led_classdev_register(device, &led->led_dev);
 	if (ret) {
 	if (ret) {
 		IWL_ERROR("Error: failed to register led handler.\n");
 		IWL_ERROR("Error: failed to register led handler.\n");
 		return ret;
 		return ret;
 	}
 	}
 
 
-	led->priv = priv;
-	led->type = type;
 	led->registered = 1;
 	led->registered = 1;
 
 
 	if (set_led && led->led_on)
 	if (set_led && led->led_on)