Spotted by From: Christian Borntraeger dma_reset_input() takes dmap->lock, so call it without that lock held. sound/oss/dmabuf.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -puN sound/oss/dmabuf.c~oss-dmabuf-deadlock-fix sound/oss/dmabuf.c --- 25/sound/oss/dmabuf.c~oss-dmabuf-deadlock-fix 2004-01-05 20:02:05.000000000 -0800 +++ 25-akpm/sound/oss/dmabuf.c 2004-01-05 20:02:19.000000000 -0800 @@ -587,7 +587,6 @@ int DMAbuf_getrdbuffer(int dev, char **b spin_unlock_irqrestore(&dmap->lock,flags); timeout = interruptible_sleep_on_timeout(&adev->in_sleeper, timeout); - spin_lock_irqsave(&dmap->lock,flags); if (!timeout) { /* FIXME: include device name */ err = -EIO; @@ -595,6 +594,7 @@ int DMAbuf_getrdbuffer(int dev, char **b dma_reset_input(dev); } else err = -EINTR; + spin_lock_irqsave(&dmap->lock,flags); } spin_unlock_irqrestore(&dmap->lock,flags); _