This commit obsoletes old implementation for compat ELEM_ADD operation with a renewal way.
Signed-off-by: Takashi Sakamoto o-takashi@sakamocchi.jp --- sound/core/control_compat.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/sound/core/control_compat.c b/sound/core/control_compat.c index 499cc459917f..8e2617c6217e 100644 --- a/sound/core/control_compat.c +++ b/sound/core/control_compat.c @@ -719,6 +719,14 @@ static int ctl_compat_ioctl_elem_info_32(struct snd_ctl_file *ctl_file, return snd_ctl_elem_info(ctl_file, info); }
+static int ctl_compat_ioctl_elem_add_32(struct snd_ctl_file *ctl_file, + void *buf) +{ + struct snd_ctl_elem_info *info = buf; + + return snd_ctl_elem_add(ctl_file, info); +} + enum { SNDRV_CTL_IOCTL_ELEM_LIST_32 = _IOWR('U', 0x10, struct snd_ctl_elem_list_32), @@ -726,7 +734,8 @@ enum { _IOWR('U', 0x11, struct snd_ctl_elem_info_32), SNDRV_CTL_IOCTL_ELEM_READ32 = _IOWR('U', 0x12, struct snd_ctl_elem_value32), SNDRV_CTL_IOCTL_ELEM_WRITE32 = _IOWR('U', 0x13, struct snd_ctl_elem_value32), - SNDRV_CTL_IOCTL_ELEM_ADD32 = _IOWR('U', 0x17, struct snd_ctl_elem_info32), + SNDRV_CTL_IOCTL_ELEM_ADD_32 = + _IOWR('U', 0x17, struct snd_ctl_elem_info_32), SNDRV_CTL_IOCTL_ELEM_REPLACE32 = _IOWR('U', 0x18, struct snd_ctl_elem_info32), #ifdef CONFIG_X86_X32 SNDRV_CTL_IOCTL_ELEM_READ_X32 = _IOWR('U', 0x12, struct snd_ctl_elem_value_x32), @@ -760,6 +769,13 @@ static long snd_ctl_ioctl_compat(struct file *file, unsigned int cmd, serialize_to_elem_info_32, SNDRV_CTL_IOCTL_ELEM_INFO, }, + { + SNDRV_CTL_IOCTL_ELEM_ADD_32, + deserialize_from_elem_info_32, + ctl_compat_ioctl_elem_add_32, + serialize_to_elem_info_32, + SNDRV_CTL_IOCTL_ELEM_ADD, + }, }; struct snd_ctl_file *ctl; void __user *argp = compat_ptr(arg); @@ -777,8 +793,6 @@ static long snd_ctl_ioctl_compat(struct file *file, unsigned int cmd, return snd_ctl_elem_read_user_compat(ctl, argp); case SNDRV_CTL_IOCTL_ELEM_WRITE32: return snd_ctl_elem_write_user_compat(ctl, argp); - case SNDRV_CTL_IOCTL_ELEM_ADD32: - return snd_ctl_elem_add_compat(ctl, argp, 0); case SNDRV_CTL_IOCTL_ELEM_REPLACE32: return snd_ctl_elem_add_compat(ctl, argp, 1); #ifdef CONFIG_X86_X32 @@ -846,6 +860,13 @@ static long snd_ctl_ioctl_compat(struct file *file, unsigned int cmd, err = -EFAULT; } } + + if (err < 0) { + if (cmd == SNDRV_CTL_IOCTL_ELEM_ADD_32) { + struct snd_ctl_elem_info *info = buf; + snd_ctl_remove_user_ctl(ctl, &info->id); + } + } end: kfree(data); kfree(buf);