Commit 2471b6c8 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: info: Register proc entries recursively, too

The commit [c560a679: ALSA: core: Remove child proc file elements
recursively] converted snd_card_proc_new() with the normal
snd_info_*() call and removed snd_device chain for such info
entries. However, it misses one point: the creation of the proc entry
was managed by snd_device chain in the former code, and now it's also
gone, which results in no proc files creation at all.  Mea culpa.

This patch makes snd_info_card_register() creating the all pending
child proc entries in a shot.  Also, since snd_card_register() might
be called multiple times, this function is also changed to be callable
multiple times.

Along with the changes above, now the linked list of snd_info_entry is
added at creation time instead of snd_info_register() for keeping eyes
of pending info entries.

Fixes: c560a679 ('ALSA: core: Remove child proc file elements recursively')
Reported-by: default avatar"Lu, Han" <han.lu@intel.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 90a409aa
...@@ -515,22 +515,51 @@ int snd_info_card_create(struct snd_card *card) ...@@ -515,22 +515,51 @@ int snd_info_card_create(struct snd_card *card)
return 0; return 0;
} }
/* register all pending info entries */
static int snd_info_register_recursive(struct snd_info_entry *entry)
{
struct snd_info_entry *p;
int err;
if (!entry->p) {
err = snd_info_register(entry);
if (err < 0)
return err;
}
list_for_each_entry(p, &entry->children, list) {
err = snd_info_register_recursive(p);
if (err < 0)
return err;
}
return 0;
}
/* /*
* register the card proc file * register the card proc file
* called from init.c * called from init.c
* can be called multiple times for reinitialization
*/ */
int snd_info_card_register(struct snd_card *card) int snd_info_card_register(struct snd_card *card)
{ {
struct proc_dir_entry *p; struct proc_dir_entry *p;
int err;
if (snd_BUG_ON(!card)) if (snd_BUG_ON(!card))
return -ENXIO; return -ENXIO;
err = snd_info_register_recursive(card->proc_root);
if (err < 0)
return err;
if (!strcmp(card->id, card->proc_root->name)) if (!strcmp(card->id, card->proc_root->name))
return 0; return 0;
if (card->proc_root_link)
return 0;
p = proc_symlink(card->id, snd_proc_root->p, card->proc_root->name); p = proc_symlink(card->id, snd_proc_root->p, card->proc_root->name);
if (p == NULL) if (!p)
return -ENOMEM; return -ENOMEM;
card->proc_root_link = p; card->proc_root_link = p;
return 0; return 0;
...@@ -705,6 +734,8 @@ struct snd_info_entry *snd_info_create_module_entry(struct module * module, ...@@ -705,6 +734,8 @@ struct snd_info_entry *snd_info_create_module_entry(struct module * module,
if (entry) { if (entry) {
entry->module = module; entry->module = module;
entry->parent = parent; entry->parent = parent;
if (parent)
list_add_tail(&entry->list, &parent->children);
} }
return entry; return entry;
} }
...@@ -730,6 +761,8 @@ struct snd_info_entry *snd_info_create_card_entry(struct snd_card *card, ...@@ -730,6 +761,8 @@ struct snd_info_entry *snd_info_create_card_entry(struct snd_card *card,
entry->module = card->module; entry->module = card->module;
entry->card = card; entry->card = card;
entry->parent = parent; entry->parent = parent;
if (parent)
list_add_tail(&entry->list, &parent->children);
} }
return entry; return entry;
} }
...@@ -816,8 +849,6 @@ int snd_info_register(struct snd_info_entry * entry) ...@@ -816,8 +849,6 @@ int snd_info_register(struct snd_info_entry * entry)
proc_set_size(p, entry->size); proc_set_size(p, entry->size);
} }
entry->p = p; entry->p = p;
if (entry->parent)
list_add_tail(&entry->list, &entry->parent->children);
mutex_unlock(&info_mutex); mutex_unlock(&info_mutex);
return 0; return 0;
} }
......
...@@ -107,26 +107,20 @@ static void snd_card_id_read(struct snd_info_entry *entry, ...@@ -107,26 +107,20 @@ static void snd_card_id_read(struct snd_info_entry *entry,
snd_iprintf(buffer, "%s\n", entry->card->id); snd_iprintf(buffer, "%s\n", entry->card->id);
} }
static inline int init_info_for_card(struct snd_card *card) static int init_info_for_card(struct snd_card *card)
{ {
int err; int err;
struct snd_info_entry *entry; struct snd_info_entry *entry;
if ((err = snd_info_card_register(card)) < 0) { entry = snd_info_create_card_entry(card, "id", card->proc_root);
dev_dbg(card->dev, "unable to create card info\n"); if (!entry) {
return err;
}
if ((entry = snd_info_create_card_entry(card, "id", card->proc_root)) == NULL) {
dev_dbg(card->dev, "unable to create card entry\n"); dev_dbg(card->dev, "unable to create card entry\n");
return err; return err;
} }
entry->c.text.read = snd_card_id_read; entry->c.text.read = snd_card_id_read;
if (snd_info_register(entry) < 0) {
snd_info_free_entry(entry);
entry = NULL;
}
card->proc_id = entry; card->proc_id = entry;
return 0;
return snd_info_card_register(card);
} }
#else /* !CONFIG_PROC_FS */ #else /* !CONFIG_PROC_FS */
#define init_info_for_card(card) #define init_info_for_card(card)
...@@ -756,7 +750,7 @@ int snd_card_register(struct snd_card *card) ...@@ -756,7 +750,7 @@ int snd_card_register(struct snd_card *card)
if (snd_cards[card->number]) { if (snd_cards[card->number]) {
/* already registered */ /* already registered */
mutex_unlock(&snd_card_mutex); mutex_unlock(&snd_card_mutex);
return 0; return snd_info_card_register(card); /* register pending info */
} }
if (*card->id) { if (*card->id) {
/* make a unique id name from the given string */ /* make a unique id name from the given string */
......
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