diff options
author | Takashi Iwai <tiwai@suse.de> | 2013-07-11 11:57:55 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-07-25 17:07:24 -0400 |
commit | 2bc2f7d622af45d07980a83586c95c7530e4f6cc (patch) | |
tree | c0f777a4082ab53270a0f9502d75cd6904172d37 /sound/usb | |
parent | 409972c1c8678bb0c28eb0417054e2794dd59ec9 (diff) |
ALSA: 6fire: Fix unlocked snd_pcm_stop() call
commit 5b9ab3f7324a1b94a5a5a76d44cf92dfeb3b5e80 upstream.
snd_pcm_stop() must be called in the PCM substream lock context.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'sound/usb')
-rw-r--r-- | sound/usb/6fire/pcm.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/sound/usb/6fire/pcm.c b/sound/usb/6fire/pcm.c index 40dd50a80f55..8221ff2f209f 100644 --- a/sound/usb/6fire/pcm.c +++ b/sound/usb/6fire/pcm.c | |||
@@ -641,17 +641,25 @@ int usb6fire_pcm_init(struct sfire_chip *chip) | |||
641 | void usb6fire_pcm_abort(struct sfire_chip *chip) | 641 | void usb6fire_pcm_abort(struct sfire_chip *chip) |
642 | { | 642 | { |
643 | struct pcm_runtime *rt = chip->pcm; | 643 | struct pcm_runtime *rt = chip->pcm; |
644 | unsigned long flags; | ||
644 | int i; | 645 | int i; |
645 | 646 | ||
646 | if (rt) { | 647 | if (rt) { |
647 | rt->panic = true; | 648 | rt->panic = true; |
648 | 649 | ||
649 | if (rt->playback.instance) | 650 | if (rt->playback.instance) { |
651 | snd_pcm_stream_lock_irqsave(rt->playback.instance, flags); | ||
650 | snd_pcm_stop(rt->playback.instance, | 652 | snd_pcm_stop(rt->playback.instance, |
651 | SNDRV_PCM_STATE_XRUN); | 653 | SNDRV_PCM_STATE_XRUN); |
652 | if (rt->capture.instance) | 654 | snd_pcm_stream_unlock_irqrestore(rt->playback.instance, flags); |
655 | } | ||
656 | |||
657 | if (rt->capture.instance) { | ||
658 | snd_pcm_stream_lock_irqsave(rt->capture.instance, flags); | ||
653 | snd_pcm_stop(rt->capture.instance, | 659 | snd_pcm_stop(rt->capture.instance, |
654 | SNDRV_PCM_STATE_XRUN); | 660 | SNDRV_PCM_STATE_XRUN); |
661 | snd_pcm_stream_unlock_irqrestore(rt->capture.instance, flags); | ||
662 | } | ||
655 | 663 | ||
656 | for (i = 0; i < PCM_N_URBS; i++) { | 664 | for (i = 0; i < PCM_N_URBS; i++) { |
657 | usb_poison_urb(&rt->in_urbs[i].instance); | 665 | usb_poison_urb(&rt->in_urbs[i].instance); |