[ALSA] Fix possible races in timer callbacks
[linux-2.6.git] / sound / drivers / opl3 / opl3_midi.c
index 48c480e050ceef1b810feae12c03178992c0646c..1b6f227af370b0428fd707df46a6b7b21cafc914 100644 (file)
@@ -238,10 +238,11 @@ void snd_opl3_timer_func(unsigned long data)
 {
 
        struct snd_opl3 *opl3 = (struct snd_opl3 *)data;
+       unsigned long flags;
        int again = 0;
        int i;
 
-       spin_lock(&opl3->sys_timer_lock);
+       spin_lock_irqsave(&opl3->sys_timer_lock, flags);
        for (i = 0; i < opl3->max_voices; i++) {
                struct snd_opl3_voice *vp = &opl3->voices[i];
                if (vp->state > 0 && vp->note_off_check) {
@@ -257,7 +258,7 @@ void snd_opl3_timer_func(unsigned long data)
        } else {
                opl3->sys_timer_status = 0;
        }
-       spin_unlock(&opl3->sys_timer_lock);
+       spin_unlock_irqrestore(&opl3->sys_timer_lock, flags);
 }
 
 /*