[alsa-cvslog] alsa-kernel: snd_hwdep_release() racefix
Brought to you by:
perex
From: Takashi I. <ti...@su...> - 2007-01-31 09:10:46
|
changeset: 4836:60054498d9d7 tag: tip user: tiwai date: Wed Jan 31 10:05:30 2007 +0100 files: core/hwdep.c description: 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 <fz...@we...> diff -r b9e8154fb15b -r 60054498d9d7 core/hwdep.c --- a/core/hwdep.c Wed Jan 31 10:02:56 2007 +0100 +++ b/core/hwdep.c Wed Jan 31 10:05:30 2007 +0100 @@ -156,15 +156,16 @@ static int snd_hwdep_release(struct inod 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--; + mutex_unlock(&hw->open_mutex); + wake_up(&hw->open_wait); + snd_card_file_remove(hw->card, file); - mutex_unlock(&hw->open_mutex); module_put(mod); return err; } |