Merge branch 'for-linus' into for-next
authorTakashi Iwai <tiwai@suse.de>
Tue, 22 Aug 2017 13:44:45 +0000 (15:44 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 22 Aug 2017 13:44:45 +0000 (15:44 +0200)
Conflicts:
sound/core/control.c

1  2 
sound/core/control.c
sound/firewire/motu/motu.c
sound/usb/mixer.c
sound/usb/quirks.c

@@@ -1112,32 -1117,50 +1112,32 @@@ static int snd_ctl_elem_user_put(struc
        return change;
  }
  
 -static int snd_ctl_elem_user_tlv(struct snd_kcontrol *kcontrol,
 -                               int op_flag,
 -                               unsigned int size,
 -                               unsigned int __user *tlv)
 +static int replace_user_tlv(struct snd_kcontrol *kctl, unsigned int __user *buf,
 +                          unsigned int size)
  {
 -      struct user_element *ue = kcontrol->private_data;
 -      int change = 0;
 -      void *new_data;
 +      struct user_element *ue = kctl->private_data;
 +      unsigned int *container;
 +      int change;
  
 -      if (op_flag == SNDRV_CTL_TLV_OP_WRITE) {
 -              if (size > 1024 * 128)  /* sane value */
 -                      return -EINVAL;
 +      if (size > 1024 * 128)  /* sane value */
 +              return -EINVAL;
  
 -              new_data = memdup_user(tlv, size);
 -              if (IS_ERR(new_data))
 -                      return PTR_ERR(new_data);
 -              mutex_lock(&ue->card->user_ctl_lock);
 -              change = ue->tlv_data_size != size;
 -              if (!change)
 -                      change = memcmp(ue->tlv_data, new_data, size) != 0;
 -              kfree(ue->tlv_data);
 -              ue->tlv_data = new_data;
 -              ue->tlv_data_size = size;
 -              mutex_unlock(&ue->card->user_ctl_lock);
 -      } else {
 -              int ret = 0;
 +      container = memdup_user(buf, size);
 +      if (IS_ERR(container))
 +              return PTR_ERR(container);
  
 -              mutex_lock(&ue->card->user_ctl_lock);
 -              if (!ue->tlv_data_size || !ue->tlv_data) {
 -                      ret = -ENXIO;
 -                      goto err_unlock;
 -              }
 -              if (size < ue->tlv_data_size) {
 -                      ret = -ENOSPC;
 -                      goto err_unlock;
 -              }
 -              if (copy_to_user(tlv, ue->tlv_data, ue->tlv_data_size))
 -                      ret = -EFAULT;
 -err_unlock:
 -              mutex_unlock(&ue->card->user_ctl_lock);
 -              if (ret)
 -                      return ret;
 +      change = ue->tlv_data_size != size;
 +      if (!change)
-               change = memcmp(ue->tlv_data, container, size);
++              change = memcmp(ue->tlv_data, container, size) != 0;
 +      if (!change) {
 +              kfree(container);
 +              return 0;
        }
 +
 +      kfree(ue->tlv_data);
 +      ue->tlv_data = container;
 +      ue->tlv_data_size = size;
 +
        return change;
  }
  
Simple merge
Simple merge
Simple merge