Commit 94715da3 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
  ALSA: remove unneeded power_mutex lock in snd_pcm_drop
  ALSA: fix locking in snd_pcm_open*() and snd_rawmidi_open*()
parents ec4d9028 24e8fc49
...@@ -781,7 +781,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, ...@@ -781,7 +781,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream,
return -ENODEV; return -ENODEV;
card = pcm->card; card = pcm->card;
down_read(&card->controls_rwsem); read_lock(&card->ctl_files_rwlock);
list_for_each_entry(kctl, &card->ctl_files, list) { list_for_each_entry(kctl, &card->ctl_files, list) {
if (kctl->pid == current->pid) { if (kctl->pid == current->pid) {
prefer_subdevice = kctl->prefer_pcm_subdevice; prefer_subdevice = kctl->prefer_pcm_subdevice;
...@@ -789,7 +789,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, ...@@ -789,7 +789,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream,
break; break;
} }
} }
up_read(&card->controls_rwsem); read_unlock(&card->ctl_files_rwlock);
switch (stream) { switch (stream) {
case SNDRV_PCM_STREAM_PLAYBACK: case SNDRV_PCM_STREAM_PLAYBACK:
......
...@@ -1546,16 +1546,10 @@ static int snd_pcm_drop(struct snd_pcm_substream *substream) ...@@ -1546,16 +1546,10 @@ static int snd_pcm_drop(struct snd_pcm_substream *substream)
card = substream->pcm->card; card = substream->pcm->card;
if (runtime->status->state == SNDRV_PCM_STATE_OPEN || if (runtime->status->state == SNDRV_PCM_STATE_OPEN ||
runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED) runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED ||
runtime->status->state == SNDRV_PCM_STATE_SUSPENDED)
return -EBADFD; return -EBADFD;
snd_power_lock(card);
if (runtime->status->state == SNDRV_PCM_STATE_SUSPENDED) {
result = snd_power_wait(card, SNDRV_CTL_POWER_D0);
if (result < 0)
goto _unlock;
}
snd_pcm_stream_lock_irq(substream); snd_pcm_stream_lock_irq(substream);
/* resume pause */ /* resume pause */
if (runtime->status->state == SNDRV_PCM_STATE_PAUSED) if (runtime->status->state == SNDRV_PCM_STATE_PAUSED)
...@@ -1564,8 +1558,7 @@ static int snd_pcm_drop(struct snd_pcm_substream *substream) ...@@ -1564,8 +1558,7 @@ static int snd_pcm_drop(struct snd_pcm_substream *substream)
snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP); snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP);
/* runtime->control->appl_ptr = runtime->status->hw_ptr; */ /* runtime->control->appl_ptr = runtime->status->hw_ptr; */
snd_pcm_stream_unlock_irq(substream); snd_pcm_stream_unlock_irq(substream);
_unlock:
snd_power_unlock(card);
return result; return result;
} }
......
...@@ -418,7 +418,7 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file) ...@@ -418,7 +418,7 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file)
mutex_lock(&rmidi->open_mutex); mutex_lock(&rmidi->open_mutex);
while (1) { while (1) {
subdevice = -1; subdevice = -1;
down_read(&card->controls_rwsem); read_lock(&card->ctl_files_rwlock);
list_for_each_entry(kctl, &card->ctl_files, list) { list_for_each_entry(kctl, &card->ctl_files, list) {
if (kctl->pid == current->pid) { if (kctl->pid == current->pid) {
subdevice = kctl->prefer_rawmidi_subdevice; subdevice = kctl->prefer_rawmidi_subdevice;
...@@ -426,7 +426,7 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file) ...@@ -426,7 +426,7 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file)
break; break;
} }
} }
up_read(&card->controls_rwsem); read_unlock(&card->ctl_files_rwlock);
err = snd_rawmidi_kernel_open(rmidi->card, rmidi->device, err = snd_rawmidi_kernel_open(rmidi->card, rmidi->device,
subdevice, fflags, rawmidi_file); subdevice, fflags, rawmidi_file);
if (err >= 0) if (err >= 0)
......
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