summaryrefslogtreecommitdiffstats
path: root/sound/core
diff options
context:
space:
mode:
authorKarsten Wiese <fzu@wemgehoertderstaat.de>2007-01-31 10:05:30 +0100
committerJaroslav Kysela <perex@suse.cz>2007-02-09 09:03:24 +0100
commit8fa58af7db56077d6a042fd7b9dd4c9515e1c37b (patch)
tree759062886223b266c4200e8abab82789a9c5ba62 /sound/core
parent[ALSA] ASoC WM8731 support for 32k @ 12MHz sysclk (diff)
downloadlinux-8fa58af7db56077d6a042fd7b9dd4c9515e1c37b.tar.xz
linux-8fa58af7db56077d6a042fd7b9dd4c9515e1c37b.zip
[ALSA] snd_hwdep_release() racefix
snd_card_file_remove() can free the snd_card. Touch hw->* only before calling snd_card_file_remove(). Unrelated: Allow hwdep devices not to have own ops.release(); Signed-off-by: Karsten Wiese <fzu@wemgehoertderstaat.de> Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
Diffstat (limited to 'sound/core')
-rw-r--r--sound/core/hwdep.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/sound/core/hwdep.c b/sound/core/hwdep.c
index a6a6ad0ad3c8..39c03f3dfbfa 100644
--- a/sound/core/hwdep.c
+++ b/sound/core/hwdep.c
@@ -156,15 +156,16 @@ static int snd_hwdep_release(struct inode *inode, struct file * file)
int err = -ENXIO;
struct snd_hwdep *hw = file->private_data;
struct module *mod = hw->card->module;
+
mutex_lock(&hw->open_mutex);
- if (hw->ops.release) {
+ if (hw->ops.release)
err = hw->ops.release(hw, file);
- wake_up(&hw->open_wait);
- }
if (hw->used > 0)
hw->used--;
- snd_card_file_remove(hw->card, file);
mutex_unlock(&hw->open_mutex);
+ wake_up(&hw->open_wait);
+
+ snd_card_file_remove(hw->card, file);
module_put(mod);
return err;
}