Commit 5343ecf4 authored by Takashi Iwai's avatar Takashi Iwai

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: default avatarChris Rorvick <chris@rorvick.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 6aa7f8ef
...@@ -106,7 +106,7 @@ int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int channels) ...@@ -106,7 +106,7 @@ int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int channels)
flags_new = flags_old | channels; flags_new = flags_old | channels;
} while (cmpxchg(&line6pcm->flags, flags_old, flags_new) != flags_old); } while (cmpxchg(&line6pcm->flags, flags_old, flags_new) != flags_old);
flags_final = flags_old; flags_final = 0;
line6pcm->prev_fbuf = NULL; line6pcm->prev_fbuf = NULL;
...@@ -120,9 +120,9 @@ int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int channels) ...@@ -120,9 +120,9 @@ int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int channels)
err = -ENOMEM; err = -ENOMEM;
goto pcm_acquire_error; 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)) { 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) ...@@ -157,9 +157,9 @@ int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int channels)
err = -ENOMEM; err = -ENOMEM;
goto pcm_acquire_error; 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)) { 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) ...@@ -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 If not all requested resources/streams could be obtained, release
those which were successfully obtained (if any). those which were successfully obtained (if any).
*/ */
line6_pcm_release(line6pcm, flags_final & channels); line6_pcm_release(line6pcm, flags_final);
return err; return err;
} }
EXPORT_SYMBOL_GPL(line6_pcm_acquire); EXPORT_SYMBOL_GPL(line6_pcm_acquire);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment