ALSA: pcm: Fix power lock unbalance via OSS emulation
PCM OSS emulation issues the drain ioctl without power lock. It used to work in the earlier kernels as the power lock was taken inside snd_pcm_drain() itself. But since68b4acd322
("ALSA: pcm: Apply power lock globally to common ioctls"), the power lock is taken outside the function. Due to that change, the call via OSS emulation leads to the unbalanced power lock, thus it deadlocks. As a quick fix, just take the power lock before snd_pcm_drain() call for OSS emulation path. A better cleanup will follow later. Fixes:68b4acd322
("ALSA: pcm: Apply power lock globally to common ioctls") Reported-and-tested-by: Markus Trippelsdorf <markus@trippelsdorf.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
9ce76511b6
commit
bcab3a6e64
|
@ -3064,6 +3064,7 @@ int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream,
|
|||
{
|
||||
snd_pcm_uframes_t *frames = arg;
|
||||
snd_pcm_sframes_t result;
|
||||
int err;
|
||||
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_IOCTL_FORWARD:
|
||||
|
@ -3083,7 +3084,10 @@ int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream,
|
|||
case SNDRV_PCM_IOCTL_START:
|
||||
return snd_pcm_start_lock_irq(substream);
|
||||
case SNDRV_PCM_IOCTL_DRAIN:
|
||||
return snd_pcm_drain(substream, NULL);
|
||||
snd_power_lock(substream->pcm->card);
|
||||
err = snd_pcm_drain(substream, NULL);
|
||||
snd_power_unlock(substream->pcm->card);
|
||||
return err;
|
||||
case SNDRV_PCM_IOCTL_DROP:
|
||||
return snd_pcm_drop(substream);
|
||||
case SNDRV_PCM_IOCTL_DELAY:
|
||||
|
|
Loading…
Reference in New Issue