ALSA: line6: Fix the error recovery in line6_pcm_acquire()
line6_pcm_acquire() tries to restore the newly obtained resources at the error path. But some flags aren't recorded and released properly when the corresponding buffer is already present. These bits have to be cleared in the error recovery, too. Also, "flags_final" can be initialized to zero since we pass only the subset of "channels" bits. Tested-by: Chris Rorvick <chris@rorvick.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
6aa7f8ef29
commit
5343ecf4e5
@ -106,7 +106,7 @@ int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int channels)
|
||||
flags_new = flags_old | channels;
|
||||
} while (cmpxchg(&line6pcm->flags, flags_old, flags_new) != flags_old);
|
||||
|
||||
flags_final = flags_old;
|
||||
flags_final = 0;
|
||||
|
||||
line6pcm->prev_fbuf = NULL;
|
||||
|
||||
@ -120,9 +120,9 @@ int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int channels)
|
||||
err = -ENOMEM;
|
||||
goto pcm_acquire_error;
|
||||
}
|
||||
|
||||
flags_final |= channels & LINE6_BITS_CAPTURE_BUFFER;
|
||||
}
|
||||
|
||||
flags_final |= channels & LINE6_BITS_CAPTURE_BUFFER;
|
||||
}
|
||||
|
||||
if (test_flags(flags_old, flags_new, LINE6_BITS_CAPTURE_STREAM)) {
|
||||
@ -157,9 +157,9 @@ int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int channels)
|
||||
err = -ENOMEM;
|
||||
goto pcm_acquire_error;
|
||||
}
|
||||
|
||||
flags_final |= channels & LINE6_BITS_PLAYBACK_BUFFER;
|
||||
}
|
||||
|
||||
flags_final |= channels & LINE6_BITS_PLAYBACK_BUFFER;
|
||||
}
|
||||
|
||||
if (test_flags(flags_old, flags_new, LINE6_BITS_PLAYBACK_STREAM)) {
|
||||
@ -187,7 +187,7 @@ int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int channels)
|
||||
If not all requested resources/streams could be obtained, release
|
||||
those which were successfully obtained (if any).
|
||||
*/
|
||||
line6_pcm_release(line6pcm, flags_final & channels);
|
||||
line6_pcm_release(line6pcm, flags_final);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(line6_pcm_acquire);
|
||||
|
Loading…
Reference in New Issue
Block a user