A previous commit adds a helper function for replacement processing. This commit do actual separation from a helper function for addition.
Signed-off-by: Takashi Sakamoto o-takashi@sakamocchi.jp --- sound/core/control.c | 34 +++++++++++++++++++++++----------- sound/core/control_compat.c | 5 ++++- 2 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/sound/core/control.c b/sound/core/control.c index 9e23f84d284d..0aa1f22dcac2 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -1256,7 +1256,7 @@ static void snd_ctl_elem_user_free(struct snd_kcontrol *kcontrol) }
static int snd_ctl_elem_add(struct snd_ctl_file *file, - struct snd_ctl_elem_info *info, int replace) + struct snd_ctl_elem_info *info) { /* The capacity of struct snd_ctl_elem_value.value.*/ static const unsigned int value_sizes[] = { @@ -1289,14 +1289,6 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file, if (strnlen(info->id.name, sizeof(info->id.name)) >= sizeof(info->id.name)) return -EINVAL;
- /* Delete a control to replace them if needed. */ - if (replace) { - info->id.numid = 0; - err = snd_ctl_remove_user_ctl(file, &info->id); - if (err) - return err; - } - /* * The number of userspace controls are counted control by control, * not element by element. @@ -1415,7 +1407,7 @@ static int snd_ctl_elem_add_user(struct snd_ctl_file *ctl_file, if (IS_ERR(info)) return PTR_ERR(info);
- err = snd_ctl_elem_add(ctl_file, info, 0); + err = snd_ctl_elem_add(ctl_file, info); if (err >= 0) { if (copy_to_user(arg, info, sizeof(*info))) { snd_ctl_remove_user_ctl(ctl_file, &info->id); @@ -1427,6 +1419,26 @@ static int snd_ctl_elem_add_user(struct snd_ctl_file *ctl_file, return err; }
+static int snd_ctl_elem_replace(struct snd_ctl_file *ctl_file, + struct snd_ctl_elem_info *info) +{ + int err; + + if (!*info->id.name) + return -EINVAL; + if (strnlen(info->id.name, sizeof(info->id.name)) >= + sizeof(info->id.name)) + return -EINVAL; + + /* Delete an element set to replace them. */ + info->id.numid = 0; + err = snd_ctl_remove_user_ctl(ctl_file, &info->id); + if (err < 0) + return err; + + return snd_ctl_elem_add(ctl_file, info); +} + static int snd_ctl_elem_replace_user(struct snd_ctl_file *ctl_file, void __user *arg) { @@ -1437,7 +1449,7 @@ static int snd_ctl_elem_replace_user(struct snd_ctl_file *ctl_file, if (IS_ERR(info)) return PTR_ERR(info);
- err = snd_ctl_elem_add(ctl_file, info, 1); + err = snd_ctl_elem_replace(ctl_file, info); if (err >= 0) { if (copy_to_user(arg, info, sizeof(*info))) { snd_ctl_remove_user_ctl(ctl_file, &info->id); diff --git a/sound/core/control_compat.c b/sound/core/control_compat.c index d6d1a2bf9542..1cfacea867b6 100644 --- a/sound/core/control_compat.c +++ b/sound/core/control_compat.c @@ -792,7 +792,10 @@ static int snd_ctl_elem_add_compat(struct snd_ctl_file *file, default: break; } - err = snd_ctl_elem_add(file, data, replace); + if (!replace) + err = snd_ctl_elem_add(file, data); + else + err = snd_ctl_elem_replace(file, data); error: kfree(data); return err;