It is missing an up() on an error path. sound/core/pcm_native.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -puN sound/core/pcm_native.c~pcm_native-deadlock-fix sound/core/pcm_native.c --- 25/sound/core/pcm_native.c~pcm_native-deadlock-fix 2003-10-19 15:58:31.000000000 -0700 +++ 25-akpm/sound/core/pcm_native.c 2003-10-19 15:58:48.000000000 -0700 @@ -1982,9 +1982,9 @@ int snd_pcm_open(struct inode *inode, st } } remove_wait_queue(&pcm->open_wait, &wait); + up(&pcm->open_mutex); if (err < 0) goto __error; - up(&pcm->open_mutex); return err; __error: _