diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2008-05-16 17:55:12 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-05-20 13:31:55 -0700 |
commit | 43691da4cefcf0d0dd6432f9e7e0dba902b59597 (patch) | |
tree | 515f8f2088b674f4e71d7286746a7e7f0e9317e1 | |
parent | 54d29ad33e3483bcc7ca433a21cf294854e5154a (diff) | |
download | op-kernel-dev-43691da4cefcf0d0dd6432f9e7e0dba902b59597.zip op-kernel-dev-43691da4cefcf0d0dd6432f9e7e0dba902b59597.tar.gz |
UIO: fix race in device_create
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>
-rw-r--r-- | drivers/uio/uio.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c index 55cc7b8..0a12e90 100644 --- a/drivers/uio/uio.c +++ b/drivers/uio/uio.c @@ -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) |