aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/battery.c
diff options
context:
space:
mode:
authorLan Tianyu <tianyu.lan@intel.com>2011-06-29 23:34:12 -0400
committerLen Brown <len.brown@intel.com>2011-07-14 00:06:19 -0400
commit9c921c22a7f33397a6774d7fa076db9b6a0fd669 (patch)
treeca32ce369889d8a2f0b2e5f242dd0dd670ca3376 /drivers/acpi/battery.c
parent6e17fb6aa1a67afa1827ae317c3594040f055730 (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>
Diffstat (limited to 'drivers/acpi/battery.c')
-rw-r--r--drivers/acpi/battery.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index 4ba339d0ea1..40bf01d42cc 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
574static void sysfs_remove_battery(struct acpi_battery *battery) 574static 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/*