UIO: 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: Hans J. Koch <hjk@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/uio/uio.c

index 55cc7b80422a0617dab71e8adbf34c9d854cc5ac..0a12e90ad41640d15c584cfd313fa9746563c2b3 100644 (file)
@@ -649,15 +649,14 @@ int __uio_register_device(struct module *owner,
        if (ret)
                goto err_get_minor;
 
-       idev->dev = device_create(uio_class->class, parent,
-                                 MKDEV(uio_major, idev->minor),
-                                 "uio%d", idev->minor);
+       idev->dev = device_create_drvdata(uio_class->class, parent,
+                                         MKDEV(uio_major, idev->minor), idev,
+                                         "uio%d", idev->minor);
        if (IS_ERR(idev->dev)) {
                printk(KERN_ERR "UIO: device register failed\n");
                ret = PTR_ERR(idev->dev);
                goto err_device_create;
        }
-       dev_set_drvdata(idev->dev, idev);
 
        ret = uio_dev_add_attributes(idev);
        if (ret)