lkml.org 
[lkml]   [2011]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[156/262] drivers/power/ds2780_battery.c: fix deadlock upon insertion and removal
    3.0-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Clifton Barnes <cabarnes@indesign-llc.com>

    commit 0e053fcbbbc4d945247cb32cad2767b483cb65f8 upstream.

    Fixes the deadlock when inserting and removing the ds2780.

    Signed-off-by: Clifton Barnes <cabarnes@indesign-llc.com>
    Cc: Evgeniy Polyakov <zbr@ioremap.net>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/power/ds2780_battery.c | 9 +++++++++
    1 file changed, 9 insertions(+)

    --- a/drivers/power/ds2780_battery.c
    +++ b/drivers/power/ds2780_battery.c
    @@ -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_po
    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_prob
    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_prob
    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_remo
    {
    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);




    \
     
     \ /
      Last update: 2011-11-10 04:37    [W:4.194 / U:0.244 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site