mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

So far we've ignored the errors at creating proc files in many places. But they should be rather treated seriously. Also, by assuring the error handling, we can get rid of superfluous snd_info_free_entry() calls as they will be removed by the parent in the caller side. This patch fixes the missing error checks and reduces the superfluous free calls. Acked-by: Jaroslav Kysela <perex@perex.cz> Signed-off-by: Takashi Iwai <tiwai@suse.de>
83 lines
2.2 KiB
C
83 lines
2.2 KiB
C
/*
|
|
* ALSA sequencer /proc interface
|
|
* Copyright (c) 1998 by Frank van de Pol <fvdpol@coil.demon.nl>
|
|
*
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/export.h>
|
|
#include <sound/core.h>
|
|
|
|
#include "seq_info.h"
|
|
#include "seq_clientmgr.h"
|
|
#include "seq_timer.h"
|
|
|
|
#ifdef CONFIG_PROC_FS
|
|
static struct snd_info_entry *queues_entry;
|
|
static struct snd_info_entry *clients_entry;
|
|
static struct snd_info_entry *timer_entry;
|
|
|
|
|
|
static struct snd_info_entry * __init
|
|
create_info_entry(char *name, void (*read)(struct snd_info_entry *,
|
|
struct snd_info_buffer *))
|
|
{
|
|
struct snd_info_entry *entry;
|
|
|
|
entry = snd_info_create_module_entry(THIS_MODULE, name, snd_seq_root);
|
|
if (entry == NULL)
|
|
return NULL;
|
|
entry->content = SNDRV_INFO_CONTENT_TEXT;
|
|
entry->c.text.read = read;
|
|
if (snd_info_register(entry) < 0) {
|
|
snd_info_free_entry(entry);
|
|
return NULL;
|
|
}
|
|
return entry;
|
|
}
|
|
|
|
static void free_info_entries(void)
|
|
{
|
|
snd_info_free_entry(queues_entry);
|
|
snd_info_free_entry(clients_entry);
|
|
snd_info_free_entry(timer_entry);
|
|
}
|
|
|
|
/* create all our /proc entries */
|
|
int __init snd_seq_info_init(void)
|
|
{
|
|
queues_entry = create_info_entry("queues",
|
|
snd_seq_info_queues_read);
|
|
clients_entry = create_info_entry("clients",
|
|
snd_seq_info_clients_read);
|
|
timer_entry = create_info_entry("timer", snd_seq_info_timer_read);
|
|
if (!queues_entry || !clients_entry || !timer_entry)
|
|
goto error;
|
|
return 0;
|
|
|
|
error:
|
|
free_info_entries();
|
|
return -ENOMEM;
|
|
}
|
|
|
|
int __exit snd_seq_info_done(void)
|
|
{
|
|
free_info_entries();
|
|
return 0;
|
|
}
|
|
#endif
|