w1: ds2780, fix deadlock upon insertion and removal
PATCH v2 3/3 w1: ds2780, fix deadlock upon insertion and removal
Fixes the deadlock when inserting and removing the ds2780.
Signed-off-by Clifton Barnes <[email protected]>
--- drivers/power/ds2780_battery.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-)
drivers/power/ds2780_battery.c +9 -0
@@ -39,6 +39,7 @@ struct ds2780_device_info {struct device *dev;struct power_supply bat;struct device *w1_dev; +struct task_struct *mutex_holder; };enum current_types {
@@ -63,6 +64,9 @@ static inline struct power_supply *to_power_supply(struct device *dev)static inline int ds2780_battery_io (struct ds2780_device_info *dev_info,char *buf,int addr,size_t count,int io) { +if (dev_info->mutex_holder == current) +return w1_ds2780_io_nolock (dev_info->w1_dev, buf, addr, count, io); +else return w1_ds2780_io (dev_info->w1_dev, buf, addr, count, io); }
@@ -775,6 +779,7 @@ static int __devinit ds2780_battery_probe(struct platform_device *pdev) dev_info->bat.properties = ds2780_battery_props; dev_info->bat.num_properties =ARRAY_SIZE (ds2780_battery_props); dev_info->bat.get_property = ds2780_battery_get_property; + dev_info->mutex_holder = current; ret =power_supply_register (&pdev->dev, &dev_info->bat);if (ret) {
@@ -804,6 +809,8 @@ static int __devinit ds2780_battery_probe(struct platform_device *pdev) goto fail_remove_bin_file; } + dev_info->mutex_holder =NULL ; +return 0 ; fail_remove_bin_file:
@@ -823,6 +830,8 @@ static int __devexit ds2780_battery_remove(struct platform_device *pdev) {struct ds2780_device_info *dev_info =platform_get_drvdata (pdev); + dev_info->mutex_holder = current; +/* remove attributes */ sysfs_remove_group (&dev_info->bat.dev->kobj, &ds2780_attr_group);
Signature · 1 line
1.7.6
Quoted 1 line · On Wed, 24 Aug 2011 10:35:33 -0400 Clifton Barnes <[email protected]>…
Fixes the deadlock when inserting and removing the ds2780.
When fixing a bug, please always provide a full description of that bug so that others can review the proposed fix. "the deadlock" is not a complete description ;)