ALSA: usb-audio: Apply mutex around snd_usb_endpoint_set_params()
authorTakashi Iwai <tiwai@suse.de>
Sun, 9 Oct 2022 10:42:10 +0000 (12:42 +0200)
committerTakashi Iwai <tiwai@suse.de>
Sun, 9 Oct 2022 10:43:25 +0000 (12:43 +0200)
The protection with chip->mutex was lost after splitting
snd_usb_endpoint_set_params() and snd_usb_endpoint_prepare().
Apply the same mutex again to the former function.

Fixes: 2be79d586454 ("ALSA: usb-audio: Split endpoint setups for hw_params and prepare (take#2)")
Link: https://lore.kernel.org/r/20221009104212.18877-3-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/endpoint.c

index f21acbc9f4f40f8e75ff62c9a136689ae13fad31..da378e565ef840dd82d53d507410bac5d602d9bf 100644 (file)
@@ -1337,10 +1337,11 @@ int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
        const struct audioformat *fmt = ep->cur_audiofmt;
        int err;
 
+       mutex_lock(&chip->mutex);
        /* release old buffers, if any */
        err = release_urbs(ep, false);
        if (err < 0)
-               return err;
+               goto unlock;
 
        ep->datainterval = fmt->datainterval;
        ep->maxpacksize = fmt->maxpacksize;
@@ -1378,13 +1379,16 @@ int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
        usb_audio_dbg(chip, "Set up %d URBS, ret=%d\n", ep->nurbs, err);
 
        if (err < 0)
-               return err;
+               goto unlock;
 
        /* some unit conversions in runtime */
        ep->maxframesize = ep->maxpacksize / ep->cur_frame_bytes;
        ep->curframesize = ep->curpacksize / ep->cur_frame_bytes;
 
-       return update_clock_ref_rate(chip, ep);
+       err = update_clock_ref_rate(chip, ep);
+ unlock:
+       mutex_unlock(&chip->mutex);
+       return err;
 }
 
 static int init_sample_rate(struct snd_usb_audio *chip,