ALSA: fix locking in snd_pcm_open*() and snd_rawmidi_open*()

The PCM and rawmidi open callbacks have a lock against card->controls_list
but it takes a wrong one, card->controls_rwsem, instead of a right one
card->ctl_files_rwlock. This patch fixes them.

This change also fixes automatically the potential deadlocks due to
mm->mmap_sem in munmap and copy_from/to_user, reported by Sitsofe
Wheeler:

A: snd_ctl_elem_user_tlv(): card->controls_rwsem => mm->mmap_sem
B: snd_pcm_open(): card->open_mutex => card->controls_rwsem
C: munmap: mm->mmap_sem => snd_pcm_release(): card->open_mutex

The patch breaks the chain.

Signed-off-by: Takashi Iwai <tiwai@suse.de>

+4 -4
+2 -2
sound/core/pcm.c
··· 781 return -ENODEV; 782 783 card = pcm->card; 784 - down_read(&card->controls_rwsem); 785 list_for_each_entry(kctl, &card->ctl_files, list) { 786 if (kctl->pid == current->pid) { 787 prefer_subdevice = kctl->prefer_pcm_subdevice; ··· 789 break; 790 } 791 } 792 - up_read(&card->controls_rwsem); 793 794 switch (stream) { 795 case SNDRV_PCM_STREAM_PLAYBACK:
··· 781 return -ENODEV; 782 783 card = pcm->card; 784 + read_lock(&card->ctl_files_rwlock); 785 list_for_each_entry(kctl, &card->ctl_files, list) { 786 if (kctl->pid == current->pid) { 787 prefer_subdevice = kctl->prefer_pcm_subdevice; ··· 789 break; 790 } 791 } 792 + read_unlock(&card->ctl_files_rwlock); 793 794 switch (stream) { 795 case SNDRV_PCM_STREAM_PLAYBACK:
+2 -2
sound/core/rawmidi.c
··· 418 mutex_lock(&rmidi->open_mutex); 419 while (1) { 420 subdevice = -1; 421 - down_read(&card->controls_rwsem); 422 list_for_each_entry(kctl, &card->ctl_files, list) { 423 if (kctl->pid == current->pid) { 424 subdevice = kctl->prefer_rawmidi_subdevice; ··· 426 break; 427 } 428 } 429 - up_read(&card->controls_rwsem); 430 err = snd_rawmidi_kernel_open(rmidi->card, rmidi->device, 431 subdevice, fflags, rawmidi_file); 432 if (err >= 0)
··· 418 mutex_lock(&rmidi->open_mutex); 419 while (1) { 420 subdevice = -1; 421 + read_lock(&card->ctl_files_rwlock); 422 list_for_each_entry(kctl, &card->ctl_files, list) { 423 if (kctl->pid == current->pid) { 424 subdevice = kctl->prefer_rawmidi_subdevice; ··· 426 break; 427 } 428 } 429 + read_unlock(&card->ctl_files_rwlock); 430 err = snd_rawmidi_kernel_open(rmidi->card, rmidi->device, 431 subdevice, fflags, rawmidi_file); 432 if (err >= 0)