ACPI: battery: create alarm sysfs attribute atomically
Let the power supply core register the attribute. This ensures that the attribute is created before the device is announced to userspace, avoid a race condition. Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
aa53266307
commit
a231eed10e
@ -678,12 +678,18 @@ static ssize_t acpi_battery_alarm_store(struct device *dev,
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct device_attribute alarm_attr = {
|
static struct device_attribute alarm_attr = {
|
||||||
.attr = {.name = "alarm", .mode = 0644},
|
.attr = {.name = "alarm", .mode = 0644},
|
||||||
.show = acpi_battery_alarm_show,
|
.show = acpi_battery_alarm_show,
|
||||||
.store = acpi_battery_alarm_store,
|
.store = acpi_battery_alarm_store,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct attribute *acpi_battery_attrs[] = {
|
||||||
|
&alarm_attr.attr,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
ATTRIBUTE_GROUPS(acpi_battery);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The Battery Hooking API
|
* The Battery Hooking API
|
||||||
*
|
*
|
||||||
@ -823,7 +829,10 @@ static void __exit battery_hook_exit(void)
|
|||||||
|
|
||||||
static int sysfs_add_battery(struct acpi_battery *battery)
|
static int sysfs_add_battery(struct acpi_battery *battery)
|
||||||
{
|
{
|
||||||
struct power_supply_config psy_cfg = { .drv_data = battery, };
|
struct power_supply_config psy_cfg = {
|
||||||
|
.drv_data = battery,
|
||||||
|
.attr_grp = acpi_battery_groups,
|
||||||
|
};
|
||||||
bool full_cap_broken = false;
|
bool full_cap_broken = false;
|
||||||
|
|
||||||
if (!ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity) &&
|
if (!ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity) &&
|
||||||
@ -868,7 +877,7 @@ static int sysfs_add_battery(struct acpi_battery *battery)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
battery_hook_add_battery(battery);
|
battery_hook_add_battery(battery);
|
||||||
return device_create_file(&battery->bat->dev, &alarm_attr);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sysfs_remove_battery(struct acpi_battery *battery)
|
static void sysfs_remove_battery(struct acpi_battery *battery)
|
||||||
@ -879,7 +888,6 @@ static void sysfs_remove_battery(struct acpi_battery *battery)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
battery_hook_remove_battery(battery);
|
battery_hook_remove_battery(battery);
|
||||||
device_remove_file(&battery->bat->dev, &alarm_attr);
|
|
||||||
power_supply_unregister(battery->bat);
|
power_supply_unregister(battery->bat);
|
||||||
battery->bat = NULL;
|
battery->bat = NULL;
|
||||||
mutex_unlock(&battery->sysfs_lock);
|
mutex_unlock(&battery->sysfs_lock);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user