Power Supply: fix race in device_create
authorGreg Kroah-Hartman <gregkh@suse.de>
Sat, 17 May 2008 00:55:12 +0000 (17:55 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 20 May 2008 20:31:55 +0000 (13:31 -0700)
There is a race from when a device is created with device_create() and
then the drvdata is set with a call to dev_set_drvdata() in which a
sysfs file could be open, yet the drvdata will be NULL, causing all
sorts of bad things to happen.

This patch fixes the problem by using the new function,
device_create_drvdata().

Cc: Kay Sievers <kay.sievers@vrfy.org>
Cc: Anton Vorontsov <cbou@mail.ru>
Cc: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/power/power_supply_core.c

index 138dd76ee347b005aaf21b01f3b68a0869731045..af1633eb3b707c9c53c50e578f0ed5859ee69d96 100644 (file)
@@ -91,15 +91,13 @@ int power_supply_register(struct device *parent, struct power_supply *psy)
 {
        int rc = 0;
 
-       psy->dev = device_create(power_supply_class, parent, 0,
-                                "%s", psy->name);
+       psy->dev = device_create_drvdata(power_supply_class, parent, 0,
+                                        psy, "%s", psy->name);
        if (IS_ERR(psy->dev)) {
                rc = PTR_ERR(psy->dev);
                goto dev_create_failed;
        }
 
-       dev_set_drvdata(psy->dev, psy);
-
        INIT_WORK(&psy->changed_work, power_supply_changed_work);
 
        rc = power_supply_create_attrs(psy);