Commit 97774672573ac4355bd12cf84b202555c1131b69
1 parent
f722e17fdb
Exists in
master
and in
7 other branches
power_supply: Initialize changed_work before calling device_add
Calling device_add causes an inital uevent for that device to be generated. The power_supply uevent function calls the drivers get_property function, which might causes the driver to update its state, which again might causes the driver to call power_supply_changed(). Since the power_supplys changed_work has not been initialized at this point the behavior is undefined and can result in an OOPS. This patch fixes the issue by initializing the power_supplys changed_work prior to adding the power_supplys device to the device tree. Reported-by: Grazvydas Ignotas <notasas@gmail.com> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Tested-by: Grazvydas Ignotas <notasas@gmail.com>
Showing 1 changed file with 2 additions and 2 deletions Side-by-side Diff
drivers/power/power_supply_core.c
... | ... | @@ -171,6 +171,8 @@ |
171 | 171 | dev_set_drvdata(dev, psy); |
172 | 172 | psy->dev = dev; |
173 | 173 | |
174 | + INIT_WORK(&psy->changed_work, power_supply_changed_work); | |
175 | + | |
174 | 176 | rc = kobject_set_name(&dev->kobj, "%s", psy->name); |
175 | 177 | if (rc) |
176 | 178 | goto kobject_set_name_failed; |
... | ... | @@ -178,8 +180,6 @@ |
178 | 180 | rc = device_add(dev); |
179 | 181 | if (rc) |
180 | 182 | goto device_add_failed; |
181 | - | |
182 | - INIT_WORK(&psy->changed_work, power_supply_changed_work); | |
183 | 183 | |
184 | 184 | rc = power_supply_create_triggers(psy); |
185 | 185 | if (rc) |