diff options
| author | Lan Tianyu <tianyu.lan@intel.com> | 2011-06-29 23:34:12 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2011-07-14 00:06:19 -0400 |
| commit | 9c921c22a7f33397a6774d7fa076db9b6a0fd669 (patch) | |
| tree | ca32ce369889d8a2f0b2e5f242dd0dd670ca3376 | |
| parent | 6e17fb6aa1a67afa1827ae317c3594040f055730 (diff) | |
ACPI / Battery: Resolve the race condition in the sysfs_remove_battery()
Use battery->lock in sysfs_remove_battery() to make
checking, removing, and clearing bat.dev atomic.
This is necessary because sysfs_remove_battery() may
be invoked concurrently from different paths.
https://bugzilla.kernel.org/show_bug.cgi?id=35642
Signed-off-by: Lan Tianyu <tianyu.lan@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
| -rw-r--r-- | drivers/acpi/battery.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 4ba339d0ea19..40bf01d42cc3 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
| @@ -573,11 +573,16 @@ static int sysfs_add_battery(struct acpi_battery *battery) | |||
| 573 | 573 | ||
| 574 | static void sysfs_remove_battery(struct acpi_battery *battery) | 574 | static void sysfs_remove_battery(struct acpi_battery *battery) |
| 575 | { | 575 | { |
| 576 | if (!battery->bat.dev) | 576 | mutex_lock(&battery->lock); |
| 577 | if (!battery->bat.dev) { | ||
| 578 | mutex_unlock(&battery->lock); | ||
| 577 | return; | 579 | return; |
| 580 | } | ||
| 581 | |||
| 578 | device_remove_file(battery->bat.dev, &alarm_attr); | 582 | device_remove_file(battery->bat.dev, &alarm_attr); |
| 579 | power_supply_unregister(&battery->bat); | 583 | power_supply_unregister(&battery->bat); |
| 580 | battery->bat.dev = NULL; | 584 | battery->bat.dev = NULL; |
| 585 | mutex_unlock(&battery->lock); | ||
| 581 | } | 586 | } |
| 582 | 587 | ||
| 583 | /* | 588 | /* |
