Commit 7cb83f7a authored by Takashi Iwai's avatar Takashi Iwai Committed by Kamal Mostafa

ALSA: compress: Disable GET_CODEC_CAPS ioctl for some architectures

commit 462b3f16 upstream.

Some architectures like PowerPC can handle the maximum struct size in
an ioctl only up to 13 bits, and struct snd_compr_codec_caps used by
SNDRV_COMPRESS_GET_CODEC_CAPS ioctl overflows this limit.  This
problem was revealed recently by a powerpc change, as it's now treated
as a fatal build error.

This patch is a stop-gap for that: for architectures with less than 14
bit ioctl struct size, get rid of the handling of the relevant ioctl.
We should provide an alternative equivalent ioctl code later, but for
now just paper over it.  Luckily, the compress API hasn't been used on
such architectures, so the impact must be effectively zero.
Reviewed-by: default avatarMark Brown <broonie@kernel.org>
Acked-by: default avatarSudip Mukherjee <sudipm.mukherjee@gmail.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarKamal Mostafa <kamal@canonical.com>
parent fb8f0cb4
...@@ -44,6 +44,13 @@ ...@@ -44,6 +44,13 @@
#include <sound/compress_offload.h> #include <sound/compress_offload.h>
#include <sound/compress_driver.h> #include <sound/compress_driver.h>
/* struct snd_compr_codec_caps overflows the ioctl bit size for some
* architectures, so we need to disable the relevant ioctls.
*/
#if _IOC_SIZEBITS < 14
#define COMPR_CODEC_CAPS_OVERFLOW
#endif
/* TODO: /* TODO:
* - add substream support for multiple devices in case of * - add substream support for multiple devices in case of
* SND_DYNAMIC_MINORS is not used * SND_DYNAMIC_MINORS is not used
...@@ -438,6 +445,7 @@ snd_compr_get_caps(struct snd_compr_stream *stream, unsigned long arg) ...@@ -438,6 +445,7 @@ snd_compr_get_caps(struct snd_compr_stream *stream, unsigned long arg)
return retval; return retval;
} }
#ifndef COMPR_CODEC_CAPS_OVERFLOW
static int static int
snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg) snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg)
{ {
...@@ -461,6 +469,7 @@ snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg) ...@@ -461,6 +469,7 @@ snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg)
kfree(caps); kfree(caps);
return retval; return retval;
} }
#endif /* !COMPR_CODEC_CAPS_OVERFLOW */
/* revisit this with snd_pcm_preallocate_xxx */ /* revisit this with snd_pcm_preallocate_xxx */
static int snd_compr_allocate_buffer(struct snd_compr_stream *stream, static int snd_compr_allocate_buffer(struct snd_compr_stream *stream,
...@@ -799,9 +808,11 @@ static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg) ...@@ -799,9 +808,11 @@ static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
case _IOC_NR(SNDRV_COMPRESS_GET_CAPS): case _IOC_NR(SNDRV_COMPRESS_GET_CAPS):
retval = snd_compr_get_caps(stream, arg); retval = snd_compr_get_caps(stream, arg);
break; break;
#ifndef COMPR_CODEC_CAPS_OVERFLOW
case _IOC_NR(SNDRV_COMPRESS_GET_CODEC_CAPS): case _IOC_NR(SNDRV_COMPRESS_GET_CODEC_CAPS):
retval = snd_compr_get_codec_caps(stream, arg); retval = snd_compr_get_codec_caps(stream, arg);
break; break;
#endif
case _IOC_NR(SNDRV_COMPRESS_SET_PARAMS): case _IOC_NR(SNDRV_COMPRESS_SET_PARAMS):
retval = snd_compr_set_params(stream, arg); retval = snd_compr_set_params(stream, arg);
break; break;
......
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