Commit f38092b5 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6

* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6:
  Battery: sysfs_remove_battery(): possible circular locking
parents 4b00e4b3 5389102e
...@@ -99,6 +99,7 @@ enum { ...@@ -99,6 +99,7 @@ enum {
struct acpi_battery { struct acpi_battery {
struct mutex lock; struct mutex lock;
struct mutex sysfs_lock;
struct power_supply bat; struct power_supply bat;
struct acpi_device *device; struct acpi_device *device;
struct notifier_block pm_nb; struct notifier_block pm_nb;
...@@ -573,16 +574,16 @@ static int sysfs_add_battery(struct acpi_battery *battery) ...@@ -573,16 +574,16 @@ static int sysfs_add_battery(struct acpi_battery *battery)
static void sysfs_remove_battery(struct acpi_battery *battery) static void sysfs_remove_battery(struct acpi_battery *battery)
{ {
mutex_lock(&battery->lock); mutex_lock(&battery->sysfs_lock);
if (!battery->bat.dev) { if (!battery->bat.dev) {
mutex_unlock(&battery->lock); mutex_unlock(&battery->sysfs_lock);
return; return;
} }
device_remove_file(battery->bat.dev, &alarm_attr); device_remove_file(battery->bat.dev, &alarm_attr);
power_supply_unregister(&battery->bat); power_supply_unregister(&battery->bat);
battery->bat.dev = NULL; battery->bat.dev = NULL;
mutex_unlock(&battery->lock); mutex_unlock(&battery->sysfs_lock);
} }
/* /*
...@@ -982,6 +983,7 @@ static int acpi_battery_add(struct acpi_device *device) ...@@ -982,6 +983,7 @@ static int acpi_battery_add(struct acpi_device *device)
strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS); strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS);
device->driver_data = battery; device->driver_data = battery;
mutex_init(&battery->lock); mutex_init(&battery->lock);
mutex_init(&battery->sysfs_lock);
if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle, if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle,
"_BIX", &handle))) "_BIX", &handle)))
set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags);
...@@ -1010,6 +1012,7 @@ static int acpi_battery_add(struct acpi_device *device) ...@@ -1010,6 +1012,7 @@ static int acpi_battery_add(struct acpi_device *device)
fail: fail:
sysfs_remove_battery(battery); sysfs_remove_battery(battery);
mutex_destroy(&battery->lock); mutex_destroy(&battery->lock);
mutex_destroy(&battery->sysfs_lock);
kfree(battery); kfree(battery);
return result; return result;
} }
...@@ -1027,6 +1030,7 @@ static int acpi_battery_remove(struct acpi_device *device, int type) ...@@ -1027,6 +1030,7 @@ static int acpi_battery_remove(struct acpi_device *device, int type)
#endif #endif
sysfs_remove_battery(battery); sysfs_remove_battery(battery);
mutex_destroy(&battery->lock); mutex_destroy(&battery->lock);
mutex_destroy(&battery->sysfs_lock);
kfree(battery); kfree(battery);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment