summaryrefslogtreecommitdiffstats
path: root/block/disk-events.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2023-04-15 20:23:32 +0200
committerSebastian Reichel <sebastian.reichel@collabora.com>2023-05-08 15:29:11 +0200
commit5c34c0aef185dcd10881847b9ebf20046aa77cb4 (patch)
tree72160169304a620a964924a1eef63bdc275bcb15 /block/disk-events.c
parentpower: supply: leds: Fix blink to LED on transition (diff)
downloadlinux-5c34c0aef185dcd10881847b9ebf20046aa77cb4.tar.xz
linux-5c34c0aef185dcd10881847b9ebf20046aa77cb4.zip
power: supply: bq27xxx: Fix bq27xxx_battery_update() race condition
bq27xxx_battery_update() assumes / requires that it is only run once, not multiple times at the same time. But there are 3 possible callers: 1. bq27xxx_battery_poll() delayed_work item handler 2. bq27xxx_battery_irq_handler_thread() I2C IRQ handler 3. bq27xxx_battery_setup() And there is no protection against these racing with each other, fix this race condition by making all callers take di->lock: - Rename bq27xxx_battery_update() to bq27xxx_battery_update_unlocked() - Add new bq27xxx_battery_update() which takes di->lock and then calls bq27xxx_battery_update_unlocked() - Make stale cache check code in bq27xxx_battery_get_property(), which already takes di->lock directly to check the jiffies, call bq27xxx_battery_update_unlocked() instead of messing with the delayed_work item - Make bq27xxx_battery_update_unlocked() mod the delayed-work item so that the next poll is delayed to poll_interval milliseconds after the last update independent of the source of the update Fixes: 740b755a3b34 ("bq27x00: Poll battery state") Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Diffstat (limited to 'block/disk-events.c')
0 files changed, 0 insertions, 0 deletions