Commit b489fedc authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] devfs_remove() helper

All callers of devfs_find_and_unregister() pass 0 in 6th argument.  All
uses of that function either pass 0 in 3rd and 4th argument (in which
case the 5th is ignored) or pass the existing pathname in the 2nd (in
which case 3rd, 4th and 5th are ignored).  In all cases the first
argument can be trivially made NULL.

devfs_find_and_unregister() is left as-is.  All existing callers
converted to new helper - devfs_remove(pathname).  Said beast does
equivalent of devfs_find_and_unregister(NULL, pathname, 0, 0, 0, 0);
parent 5cbc8588
...@@ -310,7 +310,7 @@ static void __exit cpqarray_exit(void) ...@@ -310,7 +310,7 @@ static void __exit cpqarray_exit(void)
put_disk(ida_gendisk[i][j]); put_disk(ida_gendisk[i][j]);
} }
} }
devfs_find_and_unregister(NULL, "ida", 0, 0, 0, 0); devfs_remove("ida");
remove_proc_entry("cpqarray", proc_root_driver); remove_proc_entry("cpqarray", proc_root_driver);
} }
...@@ -437,7 +437,7 @@ static int __init cpqarray_init(void) ...@@ -437,7 +437,7 @@ static int __init cpqarray_init(void)
printk( KERN_ERR "cpqarray: out of memory"); printk( KERN_ERR "cpqarray: out of memory");
if (!num_cntlrs_reg) { if (!num_cntlrs_reg) {
devfs_find_and_unregister(NULL,"ida",0,0,0,0); devfs_remove("ida");
remove_proc_entry("cpqarray", proc_root_driver); remove_proc_entry("cpqarray", proc_root_driver);
return -ENODEV; return -ENODEV;
} }
......
...@@ -1934,7 +1934,7 @@ static int __init aztcd_init(void) ...@@ -1934,7 +1934,7 @@ static int __init aztcd_init(void)
err_out3: err_out3:
put_disk(azt_disk); put_disk(azt_disk);
err_out2: err_out2:
devfs_find_and_unregister(NULL, "aztcd", 0, 0, DEVFS_SPECIAL_BLK, 0); devfs_remove("aztcd");
err_out: err_out:
if ((azt_port == 0x1f0) || (azt_port == 0x170)) { if ((azt_port == 0x1f0) || (azt_port == 0x170)) {
SWITCH_IDE_MASTER; SWITCH_IDE_MASTER;
...@@ -1947,7 +1947,7 @@ static int __init aztcd_init(void) ...@@ -1947,7 +1947,7 @@ static int __init aztcd_init(void)
static void __exit aztcd_exit(void) static void __exit aztcd_exit(void)
{ {
devfs_find_and_unregister(NULL, "aztcd", 0, 0, DEVFS_SPECIAL_BLK, 0); devfs_remove("aztcd");
del_gendisk(azt_disk); del_gendisk(azt_disk);
put_disk(azt_disk); put_disk(azt_disk);
if ((unregister_blkdev(MAJOR_NR, "aztcd") == -EINVAL)) { if ((unregister_blkdev(MAJOR_NR, "aztcd") == -EINVAL)) {
......
...@@ -883,7 +883,7 @@ static void __exit gscd_exit(void) ...@@ -883,7 +883,7 @@ static void __exit gscd_exit(void)
{ {
CLEAR_TIMER; CLEAR_TIMER;
devfs_find_and_unregister(NULL, "gscd", 0, 0, DEVFS_SPECIAL_BLK, 0); devfs_remove("gscd");
del_gendisk(gscd_disk); del_gendisk(gscd_disk);
put_disk(gscd_disk); put_disk(gscd_disk);
if ((unregister_blkdev(MAJOR_NR, "gscd") == -EINVAL)) { if ((unregister_blkdev(MAJOR_NR, "gscd") == -EINVAL)) {
......
...@@ -2067,7 +2067,7 @@ static int __init optcd_init(void) ...@@ -2067,7 +2067,7 @@ static int __init optcd_init(void)
static void __exit optcd_exit(void) static void __exit optcd_exit(void)
{ {
devfs_find_and_unregister(NULL, "optcd", 0, 0, DEVFS_SPECIAL_BLK, 0); devfs_remove("optcd");
del_gendisk(optcd_disk); del_gendisk(optcd_disk);
put_disk(optcd_disk); put_disk(optcd_disk);
if (unregister_blkdev(MAJOR_NR, "optcd") == -EINVAL) { if (unregister_blkdev(MAJOR_NR, "optcd") == -EINVAL) {
......
...@@ -1801,7 +1801,7 @@ static int __init sjcd_init(void) ...@@ -1801,7 +1801,7 @@ static int __init sjcd_init(void)
static void __exit sjcd_exit(void) static void __exit sjcd_exit(void)
{ {
devfs_find_and_unregister(NULL, "sjcd", 0, 0, DEVFS_SPECIAL_BLK, 0); devfs_remove("sjcd");
del_gendisk(sjcd_disk); del_gendisk(sjcd_disk);
put_disk(sjcd_disk); put_disk(sjcd_disk);
release_region(sjcd_base, 4); release_region(sjcd_base, 4);
......
...@@ -1671,8 +1671,7 @@ static sony535_exit(void) ...@@ -1671,8 +1671,7 @@ static sony535_exit(void)
kfree(sony_buffer); kfree(sony_buffer);
kfree(last_sony_subcode); kfree(last_sony_subcode);
kfree(sony_toc); kfree(sony_toc);
devfs_find_and_unregister(NULL, CDU535_HANDLE, 0, 0, devfs_remove(CDU535_HANDLE);
DEVFS_SPECIAL_BLK, 0);
del_gendisk(cdu_disk); del_gendisk(cdu_disk);
put_disk(cdu_disk); put_disk(cdu_disk);
blk_cleanup_queue(&sonycd535_queue); blk_cleanup_queue(&sonycd535_queue);
......
...@@ -415,8 +415,6 @@ int init_module(void) ...@@ -415,8 +415,6 @@ int init_module(void)
void cleanup_module(void) void cleanup_module(void)
{ {
int i; int i;
char devname[9];
TRACE_FUN(ft_t_flow); TRACE_FUN(ft_t_flow);
if (unregister_chrdev(QIC117_TAPE_MAJOR, "zft") != 0) { if (unregister_chrdev(QIC117_TAPE_MAJOR, "zft") != 0) {
...@@ -425,18 +423,12 @@ void cleanup_module(void) ...@@ -425,18 +423,12 @@ void cleanup_module(void)
TRACE(ft_t_info, "successful"); TRACE(ft_t_info, "successful");
} }
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
sprintf(devname, "qft%i", i); devfs_remove("qft%i", i);
devfs_find_and_unregister(NULL, devname, QIC117_TAPE_MAJOR, i, DEVFS_SPECIAL_CHR, 0); devfs_remove("nqft%i", i);
sprintf(devname, "nqft%i", i); devfs_remove("zqft%i", i);
devfs_find_and_unregister(NULL, devname, QIC117_TAPE_MAJOR, i + 4, DEVFS_SPECIAL_CHR, 0); devfs_remove("nzqft%i", i);
sprintf(devname, "zqft%i", i); devfs_remove("rawqft%i", i);
devfs_find_and_unregister(NULL, devname, QIC117_TAPE_MAJOR, i + 16, DEVFS_SPECIAL_CHR, 0); devfs_remove("nrawqft%i", i);
sprintf(devname, "nzqft%i", i);
devfs_find_and_unregister(NULL, devname, QIC117_TAPE_MAJOR, i + 20, DEVFS_SPECIAL_CHR, 0);
sprintf(devname, "rawqft%i", i);
devfs_find_and_unregister(NULL, devname, QIC117_TAPE_MAJOR, i + 32, DEVFS_SPECIAL_CHR, 0);
sprintf(devname, "nrawqft%i", i);
devfs_find_and_unregister(NULL, devname, QIC117_TAPE_MAJOR, i + 36, DEVFS_SPECIAL_CHR, 0);
} }
zft_uninit_mem(); /* release remaining memory, if any */ zft_uninit_mem(); /* release remaining memory, if any */
printk(KERN_INFO "zftape successfully unloaded.\n"); printk(KERN_INFO "zftape successfully unloaded.\n");
......
...@@ -2766,22 +2766,14 @@ void cleanup_module(void) ...@@ -2766,22 +2766,14 @@ void cleanup_module(void)
if (status_zombie == NO) if (status_zombie == NO)
qic02_release_resources(); qic02_release_resources();
devfs_find_and_unregister(NULL, "ntpqic11", QIC02_TAPE_MAJOR, 2, devfs_remove("ntpqic11");
DEVFS_SPECIAL_CHR, 0); devfs_remove("tpqic11");
devfs_find_and_unregister(NULL, "tpqic11", QIC02_TAPE_MAJOR, 3, devfs_remove("ntpqic24");
DEVFS_SPECIAL_CHR, 0); devfs_remove("tpqic24");
devfs_find_and_unregister(NULL, "ntpqic24", QIC02_TAPE_MAJOR, 4, devfs_remove("ntpqic120");
DEVFS_SPECIAL_CHR, 0); devfs_remove("tpqic120");
devfs_find_and_unregister(NULL, "tpqic24", QIC02_TAPE_MAJOR, 5, devfs_remove("ntpqic150");
DEVFS_SPECIAL_CHR, 0); devfs_remove("tpqic150");
devfs_find_and_unregister(NULL, "ntpqic120", QIC02_TAPE_MAJOR, 6,
DEVFS_SPECIAL_CHR, 0);
devfs_find_and_unregister(NULL, "tpqic120", QIC02_TAPE_MAJOR, 7,
DEVFS_SPECIAL_CHR, 0);
devfs_find_and_unregister(NULL, "ntpqic150", QIC02_TAPE_MAJOR, 8,
DEVFS_SPECIAL_CHR, 0);
devfs_find_and_unregister(NULL, "tpqic150", QIC02_TAPE_MAJOR, 9,
DEVFS_SPECIAL_CHR, 0);
} }
int init_module(void) int init_module(void)
......
...@@ -2050,14 +2050,7 @@ void tty_register_devfs (struct tty_driver *driver, unsigned int flags, unsigned ...@@ -2050,14 +2050,7 @@ void tty_register_devfs (struct tty_driver *driver, unsigned int flags, unsigned
void tty_unregister_devfs (struct tty_driver *driver, unsigned minor) void tty_unregister_devfs (struct tty_driver *driver, unsigned minor)
{ {
#ifdef CONFIG_DEVFS_FS devfs_remove(driver->name, minor-driver->minor_start+driver->name_base);
int idx = minor - driver->minor_start;
char buf[32];
sprintf(buf, driver->name, idx + driver->name_base);
devfs_find_and_unregister(NULL, buf, driver->major, minor,
DEVFS_SPECIAL_CHR, 0);
#endif /* CONFIG_DEVFS_FS */
} }
EXPORT_SYMBOL(tty_register_devfs); EXPORT_SYMBOL(tty_register_devfs);
......
...@@ -470,30 +470,24 @@ static struct file_operations vcs_fops = { ...@@ -470,30 +470,24 @@ static struct file_operations vcs_fops = {
.open = vcs_open, .open = vcs_open,
}; };
static devfs_handle_t devfs_handle;
void vcs_make_devfs (unsigned int index, int unregister) void vcs_make_devfs (unsigned int index, int unregister)
{ {
#ifdef CONFIG_DEVFS_FS #ifdef CONFIG_DEVFS_FS
char name[8];
if (unregister) {
sprintf (name, "a%u", index + 1); devfs_remove("vcc/%u", index + 1);
if (unregister) devfs_remove("vcc/a%u", index + 1);
{ } else {
devfs_find_and_unregister(devfs_handle, name + 1, 0, 0, char name[16];
DEVFS_SPECIAL_CHR, 0); sprintf(name, "vcc/%u", index + 1);
devfs_find_and_unregister(devfs_handle, name, 0, 0, devfs_register(NULL, name, DEVFS_FL_DEFAULT,
DEVFS_SPECIAL_CHR, 0); VCS_MAJOR, index + 1,
} S_IFCHR | S_IRUSR | S_IWUSR, &vcs_fops, NULL);
else sprintf(name, "vcc/a%u", index + 1);
{ devfs_register(NULL, name, DEVFS_FL_DEFAULT,
devfs_register (devfs_handle, name + 1, DEVFS_FL_DEFAULT, VCS_MAJOR, index + 129,
VCS_MAJOR, index + 1, S_IFCHR | S_IRUSR | S_IWUSR, &vcs_fops, NULL);
S_IFCHR | S_IRUSR | S_IWUSR, &vcs_fops, NULL); }
devfs_register (devfs_handle, name, DEVFS_FL_DEFAULT,
VCS_MAJOR, index + 129,
S_IFCHR | S_IRUSR | S_IWUSR, &vcs_fops, NULL);
}
#endif /* CONFIG_DEVFS_FS */ #endif /* CONFIG_DEVFS_FS */
} }
...@@ -506,12 +500,9 @@ int __init vcs_init(void) ...@@ -506,12 +500,9 @@ int __init vcs_init(void)
if (error) if (error)
printk("unable to get major %d for vcs device", VCS_MAJOR); printk("unable to get major %d for vcs device", VCS_MAJOR);
devfs_handle = devfs_mk_dir (NULL, "vcc", NULL); devfs_register(NULL, "vcc/0", DEVFS_FL_DEFAULT, VCS_MAJOR, 0,
devfs_register (devfs_handle, "0", DEVFS_FL_DEFAULT,
VCS_MAJOR, 0,
S_IFCHR | S_IRUSR | S_IWUSR, &vcs_fops, NULL); S_IFCHR | S_IRUSR | S_IWUSR, &vcs_fops, NULL);
devfs_register (devfs_handle, "a", DEVFS_FL_DEFAULT, devfs_register(NULL, "vcc/a", DEVFS_FL_DEFAULT, VCS_MAJOR, 128,
VCS_MAJOR, 128,
S_IFCHR | S_IRUSR | S_IWUSR, &vcs_fops, NULL); S_IFCHR | S_IRUSR | S_IWUSR, &vcs_fops, NULL);
return error; return error;
......
...@@ -2588,9 +2588,7 @@ static int dv1394_devfs_add_dir(char *name) ...@@ -2588,9 +2588,7 @@ static int dv1394_devfs_add_dir(char *name)
void dv1394_devfs_del(char *name) void dv1394_devfs_del(char *name)
{ {
char s[64]; devfs_remove("ieee1394/%s", name);
sprintf(s, "ieee1394/%s", name);
devfs_find_and_unregister(NULL, s, 0, 0, 0, 0);
} }
#endif /* CONFIG_DEVFS_FS */ #endif /* CONFIG_DEVFS_FS */
......
...@@ -1527,7 +1527,7 @@ static void __exit capi_exit(void) ...@@ -1527,7 +1527,7 @@ static void __exit capi_exit(void)
proc_exit(); proc_exit();
unregister_chrdev(capi_major, "capi20"); unregister_chrdev(capi_major, "capi20");
devfs_find_and_unregister(NULL, "isdn/capi20", capi_major, 0, DEVFS_SPECIAL_CHR, 0); devfs_remove("isdn/capi20");
#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
capinc_tty_exit(); capinc_tty_exit();
......
...@@ -1111,7 +1111,7 @@ void dm_interface_exit(void) ...@@ -1111,7 +1111,7 @@ void dm_interface_exit(void)
{ {
dm_hash_exit(); dm_hash_exit();
devfs_find_and_unregister(NULL, DM_DIR "/control", 0, 0, 0, 0); devfs_remove(DM_DIR "/control");
if (misc_deregister(&_dm_misc) < 0) if (misc_deregister(&_dm_misc) < 0)
DMERR("misc_deregister failed for control device"); DMERR("misc_deregister failed for control device");
......
...@@ -42,8 +42,8 @@ void fs3270_devfs_register(tub_t *tubp) ...@@ -42,8 +42,8 @@ void fs3270_devfs_register(tub_t *tubp)
{ {
char name[16]; char name[16];
sprintf(name, "tub%.4x", tubp->devno); sprintf(name, "3270/tub%.4x", tubp->devno);
devfs_register(fs3270_devfs_dir, name, DEVFS_FL_DEFAULT, devfs_register(NULL, name, DEVFS_FL_DEFAULT,
IBM_FS3270_MAJOR, tubp->minor, IBM_FS3270_MAJOR, tubp->minor,
S_IFCHR | S_IRUSR | S_IWUSR, &fs3270_fops, NULL); S_IFCHR | S_IRUSR | S_IWUSR, &fs3270_fops, NULL);
sprintf(name, "tty%.4x", tubp->devno); sprintf(name, "tty%.4x", tubp->devno);
...@@ -53,16 +53,8 @@ void fs3270_devfs_register(tub_t *tubp) ...@@ -53,16 +53,8 @@ void fs3270_devfs_register(tub_t *tubp)
void fs3270_devfs_unregister(tub_t *tubp) void fs3270_devfs_unregister(tub_t *tubp)
{ {
char name[16]; devfs_remove("3270/tub%.4x", tubp->devno);
devfs_remove("3270/tty%.4x", tubp->devno);
sprintf(name, "tub%.4x", tubp->devno);
devfs_find_and_unregister(fs3270_devfs_dir, name,
IBM_FS3270_MAJOR, tubp->minor,
DEVFS_SPECIAL_CHR, 0);
sprintf(name, "tty%.4x", tubp->devno);
devfs_find_and_unregister(fs3270_devfs_dir, name,
IBM_TTY3270_MAJOR, tubp->minor,
DEVFS_SPECIAL_CHR, 0);
} }
#endif #endif
......
...@@ -1902,6 +1902,20 @@ void devfs_find_and_unregister (devfs_handle_t dir, const char *name, ...@@ -1902,6 +1902,20 @@ void devfs_find_and_unregister (devfs_handle_t dir, const char *name,
devfs_put (de); devfs_put (de);
} /* End Function devfs_find_and_unregister */ } /* End Function devfs_find_and_unregister */
void devfs_remove(const char *fmt, ...)
{
char buf[64];
va_list args;
int n;
va_start(args, fmt);
n = vsnprintf(buf, 64, fmt, args);
if (n < 64) {
devfs_handle_t de = devfs_get_handle(NULL, buf, 0, 0, 0, 0);
devfs_unregister(de);
devfs_put(de);
}
}
/** /**
* devfs_get_flags - Get the flags for a devfs entry. * devfs_get_flags - Get the flags for a devfs entry.
...@@ -2317,6 +2331,7 @@ EXPORT_SYMBOL(devfs_mk_symlink); ...@@ -2317,6 +2331,7 @@ EXPORT_SYMBOL(devfs_mk_symlink);
EXPORT_SYMBOL(devfs_mk_dir); EXPORT_SYMBOL(devfs_mk_dir);
EXPORT_SYMBOL(devfs_get_handle); EXPORT_SYMBOL(devfs_get_handle);
EXPORT_SYMBOL(devfs_find_and_unregister); EXPORT_SYMBOL(devfs_find_and_unregister);
EXPORT_SYMBOL(devfs_remove);
EXPORT_SYMBOL(devfs_get_flags); EXPORT_SYMBOL(devfs_get_flags);
EXPORT_SYMBOL(devfs_set_flags); EXPORT_SYMBOL(devfs_set_flags);
EXPORT_SYMBOL(devfs_get_maj_min); EXPORT_SYMBOL(devfs_get_maj_min);
......
...@@ -99,11 +99,8 @@ EXPORT_SYMBOL(devfs_register_tape); ...@@ -99,11 +99,8 @@ EXPORT_SYMBOL(devfs_register_tape);
void devfs_unregister_tape(int num) void devfs_unregister_tape(int num)
{ {
if (num >= 0) { if (num >= 0)
char name[32]; devfs_remove("tapes/tape%u", num);
sprintf(name, "tapes/tape%u", num);
devfs_find_and_unregister(NULL, name, 0, 0, 0, 0);
}
} }
EXPORT_SYMBOL(devfs_unregister_tape); EXPORT_SYMBOL(devfs_unregister_tape);
......
...@@ -254,15 +254,11 @@ static void devfs_remove_partitions(struct gendisk *dev) ...@@ -254,15 +254,11 @@ static void devfs_remove_partitions(struct gendisk *dev)
devfs_unregister(dev->disk_de); devfs_unregister(dev->disk_de);
dev->disk_de = NULL; dev->disk_de = NULL;
if (dev->flags & GENHD_FL_CD) { if (dev->flags & GENHD_FL_CD) {
char name[64];
sprintf(name, "cdroms/cdrom%d", dev->number);
if (dev->de) if (dev->de)
devfs_find_and_unregister(NULL, name, 0, 0, 0, 0); devfs_remove("cdroms/cdrom%d", dev->number);
devfs_dealloc_unique_number(&cdrom_numspace, dev->number); devfs_dealloc_unique_number(&cdrom_numspace, dev->number);
} else { } else {
char name[64]; devfs_remove("discs/disc%d", dev->number);
sprintf(name, "discs/disc%d", dev->number);
devfs_find_and_unregister(NULL, name, 0, 0, 0, 0);
if (!(dev->flags & GENHD_FL_DEVFS)) { if (!(dev->flags & GENHD_FL_DEVFS)) {
devfs_unregister(dev->de); devfs_unregister(dev->de);
dev->de = NULL; dev->de = NULL;
......
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
typedef struct devfs_entry * devfs_handle_t; typedef struct devfs_entry * devfs_handle_t;
extern void devfs_remove(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
#ifdef CONFIG_DEVFS_FS #ifdef CONFIG_DEVFS_FS
struct unique_numspace struct unique_numspace
...@@ -159,6 +161,9 @@ static inline void devfs_find_and_unregister (devfs_handle_t dir, ...@@ -159,6 +161,9 @@ static inline void devfs_find_and_unregister (devfs_handle_t dir,
char type, int traverse_symlinks) char type, int traverse_symlinks)
{ {
} }
static inline void devfs_remove(const char *fmt, ...)
{
}
static inline int devfs_get_flags (devfs_handle_t de, unsigned int *flags) static inline int devfs_get_flags (devfs_handle_t de, unsigned int *flags)
{ {
return 0; return 0;
......
...@@ -965,20 +965,12 @@ snd_info_entry_t *snd_info_create_device(const char *name, unsigned int number, ...@@ -965,20 +965,12 @@ snd_info_entry_t *snd_info_create_device(const char *name, unsigned int number,
void snd_info_free_device(snd_info_entry_t * entry) void snd_info_free_device(snd_info_entry_t * entry)
{ {
#ifdef CONFIG_DEVFS_FS
char dname[32];
#endif
snd_runtime_check(entry, return); snd_runtime_check(entry, return);
down(&info_mutex); down(&info_mutex);
snd_remove_proc_entry(snd_proc_dev, entry->p); snd_remove_proc_entry(snd_proc_dev, entry->p);
up(&info_mutex); up(&info_mutex);
#ifdef CONFIG_DEVFS_FS if (entry->p && strncmp(entry->name, "controlC", 8))
if (entry->p && strncmp(entry->name, "controlC", 8)) { devfs_remove("snd/%s", entry->name);
sprintf(dname, "snd/%s", entry->name);
devfs_find_and_unregister(NULL, dname, 0, 0, DEVFS_SPECIAL_CHR, 0);
}
#endif
snd_info_free_entry(entry); snd_info_free_entry(entry);
} }
......
...@@ -351,16 +351,11 @@ static int __init alsa_sound_init(void) ...@@ -351,16 +351,11 @@ static int __init alsa_sound_init(void)
static void __exit alsa_sound_exit(void) static void __exit alsa_sound_exit(void)
{ {
#ifdef CONFIG_DEVFS_FS
char controlname[24];
short controlnum; short controlnum;
for (controlnum = 0; controlnum < cards_limit; controlnum++) { for (controlnum = 0; controlnum < cards_limit; controlnum++)
sprintf(controlname, "snd/controlC%d", controlnum); devfs_remove("snd/controlC%d", controlnum);
devfs_find_and_unregister(NULL, controlname, 0, 0, DEVFS_SPECIAL_CHR, 0);
}
#endif
#ifdef CONFIG_SND_OSSEMUL #ifdef CONFIG_SND_OSSEMUL
snd_info_minor_unregister(); snd_info_minor_unregister();
#endif #endif
......
...@@ -542,38 +542,6 @@ static const struct { ...@@ -542,38 +542,6 @@ static const struct {
&num_audiodevs}, &num_audiodevs},
}; };
static char *
soundcard_make_name(char *buf, char *name, int idx) {
if (idx==0)
sprintf(buf, "sound/%s", name);
else
sprintf(buf, "sound/%s%d", name, idx);
return buf;
}
/* Register/unregister audio entries */
static void soundcard_register_devfs (int do_register)
{
char name_buf[32];
int i, j, num;
for (i = 0; i < sizeof (dev_list) / sizeof *dev_list; i++) {
num = (dev_list[i].num == NULL) ? 0 : *dev_list[i].num;
for (j = 0; j < num || j == 0; j++) {
soundcard_make_name (name_buf, dev_list[i].name, j);
if (do_register)
devfs_register (NULL, name_buf, DEVFS_FL_NONE,
SOUND_MAJOR, dev_list[i].minor+ (j* 0x10),
S_IFCHR | dev_list[i].mode,
&oss_sound_fops, NULL);
else
devfs_find_and_unregister(NULL, name_buf, 0, 0,
DEVFS_SPECIAL_CHR,0);
}
}
}
static int dmabuf = 0; static int dmabuf = 0;
static int dmabug = 0; static int dmabug = 0;
...@@ -583,6 +551,8 @@ MODULE_PARM(dmabug, "i"); ...@@ -583,6 +551,8 @@ MODULE_PARM(dmabug, "i");
static int __init oss_init(void) static int __init oss_init(void)
{ {
int err; int err;
char name_buf[32];
int i, j;
/* drag in sound_syms.o */ /* drag in sound_syms.o */
{ {
...@@ -604,7 +574,22 @@ static int __init oss_init(void) ...@@ -604,7 +574,22 @@ static int __init oss_init(void)
/* Protecting the innocent */ /* Protecting the innocent */
sound_dmap_flag = (dmabuf > 0 ? 1 : 0); sound_dmap_flag = (dmabuf > 0 ? 1 : 0);
soundcard_register_devfs(1); for (i = 0; i < sizeof (dev_list) / sizeof *dev_list; i++) {
sprintf(name_buf, "sound/%s", dev_list[i].name);
devfs_register (NULL, name_buf, DEVFS_FL_NONE,
SOUND_MAJOR, dev_list[i].minor,
S_IFCHR | dev_list[i].mode,
&oss_sound_fops, NULL);
if (!dev_list[i].num)
continue;
for (j = 1; j < *dev_list[i].num; j++) {
sprintf(name_buf, "sound/%s%d", dev_list[i].name, j);
devfs_register (NULL, name_buf, DEVFS_FL_NONE,
SOUND_MAJOR, dev_list[i].minor + (j * 0x10),
S_IFCHR | dev_list[i].mode,
&oss_sound_fops, NULL);
}
}
if (sound_nblocks >= 1024) if (sound_nblocks >= 1024)
printk(KERN_ERR "Sound warning: Deallocation table was too small.\n"); printk(KERN_ERR "Sound warning: Deallocation table was too small.\n");
...@@ -614,12 +599,18 @@ static int __init oss_init(void) ...@@ -614,12 +599,18 @@ static int __init oss_init(void)
static void __exit oss_cleanup(void) static void __exit oss_cleanup(void)
{ {
int i; int i, j;
if (MOD_IN_USE) if (MOD_IN_USE)
return; return;
soundcard_register_devfs (0); for (i = 0; i < sizeof (dev_list) / sizeof *dev_list; i++) {
devfs_remove("snd/%s", dev_list[i].name);
if (!dev_list[i].num)
continue;
for (j = 1; j < *dev_list[i].num; j++)
devfs_remove("sound/%s%d", dev_list[i].name, j);
}
unregister_sound_special(1); unregister_sound_special(1);
unregister_sound_special(8); unregister_sound_special(8);
......
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