]> git.hungrycats.org Git - linux/commitdiff
[PATCH] devfs_remove() helper
authorAlexander Viro <viro@math.psu.edu>
Sun, 17 Nov 2002 09:39:09 +0000 (01:39 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Sun, 17 Nov 2002 09:39:09 +0000 (01:39 -0800)
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);

21 files changed:
drivers/block/cpqarray.c
drivers/cdrom/aztcd.c
drivers/cdrom/gscd.c
drivers/cdrom/optcd.c
drivers/cdrom/sjcd.c
drivers/cdrom/sonycd535.c
drivers/char/ftape/zftape/zftape-init.c
drivers/char/tpqic02.c
drivers/char/tty_io.c
drivers/char/vc_screen.c
drivers/ieee1394/dv1394.c
drivers/isdn/capi/capi.c
drivers/md/dm-ioctl.c
drivers/s390/char/tubfs.c
fs/devfs/base.c
fs/devfs/util.c
fs/partitions/check.c
include/linux/devfs_fs_kernel.h
sound/core/info.c
sound/core/sound.c
sound/oss/soundcard.c

index 05c5bcb063ea577a2e6ff2271211004ab0f976ac..4d9395d7f7c858a1f347cac63ca0a524b1f0762d 100644 (file)
@@ -310,7 +310,7 @@ static void __exit cpqarray_exit(void)
                        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);
 }
 
@@ -437,7 +437,7 @@ Enomem2:
        printk( KERN_ERR "cpqarray: out of memory");
 
        if (!num_cntlrs_reg) {
-               devfs_find_and_unregister(NULL,"ida",0,0,0,0);
+               devfs_remove("ida");
                remove_proc_entry("cpqarray", proc_root_driver);
                return -ENODEV;
        }
index bad2a82459aed8a8478fdc0438524a0934a967e1..f6ae50426171e96448081419640d252bc55bcefc 100644 (file)
@@ -1934,7 +1934,7 @@ static int __init aztcd_init(void)
 err_out3:
        put_disk(azt_disk);
 err_out2:
-       devfs_find_and_unregister(NULL, "aztcd", 0, 0, DEVFS_SPECIAL_BLK, 0);
+       devfs_remove("aztcd");
 err_out:
        if ((azt_port == 0x1f0) || (azt_port == 0x170)) {
                SWITCH_IDE_MASTER;
@@ -1947,7 +1947,7 @@ err_out:
 
 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);
        put_disk(azt_disk);
        if ((unregister_blkdev(MAJOR_NR, "aztcd") == -EINVAL)) {
index 8259f6ad36fe1a400e0574f83d2cc79a0932c2c3..2bcdc511940b7103879920e0d1d229391446d52f 100644 (file)
@@ -883,7 +883,7 @@ static void __exit gscd_exit(void)
 {
        CLEAR_TIMER;
 
-       devfs_find_and_unregister(NULL, "gscd", 0, 0, DEVFS_SPECIAL_BLK, 0);
+       devfs_remove("gscd");
        del_gendisk(gscd_disk);
        put_disk(gscd_disk);
        if ((unregister_blkdev(MAJOR_NR, "gscd") == -EINVAL)) {
index 1f833ebab337a8abd962312838208f1d88192d8a..1b4c868473f8f4f49e6de396889c45f45f68c9a9 100644 (file)
@@ -2067,7 +2067,7 @@ static int __init optcd_init(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);
        put_disk(optcd_disk);
        if (unregister_blkdev(MAJOR_NR, "optcd") == -EINVAL) {
index 4e49fdce94de90a80983100408093fc0de5956a1..02586e173fd3445d213e87d2729023b408ef3322 100644 (file)
@@ -1801,7 +1801,7 @@ out1:
 
 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);
        put_disk(sjcd_disk);
        release_region(sjcd_base, 4);
index 20d010e83bd9b80887f9f959b9805365cf4a754d..8fd72e2039bb043e90359d153922a14c11b1148c 100644 (file)
@@ -1671,8 +1671,7 @@ static sony535_exit(void)
        kfree(sony_buffer);
        kfree(last_sony_subcode);
        kfree(sony_toc);
-       devfs_find_and_unregister(NULL, CDU535_HANDLE, 0, 0,
-                                 DEVFS_SPECIAL_BLK, 0);
+       devfs_remove(CDU535_HANDLE);
        del_gendisk(cdu_disk);
        put_disk(cdu_disk);
        blk_cleanup_queue(&sonycd535_queue);
index 8d120c757ae3e699f10b4edb2f475f0facecafe5..82bfe2ef9e8911a3f6de3cf177e987db546cab55 100644 (file)
@@ -415,8 +415,6 @@ int init_module(void)
 void cleanup_module(void)
 {
        int i;
-       char devname[9];
-
        TRACE_FUN(ft_t_flow);
 
        if (unregister_chrdev(QIC117_TAPE_MAJOR, "zft") != 0) {
@@ -425,18 +423,12 @@ void cleanup_module(void)
                TRACE(ft_t_info, "successful");
        }
         for (i = 0; i < 4; i++) {
-               sprintf(devname, "qft%i", i);
-               devfs_find_and_unregister(NULL, devname, QIC117_TAPE_MAJOR, i, DEVFS_SPECIAL_CHR, 0);
-               sprintf(devname, "nqft%i", i);
-               devfs_find_and_unregister(NULL, devname, QIC117_TAPE_MAJOR, i + 4, DEVFS_SPECIAL_CHR, 0);
-               sprintf(devname, "zqft%i", i);
-               devfs_find_and_unregister(NULL, devname, QIC117_TAPE_MAJOR, i + 16, DEVFS_SPECIAL_CHR, 0);
-               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);
+               devfs_remove("qft%i", i);
+               devfs_remove("nqft%i", i);
+               devfs_remove("zqft%i", i);
+               devfs_remove("nzqft%i", i);
+               devfs_remove("rawqft%i", i);
+               devfs_remove("nrawqft%i", i);
        }
        zft_uninit_mem(); /* release remaining memory, if any */
         printk(KERN_INFO "zftape successfully unloaded.\n");
index 729ae0d02a5bf443bacf6704c9b510414698be62..2c4aaa11a0002d4ab5ac057ba894638a269544d3 100644 (file)
@@ -2766,22 +2766,14 @@ void cleanup_module(void)
        if (status_zombie == NO)
                qic02_release_resources();
                
-       devfs_find_and_unregister(NULL, "ntpqic11", QIC02_TAPE_MAJOR, 2,
-                                 DEVFS_SPECIAL_CHR, 0);
-       devfs_find_and_unregister(NULL, "tpqic11", QIC02_TAPE_MAJOR, 3,
-                                 DEVFS_SPECIAL_CHR, 0);
-       devfs_find_and_unregister(NULL, "ntpqic24", QIC02_TAPE_MAJOR, 4,
-                                 DEVFS_SPECIAL_CHR, 0);
-       devfs_find_and_unregister(NULL, "tpqic24", QIC02_TAPE_MAJOR, 5,
-                                 DEVFS_SPECIAL_CHR, 0);
-       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);
+       devfs_remove("ntpqic11");
+       devfs_remove("tpqic11");
+       devfs_remove("ntpqic24");
+       devfs_remove("tpqic24");
+       devfs_remove("ntpqic120");
+       devfs_remove("tpqic120");
+       devfs_remove("ntpqic150");
+       devfs_remove("tpqic150");
 }
 
 int init_module(void)
index 6b0092a71bae6ce4540951e1351ccb228f15af88..60a86cad788dbd89b99cbc9457e0e13d14169e22 100644 (file)
@@ -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)
 {
-#ifdef CONFIG_DEVFS_FS
-       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 */
+       devfs_remove(driver->name, minor-driver->minor_start+driver->name_base);
 }
 
 EXPORT_SYMBOL(tty_register_devfs);
index d1015453e24a5779ca6aa3ff71b50d379e8f5bba..2fe40dfbd42517b92d6e9c7bf814617401c6b738 100644 (file)
@@ -470,30 +470,24 @@ static struct file_operations vcs_fops = {
        .open           = vcs_open,
 };
 
-static devfs_handle_t devfs_handle;
-
 void vcs_make_devfs (unsigned int index, int unregister)
 {
 #ifdef CONFIG_DEVFS_FS
-    char name[8];
-
-    sprintf (name, "a%u", index + 1);
-    if (unregister)
-    {
-       devfs_find_and_unregister(devfs_handle, name + 1, 0, 0,
-                                 DEVFS_SPECIAL_CHR, 0);
-       devfs_find_and_unregister(devfs_handle, name, 0, 0,
-                                 DEVFS_SPECIAL_CHR, 0);
-    }
-    else
-    {
-       devfs_register (devfs_handle, name + 1, DEVFS_FL_DEFAULT,
-                       VCS_MAJOR, index + 1,
-                       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);
-    }
+
+       if (unregister) {
+               devfs_remove("vcc/%u", index + 1);
+               devfs_remove("vcc/a%u", index + 1);
+       } else {
+               char name[16];
+               sprintf(name, "vcc/%u", index + 1);
+               devfs_register(NULL, name, DEVFS_FL_DEFAULT,
+                               VCS_MAJOR, index + 1,
+                               S_IFCHR | S_IRUSR | S_IWUSR, &vcs_fops, NULL);
+               sprintf(name, "vcc/a%u", index + 1);
+               devfs_register(NULL, name, DEVFS_FL_DEFAULT,
+                               VCS_MAJOR, index + 129,
+                               S_IFCHR | S_IRUSR | S_IWUSR, &vcs_fops, NULL);
+       }
 #endif /* CONFIG_DEVFS_FS */
 }
 
@@ -506,12 +500,9 @@ int __init vcs_init(void)
        if (error)
                printk("unable to get major %d for vcs device", VCS_MAJOR);
 
-       devfs_handle = devfs_mk_dir (NULL, "vcc", NULL);
-       devfs_register (devfs_handle, "0", DEVFS_FL_DEFAULT,
-                       VCS_MAJOR, 0,
+       devfs_register(NULL, "vcc/0", DEVFS_FL_DEFAULT, VCS_MAJOR, 0,
                        S_IFCHR | S_IRUSR | S_IWUSR, &vcs_fops, NULL);
-       devfs_register (devfs_handle, "a", DEVFS_FL_DEFAULT,
-                       VCS_MAJOR, 128,
+       devfs_register(NULL, "vcc/a", DEVFS_FL_DEFAULT, VCS_MAJOR, 128,
                        S_IFCHR | S_IRUSR | S_IWUSR, &vcs_fops, NULL);
 
        return error;
index ed518726231d3d146bbc32cf49f954939207f86b..cd8d1fc925b836745b01a269a6aa40653ea8aa10 100644 (file)
@@ -2588,9 +2588,7 @@ static int dv1394_devfs_add_dir(char *name)
 
 void dv1394_devfs_del(char *name)
 {
-       char s[64];
-       sprintf(s, "ieee1394/%s", name);
-       devfs_find_and_unregister(NULL, s, 0, 0, 0, 0);
+       devfs_remove("ieee1394/%s", name);
 }
 #endif /* CONFIG_DEVFS_FS */
 
index e757db81476c400d34c8ac8cb801bf90bcc30409..4f5f34a958a12740740de214411f379bdfa1b5a6 100644 (file)
@@ -1527,7 +1527,7 @@ static void __exit capi_exit(void)
        proc_exit();
 
        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
        capinc_tty_exit();
index 6755b0c0a09a1873da0ab55d8a01a467c902fe66..a3bb66d0873f68be2a59b684bc4c1566ec0a8d19 100644 (file)
@@ -1111,7 +1111,7 @@ void dm_interface_exit(void)
 {
        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)
                DMERR("misc_deregister failed for control device");
index f86541f62d57ea56c322e8c78b304fddd68de463..93a1fa186258d34f4b6bc36a832e60fe4fd581a2 100644 (file)
@@ -42,8 +42,8 @@ void fs3270_devfs_register(tub_t *tubp)
 {
        char name[16];
 
-       sprintf(name, "tub%.4x", tubp->devno);
-       devfs_register(fs3270_devfs_dir, name, DEVFS_FL_DEFAULT,
+       sprintf(name, "3270/tub%.4x", tubp->devno);
+       devfs_register(NULL, name, DEVFS_FL_DEFAULT,
                       IBM_FS3270_MAJOR, tubp->minor,
                       S_IFCHR | S_IRUSR | S_IWUSR, &fs3270_fops, NULL);
        sprintf(name, "tty%.4x", tubp->devno);
@@ -53,16 +53,8 @@ void fs3270_devfs_register(tub_t *tubp)
 
 void fs3270_devfs_unregister(tub_t *tubp)
 {
-       char name[16];
-
-       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);
+       devfs_remove("3270/tub%.4x", tubp->devno);
+       devfs_remove("3270/tty%.4x", tubp->devno);
 }
 #endif
 
index 964bddb1b565326c31f1ce3e2b4dcb659b03e176..de26157197d82e2cb16a98d37bb1178f5591ac16 100644 (file)
@@ -1902,6 +1902,20 @@ void devfs_find_and_unregister (devfs_handle_t dir, const char *name,
     devfs_put (de);
 }   /*  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.
@@ -2317,6 +2331,7 @@ EXPORT_SYMBOL(devfs_mk_symlink);
 EXPORT_SYMBOL(devfs_mk_dir);
 EXPORT_SYMBOL(devfs_get_handle);
 EXPORT_SYMBOL(devfs_find_and_unregister);
+EXPORT_SYMBOL(devfs_remove);
 EXPORT_SYMBOL(devfs_get_flags);
 EXPORT_SYMBOL(devfs_set_flags);
 EXPORT_SYMBOL(devfs_get_maj_min);
index 89b10b9aa758e3b66674e97fda82d65b71b7da2d..662456da72819ca6c1cd81f6de49e4643b6bd1b4 100644 (file)
@@ -99,11 +99,8 @@ EXPORT_SYMBOL(devfs_register_tape);
 
 void devfs_unregister_tape(int num)
 {
-       if (num >= 0) {
-               char name[32];
-               sprintf(name, "tapes/tape%u", num);
-               devfs_find_and_unregister(NULL, name, 0, 0, 0, 0);
-       }
+       if (num >= 0)
+               devfs_remove("tapes/tape%u", num);
 }
 
 EXPORT_SYMBOL(devfs_unregister_tape);
index 38515114201de68b5722a3dc36dd6f8e77198ff3..8d506c73e0f7cad08bc1b61d734071ec44532599 100644 (file)
@@ -254,15 +254,11 @@ static void devfs_remove_partitions(struct gendisk *dev)
        devfs_unregister(dev->disk_de);
        dev->disk_de = NULL;
        if (dev->flags & GENHD_FL_CD) {
-               char name[64];
-               sprintf(name, "cdroms/cdrom%d", dev->number);
                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);
        } else {
-               char name[64];
-               sprintf(name, "discs/disc%d", dev->number);
-               devfs_find_and_unregister(NULL, name, 0, 0, 0, 0);
+               devfs_remove("discs/disc%d", dev->number);
                if (!(dev->flags & GENHD_FL_DEVFS)) {
                        devfs_unregister(dev->de);
                        dev->de = NULL;
index a6da1f5d84e8cdd4767f4b873c017fe920c26f87..f05155aaf71f6175162240a883ea2629c7248a1d 100644 (file)
@@ -39,6 +39,8 @@
 
 typedef struct devfs_entry * devfs_handle_t;
 
+extern void devfs_remove(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
+
 #ifdef CONFIG_DEVFS_FS
 
 struct unique_numspace
@@ -159,6 +161,9 @@ static inline void devfs_find_and_unregister (devfs_handle_t dir,
                                              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)
 {
     return 0;
index 9792d9ee75a136a0ad117c6f62c1c51753c373ad..f9e7f43bc77f857299c90acd44aa3e1f0071a353 100644 (file)
@@ -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)
 {
-#ifdef CONFIG_DEVFS_FS
-       char dname[32];
-#endif
-
        snd_runtime_check(entry, return);
        down(&info_mutex);
        snd_remove_proc_entry(snd_proc_dev, entry->p);
        up(&info_mutex);
-#ifdef CONFIG_DEVFS_FS
-       if (entry->p && strncmp(entry->name, "controlC", 8)) {
-               sprintf(dname, "snd/%s", entry->name);
-               devfs_find_and_unregister(NULL, dname, 0, 0, DEVFS_SPECIAL_CHR, 0);
-       }
-#endif
+       if (entry->p && strncmp(entry->name, "controlC", 8))
+               devfs_remove("snd/%s", entry->name);
        snd_info_free_entry(entry);
 }
 
index c3b3e2abdff28f3a3aa59d7825fcd3532ae48388..a5b85f4dd8b1eded9f3d9901b6ec3031f590d5d7 100644 (file)
@@ -351,16 +351,11 @@ static int __init alsa_sound_init(void)
 
 static void __exit alsa_sound_exit(void)
 {
-#ifdef CONFIG_DEVFS_FS
-       char controlname[24];
        short controlnum;
 
-       for (controlnum = 0; controlnum < cards_limit; controlnum++) {
-               sprintf(controlname, "snd/controlC%d", controlnum);
-               devfs_find_and_unregister(NULL, controlname, 0, 0, DEVFS_SPECIAL_CHR, 0);
-       }
-#endif
-       
+       for (controlnum = 0; controlnum < cards_limit; controlnum++)
+               devfs_remove("snd/controlC%d", controlnum);
+
 #ifdef CONFIG_SND_OSSEMUL
        snd_info_minor_unregister();
 #endif
index 0ddbf397049fac1391d94d021155a9f571d78932..4d29d0ec11a53121995841c89a758e30e922908c 100644 (file)
@@ -542,38 +542,6 @@ static const struct {
         &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 dmabug = 0;
 
@@ -583,6 +551,8 @@ MODULE_PARM(dmabug, "i");
 static int __init oss_init(void)
 {
        int             err;
+       char name_buf[32];
+       int i, j;
        
        /* drag in sound_syms.o */
        {
@@ -604,7 +574,22 @@ static int __init oss_init(void)
        /* Protecting the innocent */
        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)
                printk(KERN_ERR "Sound warning: Deallocation table was too small.\n");
@@ -614,12 +599,18 @@ static int __init oss_init(void)
 
 static void __exit oss_cleanup(void)
 {
-       int i;
+       int i, j;
 
        if (MOD_IN_USE)
                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(8);