]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ALSA: pcm: use snd_pcm_get_state() in remaining ioctl checks
authorCen Zhang <zzzccc427@gmail.com>
Thu, 7 May 2026 01:19:44 +0000 (09:19 +0800)
committerTakashi Iwai <tiwai@suse.de>
Thu, 7 May 2026 10:52:51 +0000 (12:52 +0200)
The recent OSS runtime->state locking cleanup converted the OSS I/O
paths to use snd_pcm_get_state(), but a few ioctl-side checks in
pcm_native.c still sample runtime->state directly: the prepare
pre-checks, the early drain open-state check, and the common
snd_pcm_kernel_ioctl() disconnected check.

Use snd_pcm_get_state() for those remaining samples. In
snd_pcm_pre_prepare(), keep a single state snapshot and reuse it for
both the OPEN/DISCONNECTED check and the running-state test.

Signed-off-by: Cen Zhang <zzzccc427@gmail.com>
Link: https://patch.msgid.link/20260507011944.2897240-1-zzzccc427@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/pcm_native.c

index a541bb235cfa18be15a2256c978d8aa978a57464..50da38b141cb75930f60592eb94221d6ad7665db 100644 (file)
@@ -1973,13 +1973,15 @@ static int snd_pcm_reset(struct snd_pcm_substream *substream)
 static int snd_pcm_pre_prepare(struct snd_pcm_substream *substream,
                               snd_pcm_state_t state)
 {
-       struct snd_pcm_runtime *runtime = substream->runtime;
+       snd_pcm_state_t cur_state = snd_pcm_get_state(substream);
        int f_flags = (__force int)state;
 
-       if (runtime->state == SNDRV_PCM_STATE_OPEN ||
-           runtime->state == SNDRV_PCM_STATE_DISCONNECTED)
+       if (cur_state == SNDRV_PCM_STATE_OPEN ||
+           cur_state == SNDRV_PCM_STATE_DISCONNECTED)
                return -EBADFD;
-       if (snd_pcm_running(substream))
+       if (cur_state == SNDRV_PCM_STATE_RUNNING ||
+           (cur_state == SNDRV_PCM_STATE_DRAINING &&
+            substream->stream == SNDRV_PCM_STREAM_PLAYBACK))
                return -EBUSY;
        substream->f_flags = f_flags;
        return 0;
@@ -2139,7 +2141,7 @@ static int snd_pcm_drain(struct snd_pcm_substream *substream,
        card = substream->pcm->card;
        runtime = substream->runtime;
 
-       if (runtime->state == SNDRV_PCM_STATE_OPEN)
+       if (snd_pcm_get_state(substream) == SNDRV_PCM_STATE_OPEN)
                return -EBADFD;
 
        if (file) {
@@ -3524,7 +3526,7 @@ int snd_pcm_kernel_ioctl(struct snd_pcm_substream *substream,
        snd_pcm_uframes_t *frames = arg;
        snd_pcm_sframes_t result;
        
-       if (substream->runtime->state == SNDRV_PCM_STATE_DISCONNECTED)
+       if (snd_pcm_get_state(substream) == SNDRV_PCM_STATE_DISCONNECTED)
                return -EBADFD;
 
        switch (cmd) {