From: Cen Zhang Date: Thu, 7 May 2026 01:19:44 +0000 (+0800) Subject: ALSA: pcm: use snd_pcm_get_state() in remaining ioctl checks X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=9fc9caf346085dbb5d69cb6ad71a5ff388ecc6b9;p=thirdparty%2Fkernel%2Flinux.git ALSA: pcm: use snd_pcm_get_state() in remaining ioctl checks 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 Link: https://patch.msgid.link/20260507011944.2897240-1-zzzccc427@gmail.com Signed-off-by: Takashi Iwai --- diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index a541bb235cfa..50da38b141cb 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -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) {