mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ALSA: info: Register proc entries recursively, too
The commit [c560a6797e: 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:c560a6797e('ALSA: core: Remove child proc file elements recursively') Reported-by: "Lu, Han" <han.lu@intel.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
		
							parent
							
								
									90a409aad4
								
							
						
					
					
						commit
						2471b6c80a
					
				
					 2 changed files with 40 additions and 15 deletions
				
			
		| 
						 | 
					@ -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,
 | 
				
			||||||
	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,
 | 
				
			||||||
		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)
 | 
				
			||||||
		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,
 | 
				
			||||||
	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)
 | 
				
			||||||
	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 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue