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 | 5d99a8b814abd76e89ef2cf90e29bbb879d6d66c (patch) | |
tree | 6ff4df159debb0e990f6ff1eabdf12ff8c4b0ce2 /sound | |
parent | 43691da4cefcf0d0dd6432f9e7e0dba902b59597 (diff) | |
download | lwn-5d99a8b814abd76e89ef2cf90e29bbb879d6d66c.tar.gz lwn-5d99a8b814abd76e89ef2cf90e29bbb879d6d66c.zip |
SOUND: 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: Jaroslav Kysela <perex@perex.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/sound.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/sound/core/sound.c b/sound/core/sound.c index 812f91b3de5b..6c8ab48c689a 100644 --- a/sound/core/sound.c +++ b/sound/core/sound.c @@ -259,8 +259,9 @@ int snd_register_device_for_dev(int type, struct snd_card *card, int dev, return minor; } snd_minors[minor] = preg; - preg->dev = device_create(sound_class, device, MKDEV(major, minor), - "%s", name); + preg->dev = device_create_drvdata(sound_class, device, + MKDEV(major, minor), + private_data, "%s", name); if (IS_ERR(preg->dev)) { snd_minors[minor] = NULL; mutex_unlock(&sound_mutex); @@ -269,9 +270,6 @@ int snd_register_device_for_dev(int type, struct snd_card *card, int dev, return minor; } - if (preg->dev) - dev_set_drvdata(preg->dev, private_data); - mutex_unlock(&sound_mutex); return 0; } |