Merge branch 'for-linus' into for-next
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@@ -713,8 +713,11 @@ snd_info_create_entry(const char *name, struct snd_info_entry *parent,
|
||||
INIT_LIST_HEAD(&entry->list);
|
||||
entry->parent = parent;
|
||||
entry->module = module;
|
||||
if (parent)
|
||||
if (parent) {
|
||||
mutex_lock(&parent->access);
|
||||
list_add_tail(&entry->list, &parent->children);
|
||||
mutex_unlock(&parent->access);
|
||||
}
|
||||
return entry;
|
||||
}
|
||||
|
||||
@@ -792,7 +795,12 @@ void snd_info_free_entry(struct snd_info_entry * entry)
|
||||
list_for_each_entry_safe(p, n, &entry->children, list)
|
||||
snd_info_free_entry(p);
|
||||
|
||||
list_del(&entry->list);
|
||||
p = entry->parent;
|
||||
if (p) {
|
||||
mutex_lock(&p->access);
|
||||
list_del(&entry->list);
|
||||
mutex_unlock(&p->access);
|
||||
}
|
||||
kfree(entry->name);
|
||||
if (entry->private_free)
|
||||
entry->private_free(entry);
|
||||
|
@@ -401,14 +401,7 @@ int snd_card_disconnect(struct snd_card *card)
|
||||
card->shutdown = 1;
|
||||
spin_unlock(&card->files_lock);
|
||||
|
||||
/* phase 1: disable fops (user space) operations for ALSA API */
|
||||
mutex_lock(&snd_card_mutex);
|
||||
snd_cards[card->number] = NULL;
|
||||
clear_bit(card->number, snd_cards_lock);
|
||||
mutex_unlock(&snd_card_mutex);
|
||||
|
||||
/* phase 2: replace file->f_op with special dummy operations */
|
||||
|
||||
/* replace file->f_op with special dummy operations */
|
||||
spin_lock(&card->files_lock);
|
||||
list_for_each_entry(mfile, &card->files_list, list) {
|
||||
/* it's critical part, use endless loop */
|
||||
@@ -424,7 +417,7 @@ int snd_card_disconnect(struct snd_card *card)
|
||||
}
|
||||
spin_unlock(&card->files_lock);
|
||||
|
||||
/* phase 3: notify all connected devices about disconnection */
|
||||
/* notify all connected devices about disconnection */
|
||||
/* at this point, they cannot respond to any calls except release() */
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_MIXER_OSS)
|
||||
@@ -440,6 +433,13 @@ int snd_card_disconnect(struct snd_card *card)
|
||||
device_del(&card->card_dev);
|
||||
card->registered = false;
|
||||
}
|
||||
|
||||
/* disable fops (user space) operations for ALSA API */
|
||||
mutex_lock(&snd_card_mutex);
|
||||
snd_cards[card->number] = NULL;
|
||||
clear_bit(card->number, snd_cards_lock);
|
||||
mutex_unlock(&snd_card_mutex);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
wake_up(&card->power_sleep);
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user