|
|
@@ -722,8 +722,11 @@ snd_info_create_entry(const char *name, struct snd_info_entry *parent)
|
|
|
INIT_LIST_HEAD(&entry->children);
|
|
|
INIT_LIST_HEAD(&entry->list);
|
|
|
entry->parent = parent;
|
|
|
- if (parent)
|
|
|
+ if (parent) {
|
|
|
+ mutex_lock(&parent->access);
|
|
|
list_add_tail(&entry->list, &parent->children);
|
|
|
+ mutex_unlock(&parent->access);
|
|
|
+ }
|
|
|
return entry;
|
|
|
}
|
|
|
|
|
|
@@ -805,7 +808,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);
|