aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2013-07-11 11:57:55 -0400
committerTakashi Iwai <tiwai@suse.de>2013-07-15 12:12:50 -0400
commit5b9ab3f7324a1b94a5a5a76d44cf92dfeb3b5e80 (patch)
tree14f3e2848576f2a15a36ff2e1f2877483fe52356 /sound/usb
parentcc7282b8d5abbd48c81d1465925d464d9e3eaa8f (diff)
ALSA: 6fire: Fix unlocked snd_pcm_stop() call
snd_pcm_stop() must be called in the PCM substream lock context. Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb')
-rw-r--r--sound/usb/6fire/pcm.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/sound/usb/6fire/pcm.c b/sound/usb/6fire/pcm.c
index c5b9cac37dc4..2aa4e13063a8 100644
--- a/sound/usb/6fire/pcm.c
+++ b/sound/usb/6fire/pcm.c
@@ -639,17 +639,25 @@ int usb6fire_pcm_init(struct sfire_chip *chip)
639void usb6fire_pcm_abort(struct sfire_chip *chip) 639void usb6fire_pcm_abort(struct sfire_chip *chip)
640{ 640{
641 struct pcm_runtime *rt = chip->pcm; 641 struct pcm_runtime *rt = chip->pcm;
642 unsigned long flags;
642 int i; 643 int i;
643 644
644 if (rt) { 645 if (rt) {
645 rt->panic = true; 646 rt->panic = true;
646 647
647 if (rt->playback.instance) 648 if (rt->playback.instance) {
649 snd_pcm_stream_lock_irqsave(rt->playback.instance, flags);
648 snd_pcm_stop(rt->playback.instance, 650 snd_pcm_stop(rt->playback.instance,
649 SNDRV_PCM_STATE_XRUN); 651 SNDRV_PCM_STATE_XRUN);
650 if (rt->capture.instance) 652 snd_pcm_stream_unlock_irqrestore(rt->playback.instance, flags);
653 }
654
655 if (rt->capture.instance) {
656 snd_pcm_stream_lock_irqsave(rt->capture.instance, flags);
651 snd_pcm_stop(rt->capture.instance, 657 snd_pcm_stop(rt->capture.instance,
652 SNDRV_PCM_STATE_XRUN); 658 SNDRV_PCM_STATE_XRUN);
659 snd_pcm_stream_unlock_irqrestore(rt->capture.instance, flags);
660 }
653 661
654 for (i = 0; i < PCM_N_URBS; i++) { 662 for (i = 0; i < PCM_N_URBS; i++) {
655 usb_poison_urb(&rt->in_urbs[i].instance); 663 usb_poison_urb(&rt->in_urbs[i].instance);