linux/drivers/power
NeilBrown b02f8bede2 W1: split master mutex to avoid deadlocks.
The 'mutex' in struct w1_master is use for two very different
purposes.

Firstly it protects various data structures such as the list of all
slaves.

Secondly it protects the w1 buss against concurrent accesses.

This can lead to deadlocks when the ->probe code called while adding a
slave needs to talk on the bus, as is the case for power_supply
devices.
ds2780 and ds2781 drivers contain a work around to track which
process hold the lock simply to avoid this deadlock.  bq27000 doesn't
have that work around and so deadlocks.

There are other possible deadlocks involving sysfs.
When removing a device the sysfs s_active lock is held, so the lock
that protects the slave list must take precedence over s_active.
However when access power_supply attributes via sysfs, the s_active
lock must take precedence over the lock that protects accesses to
the bus.

So to avoid deadlocks between w1 slaves and sysfs, these must be
two separate locks.  Making them separate means that the work around
in ds2780 and ds2781 can be removed.

So this patch:
 - adds a new mutex: "bus_mutex" which serialises access to the bus.
 - takes in mutex in w1_search and ds1wm_search while they access
   the bus for searching.  The mutex is dropped before calling the
   callback which adds the slave.
 - changes all slaves to use bus_mutex instead of mutex to
   protect access to the bus
 - removes w1_ds2790_io_nolock and w1_ds2781_io_nolock, and the
   related code from drivers/power/ds278[01]_battery.c which
   calls them.

Signed-off-by: NeilBrown <neilb@suse.de>
Acked-by: Evgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2012-06-13 16:38:40 -07:00
..
ab8500_btemp.c ab8500: Clean up probe routines 2012-05-05 04:55:50 -07:00
ab8500_charger.c ab8500: Clean up probe routines 2012-05-05 04:55:50 -07:00
ab8500_fg.c ab8500: Clean up probe routines 2012-05-05 04:55:50 -07:00
abx500_chargalg.c ab8500: Turn unneeded global symbols into local ones 2012-03-26 20:41:14 +04:00
apm_power.c device.h: cleanup users outside of linux/include (C files) 2012-03-11 14:27:37 -04:00
bq27x00_battery.c Merge branch 'master' into for-next 2012-04-08 21:48:52 +02:00
charger-manager.c charger-manager: Provide cm_notify_event function for in-kernel use 2012-05-05 19:51:58 -07:00
collie_battery.c Merge git://git.infradead.org/users/cbou/battery-urgent 2012-01-10 20:55:11 +04:00
da9030_battery.c power_supply: Convert drivers/power/* to use module_platform_driver() 2012-01-04 09:12:07 +04:00
da9052-battery.c da9052-battery: Convert to use module_platform_driver 2012-03-26 20:41:17 +04:00
ds2760_battery.c module_param: make bool parameters really bool (drivers & misc) 2012-01-13 09:32:20 +10:30
ds2780_battery.c W1: split master mutex to avoid deadlocks. 2012-06-13 16:38:40 -07:00
ds2781_battery.c W1: split master mutex to avoid deadlocks. 2012-06-13 16:38:40 -07:00
ds2782_battery.c power_supply: Convert i2c drivers to module_i2c_driver 2012-03-26 20:41:22 +04:00
gpio-charger.c power_supply: Convert drivers/power/* to use module_platform_driver() 2012-01-04 09:12:07 +04:00
intel_mid_battery.c power_supply: Convert drivers/power/* to use module_platform_driver() 2012-01-04 09:12:07 +04:00
isp1704_charger.c isp1704_charger: Use after free on probe error 2012-05-05 20:02:35 -07:00
jz4740-battery.c jz4740-battery: Fix signedness bug 2012-01-06 05:57:17 +04:00
Kconfig max17042_battery: Add support for max17047/50 chip 2012-05-05 20:28:11 -07:00
lp8727_charger.c power_supply: Convert i2c drivers to module_i2c_driver 2012-03-26 20:41:22 +04:00
Makefile Various small bugfixes and enhancements, plus two new drivers: 2012-03-30 16:09:02 -07:00
max8903_charger.c power_supply: Convert drivers/power/* to use module_platform_driver() 2012-01-04 09:12:07 +04:00
max8925_power.c power_supply: Convert drivers/power/* to use module_platform_driver() 2012-01-04 09:12:07 +04:00
max8997_charger.c max8997_charger: Remove duplicate module.h 2012-01-06 04:59:25 +04:00
max8998_charger.c Revert "max8998_charger: Include linux/module.h just once" 2012-03-26 20:41:27 +04:00
max17040_battery.c power_supply: Convert i2c drivers to module_i2c_driver 2012-03-26 20:41:22 +04:00
max17042_battery.c max17042_battery: Add support for max17047/50 chip 2012-05-05 20:28:11 -07:00
olpc_battery.c power_supply: Convert drivers/power/* to use module_platform_driver() 2012-01-04 09:12:07 +04:00
pcf50633-charger.c power_supply: Convert drivers/power/* to use module_platform_driver() 2012-01-04 09:12:07 +04:00
pda_power.c power_supply: Convert all users to new usb_phy 2012-02-13 13:53:21 +02:00
pmu_battery.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
power_supply_core.c power_supply: Drop usage of nowarn variant of sysfs_create_link() 2012-01-07 15:24:51 +04:00
power_supply_leds.c device.h: cleanup users outside of linux/include (C files) 2012-03-11 14:27:37 -04:00
power_supply_sysfs.c power_supply: Add voltage_ocv property and use it for max17042 driver 2012-05-04 20:44:29 -07:00
power_supply.h device.h: cleanup users outside of linux/include (C files) 2012-03-11 14:27:37 -04:00
s3c_adc_battery.c s3c_adc_battery: Average over more than one adc sample 2012-01-06 06:13:35 +04:00
sbs-battery.c sbs-battery.c: Capacity attr = remaining relative capacity 2012-05-05 20:05:07 -07:00
smb347-charger.c smb347-charger: Include missing <linux/err.h> 2012-05-18 17:15:48 -07:00
test_power.c power: Make test_power driver more dynamic. 2011-05-20 19:25:08 +04:00
tosa_battery.c power_supply: Convert drivers/power/* to use module_platform_driver() 2012-01-04 09:12:07 +04:00
twl4030_charger.c power_supply: Convert all users to new usb_phy 2012-02-13 13:53:21 +02:00
wm97xx_battery.c wm97xx_battery: Use DEFINE_MUTEX() for work_lock 2012-01-06 05:00:30 +04:00
wm831x_backup.c power_supply: Convert drivers/power/* to use module_platform_driver() 2012-01-04 09:12:07 +04:00
wm831x_power.c mfd: Convert wm831x to irq_domain 2012-05-20 17:27:07 +02:00
wm8350_power.c power_supply: Convert drivers/power/* to use module_platform_driver() 2012-01-04 09:12:07 +04:00
z2_battery.c power_supply: Convert i2c drivers to module_i2c_driver 2012-03-26 20:41:22 +04:00