--- 25-akpm/drivers/base/Kconfig | 16 +++++----- 25-akpm/drivers/base/class.c | 6 +--- 25-akpm/drivers/char/dsp56k.c | 27 ++++++++++++++++-- 25-akpm/drivers/char/ftape/zftape/zftape-init.c | 17 +++++++++++ 25-akpm/drivers/char/istallion.c | 11 ++++++- 25-akpm/drivers/char/stallion.c | 10 ++++++ 25-akpm/drivers/char/tipar.c | 16 +++++++--- 25-akpm/drivers/char/tpqic02.c | 22 ++++++++++++++ 25-akpm/drivers/char/vc_screen.c | 10 ++++++ 25-akpm/drivers/char/vt.c | 3 +- 25-akpm/drivers/isdn/capi/capi.c | 14 +++++++++ 25-akpm/drivers/video/fbmem.c | 19 ++++++++++++ 25-akpm/fs/coda/psdev.c | 36 ++++++++++++++++++++---- 25-akpm/lib/kobject.c | 6 ++-- 14 files changed, 183 insertions(+), 30 deletions(-) diff -puN drivers/base/class.c~bk-driver-core drivers/base/class.c --- 25/drivers/base/class.c~bk-driver-core 2004-04-14 20:06:58.899256816 -0700 +++ 25-akpm/drivers/base/class.c 2004-04-14 20:06:58.924253016 -0700 @@ -155,8 +155,7 @@ static int class_device_dev_link(struct static void class_device_dev_unlink(struct class_device * class_dev) { - if (class_dev->dev) - sysfs_remove_link(&class_dev->kobj, "device"); + sysfs_remove_link(&class_dev->kobj, "device"); } static int class_device_driver_link(struct class_device * class_dev) @@ -169,8 +168,7 @@ static int class_device_driver_link(stru static void class_device_driver_unlink(struct class_device * class_dev) { - if ((class_dev->dev) && (class_dev->dev->driver)) - sysfs_remove_link(&class_dev->kobj, "driver"); + sysfs_remove_link(&class_dev->kobj, "driver"); } diff -puN drivers/base/Kconfig~bk-driver-core drivers/base/Kconfig --- 25/drivers/base/Kconfig~bk-driver-core 2004-04-14 20:06:58.901256512 -0700 +++ 25-akpm/drivers/base/Kconfig 2004-04-14 20:06:58.924253016 -0700 @@ -9,14 +9,14 @@ config FW_LOADER the kernel tree does. config DEBUG_DRIVER - bool "Driver Core verbose debug messages" - depends on DEBUG_KERNEL - help - Say Y here if you want the Driver core to produce a bunch of - debug messages to the system log. Select this if you are having a - problem with the driver core and want to see more of what is - going on. + bool "Driver Core verbose debug messages" + depends on DEBUG_KERNEL + help + Say Y here if you want the Driver core to produce a bunch of + debug messages to the system log. Select this if you are having a + problem with the driver core and want to see more of what is + going on. - If you are unsure about this, say N here. + If you are unsure about this, say N here. endmenu diff -puN drivers/char/dsp56k.c~bk-driver-core drivers/char/dsp56k.c --- 25/drivers/char/dsp56k.c~bk-driver-core 2004-04-14 20:06:58.902256360 -0700 +++ 25-akpm/drivers/char/dsp56k.c 2004-04-14 20:06:58.925252864 -0700 @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -149,6 +150,8 @@ static struct dsp56k_device { int tx_wsize, rx_wsize; } dsp56k; +static struct class_simple *dsp56k_class; + static int dsp56k_reset(void) { u_char status; @@ -502,6 +505,8 @@ static char banner[] __initdata = KERN_I static int __init dsp56k_init_driver(void) { + int err = 0; + if(!MACH_IS_ATARI || !ATARIHW_PRESENT(DSP56K)) { printk("DSP56k driver: Hardware not present\n"); return -ENODEV; @@ -511,17 +516,35 @@ static int __init dsp56k_init_driver(voi printk("DSP56k driver: Unable to register driver\n"); return -ENODEV; } + dsp56k_class = class_simple_create(THIS_MODULE, "dsp56k"); + if (IS_ERR(dsp56k_class)) { + err = PTR_ERR(dsp56k_class); + goto out_chrdev; + } + class_simple_device_add(dsp56k_class, MKDEV(DSP56K_MAJOR, 0), NULL, "dsp56k"); - devfs_mk_cdev(MKDEV(DSP56K_MAJOR, 0), + err = devfs_mk_cdev(MKDEV(DSP56K_MAJOR, 0), S_IFCHR | S_IRUSR | S_IWUSR, "dsp56k"); + if(err) + goto out_class; printk(banner); - return 0; + goto out; + +out_class: + class_simple_device_remove(MKDEV(DSP56K_MAJOR, 0)); + class_simple_destroy(dsp56k_class); +out_chrdev: + unregister_chrdev(DSP56K_MAJOR, "dsp56k"); +out: + return err; } module_init(dsp56k_init_driver); static void __exit dsp56k_cleanup_driver(void) { + class_simple_device_remove(MKDEV(DSP56K_MAJOR, 0)); + class_simple_destroy(dsp56k_class); unregister_chrdev(DSP56K_MAJOR, "dsp56k"); devfs_remove("dsp56k"); } diff -puN drivers/char/ftape/zftape/zftape-init.c~bk-driver-core drivers/char/ftape/zftape/zftape-init.c --- 25/drivers/char/ftape/zftape/zftape-init.c~bk-driver-core 2004-04-14 20:06:58.904256056 -0700 +++ 25-akpm/drivers/char/ftape/zftape/zftape-init.c 2004-04-14 20:06:58.926252712 -0700 @@ -38,6 +38,7 @@ #include #include +#include #include "../zftape/zftape-init.h" #include "../zftape/zftape-read.h" @@ -103,6 +104,8 @@ static struct file_operations zft_cdev = .release = zft_close, }; +static struct class_simple *zft_class; + /* Open floppy tape device */ static int zft_open(struct inode *ino, struct file *filep) @@ -341,22 +344,29 @@ KERN_INFO "installing zftape VFS interface for ftape driver ..."); TRACE_CATCH(register_chrdev(QIC117_TAPE_MAJOR, "zft", &zft_cdev),); + zft_class = class_simple_create(THIS_MODULE, "zft"); for (i = 0; i < 4; i++) { + class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i), NULL, "qft%i", i); devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i), S_IFCHR | S_IRUSR | S_IWUSR, "qft%i", i); + class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 4), NULL, "nqft%i", i); devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 4), S_IFCHR | S_IRUSR | S_IWUSR, "nqft%i", i); + class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 16), NULL, "zqft%i", i); devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 16), S_IFCHR | S_IRUSR | S_IWUSR, "zqft%i", i); + class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 20), NULL, "nzqft%i", i); devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 20), S_IFCHR | S_IRUSR | S_IWUSR, "nzqft%i", i); + class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 32), NULL, "rawqft%i", i); devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 32), S_IFCHR | S_IRUSR | S_IWUSR, "rawqft%i", i); + class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 36), NULL, "nrawrawqft%i", i); devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 36), S_IFCHR | S_IRUSR | S_IWUSR, "nrawqft%i", i); @@ -386,12 +396,19 @@ static void zft_exit(void) } for (i = 0; i < 4; i++) { devfs_remove("qft%i", i); + class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i)); devfs_remove("nqft%i", i); + class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 4)); devfs_remove("zqft%i", i); + class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 16)); devfs_remove("nzqft%i", i); + class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 20)); devfs_remove("rawqft%i", i); + class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 32)); devfs_remove("nrawqft%i", i); + class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 36)); } + class_simple_destroy(zft_class); zft_uninit_mem(); /* release remaining memory, if any */ printk(KERN_INFO "zftape successfully unloaded.\n"); TRACE_EXIT; diff -puN drivers/char/istallion.c~bk-driver-core drivers/char/istallion.c --- 25/drivers/char/istallion.c~bk-driver-core 2004-04-14 20:06:58.906255752 -0700 +++ 25-akpm/drivers/char/istallion.c 2004-04-14 20:06:58.930252104 -0700 @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -795,6 +796,8 @@ static int stli_timeron; /*****************************************************************************/ +static struct class_simple *istallion_class; + #ifdef MODULE /* @@ -853,9 +856,12 @@ static void __exit istallion_module_exit return; } put_tty_driver(stli_serial); - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { devfs_remove("staliomem/%d", i); + class_simple_device_remove(MKDEV(STL_SIOMEMMAJOR, i)); + } devfs_remove("staliomem"); + class_simple_destroy(istallion_class); if ((i = unregister_chrdev(STL_SIOMEMMAJOR, "staliomem"))) printk("STALLION: failed to un-register serial memory device, " "errno=%d\n", -i); @@ -5310,10 +5316,13 @@ int __init stli_init(void) "device\n"); devfs_mk_dir("staliomem"); + istallion_class = class_simple_create(THIS_MODULE, "staliomem"); for (i = 0; i < 4; i++) { devfs_mk_cdev(MKDEV(STL_SIOMEMMAJOR, i), S_IFCHR | S_IRUSR | S_IWUSR, "staliomem/%d", i); + class_simple_device_add(istallion_class, MKDEV(STL_SIOMEMMAJOR, i), + NULL, "staliomem%d", i); } /* diff -puN drivers/char/stallion.c~bk-driver-core drivers/char/stallion.c --- 25/drivers/char/stallion.c~bk-driver-core 2004-04-14 20:06:58.908255448 -0700 +++ 25-akpm/drivers/char/stallion.c 2004-04-14 20:06:58.933251648 -0700 @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -732,6 +733,8 @@ static struct file_operations stl_fsiome /*****************************************************************************/ +static struct class_simple *stallion_class; + #ifdef MODULE /* @@ -788,12 +791,15 @@ static void __exit stallion_module_exit( restore_flags(flags); return; } - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { devfs_remove("staliomem/%d", i); + class_simple_device_remove(MKDEV(STL_SIOMEMMAJOR, i)); + } devfs_remove("staliomem"); if ((i = unregister_chrdev(STL_SIOMEMMAJOR, "staliomem"))) printk("STALLION: failed to un-register serial memory device, " "errno=%d\n", -i); + class_simple_destroy(stallion_class); if (stl_tmpwritebuf != (char *) NULL) kfree(stl_tmpwritebuf); @@ -3181,10 +3187,12 @@ int __init stl_init(void) printk("STALLION: failed to register serial board device\n"); devfs_mk_dir("staliomem"); + stallion_class = class_simple_create(THIS_MODULE, "staliomem"); for (i = 0; i < 4; i++) { devfs_mk_cdev(MKDEV(STL_SIOMEMMAJOR, i), S_IFCHR|S_IRUSR|S_IWUSR, "staliomem/%d", i); + class_simple_device_add(stallion_class, MKDEV(STL_SIOMEMMAJOR, i), NULL, "staliomem%d", i); } stl_serial->owner = THIS_MODULE; diff -puN drivers/char/tipar.c~bk-driver-core drivers/char/tipar.c --- 25/drivers/char/tipar.c~bk-driver-core 2004-04-14 20:06:58.910255144 -0700 +++ 25-akpm/drivers/char/tipar.c 2004-04-14 20:06:58.934251496 -0700 @@ -67,7 +67,7 @@ /* * Version Information */ -#define DRIVER_VERSION "1.17" +#define DRIVER_VERSION "1.19" #define DRIVER_AUTHOR "Romain Lievin " #define DRIVER_DESC "Device driver for TI/PC parallel link cables" #define DRIVER_LICENSE "GPL" @@ -361,10 +361,13 @@ tipar_ioctl(struct inode *inode, struct switch (cmd) { case IOCTL_TIPAR_DELAY: - delay = (int)arg; //get_user(delay, &arg); - break; + delay = (int)arg; //get_user(delay, &arg); + break; case IOCTL_TIPAR_TIMEOUT: - timeout = (int)arg; //get_user(timeout, &arg); + if (arg != 0) + timeout = (int)arg; + else + retval = -EINVAL; break; default: retval = -ENOTTY; @@ -399,7 +402,10 @@ tipar_setup(char *str) str = get_options(str, ARRAY_SIZE(ints), ints); if (ints[0] > 0) { - timeout = ints[1]; + if (ints[1] != 0) + timeout = ints[1]; + else + printk("tipar: wrong timeout value (0), using default value instead."); if (ints[0] > 1) { delay = ints[2]; } diff -puN drivers/char/tpqic02.c~bk-driver-core drivers/char/tpqic02.c --- 25/drivers/char/tpqic02.c~bk-driver-core 2004-04-14 20:06:58.911254992 -0700 +++ 25-akpm/drivers/char/tpqic02.c 2004-04-14 20:06:58.937251040 -0700 @@ -94,6 +94,7 @@ #include #include #include +#include #include #include @@ -229,6 +230,8 @@ static const char *format_names[] = { "600" /* untested. */ }; +static struct class_simple *tpqic02_class; + /* `exception_list' is needed for exception status reporting. * Exceptions 1..14 are defined by QIC-02 rev F. @@ -2696,23 +2699,32 @@ int __init qic02_tape_init(void) return -ENODEV; } + tpqic02_class = class_simple_create(THIS_MODULE, TPQIC02_NAME); + class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 2), NULL, "ntpqic11"); devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 2), S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "ntpqic11"); + class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 3), NULL, "tpqic11"); devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 3), S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "tpqic11"); + class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 4), NULL, "ntpqic24"); devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 4), S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "ntpqic24"); + class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 5), NULL, "tpqic24"); devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 5), S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "tpqic24"); + class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 6), NULL, "ntpqic20"); devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 6), S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "ntpqic120"); + class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 7), NULL, "tpqic20"); devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 7), S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "tpqic120"); + class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 8), NULL, "ntpqic50"); devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 8), S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "ntpqic150"); + class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 9), NULL, "tpqic50"); devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 9), S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "tpqic150"); @@ -2757,13 +2769,23 @@ static void qic02_module_exit(void) qic02_release_resources(); devfs_remove("ntpqic11"); + class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 2)); devfs_remove("tpqic11"); + class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 3)); devfs_remove("ntpqic24"); + class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 4)); devfs_remove("tpqic24"); + class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 5)); devfs_remove("ntpqic120"); + class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 6)); devfs_remove("tpqic120"); + class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 7)); devfs_remove("ntpqic150"); + class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 8)); devfs_remove("tpqic150"); + class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 9)); + + class_simple_destroy(tpqic02_class); } static int qic02_module_init(void) diff -puN drivers/char/vc_screen.c~bk-driver-core drivers/char/vc_screen.c --- 25/drivers/char/vc_screen.c~bk-driver-core 2004-04-14 20:06:58.912254840 -0700 +++ 25-akpm/drivers/char/vc_screen.c 2004-04-14 20:06:58.938250888 -0700 @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -469,6 +470,8 @@ static struct file_operations vcs_fops = .open = vcs_open, }; +static struct class_simple *vc_class; + void vcs_make_devfs(struct tty_struct *tty) { devfs_mk_cdev(MKDEV(VCS_MAJOR, tty->index + 1), @@ -477,19 +480,26 @@ void vcs_make_devfs(struct tty_struct *t devfs_mk_cdev(MKDEV(VCS_MAJOR, tty->index + 129), S_IFCHR|S_IRUSR|S_IWUSR, "vcc/a%u", tty->index + 1); + class_simple_device_add(vc_class, MKDEV(VCS_MAJOR, tty->index + 1), NULL, "vcs%u", tty->index + 1); + class_simple_device_add(vc_class, MKDEV(VCS_MAJOR, tty->index + 129), NULL, "vcsa%u", tty->index + 1); } void vcs_remove_devfs(struct tty_struct *tty) { devfs_remove("vcc/%u", tty->index + 1); devfs_remove("vcc/a%u", tty->index + 1); + class_simple_device_remove(MKDEV(VCS_MAJOR, tty->index + 1)); + class_simple_device_remove(MKDEV(VCS_MAJOR, tty->index + 129)); } int __init vcs_init(void) { if (register_chrdev(VCS_MAJOR, "vcs", &vcs_fops)) panic("unable to get major %d for vcs device", VCS_MAJOR); + vc_class = class_simple_create(THIS_MODULE, "vc"); devfs_mk_cdev(MKDEV(VCS_MAJOR, 0), S_IFCHR|S_IRUSR|S_IWUSR, "vcc/0"); devfs_mk_cdev(MKDEV(VCS_MAJOR, 128), S_IFCHR|S_IRUSR|S_IWUSR, "vcc/a0"); + class_simple_device_add(vc_class, MKDEV(VCS_MAJOR, 0), NULL, "vcs"); + class_simple_device_add(vc_class, MKDEV(VCS_MAJOR, 128), NULL, "vcsa"); return 0; } diff -puN drivers/char/vt.c~bk-driver-core drivers/char/vt.c --- 25/drivers/char/vt.c~bk-driver-core 2004-04-14 20:06:58.914254536 -0700 +++ 25-akpm/drivers/char/vt.c 2004-04-14 20:06:58.950249064 -0700 @@ -2617,6 +2617,8 @@ static struct tty_operations con_ops = { int __init vty_init(void) { + vcs_init(); + console_driver = alloc_tty_driver(MAX_NR_CONSOLES); if (!console_driver) panic("Couldn't allocate console driver\n"); @@ -2644,7 +2646,6 @@ int __init vty_init(void) #ifdef CONFIG_FRAMEBUFFER_CONSOLE fb_console_init(); #endif - vcs_init(); return 0; } diff -puN drivers/isdn/capi/capi.c~bk-driver-core drivers/isdn/capi/capi.c --- 25/drivers/isdn/capi/capi.c~bk-driver-core 2004-04-14 20:06:58.915254384 -0700 +++ 25-akpm/drivers/isdn/capi/capi.c 2004-04-14 20:06:58.952248760 -0700 @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -56,6 +57,8 @@ MODULE_LICENSE("GPL"); /* -------- driver information -------------------------------------- */ +static struct class_simple *capi_class; + int capi_major = 68; /* allocated */ #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE #define CAPINC_NR_PORTS 32 @@ -1483,11 +1486,20 @@ static int __init capi_init(void) return -EIO; } + capi_class = class_simple_create(THIS_MODULE, "capi"); + if (IS_ERR(capi_class)) { + unregister_chrdev(capi_major, "capi20"); + return PTR_ERR(capi_class); + } + + class_simple_device_add(capi_class, MKDEV(capi_major, 0), NULL, "capi20"); devfs_mk_cdev(MKDEV(capi_major, 0), S_IFCHR | S_IRUSR | S_IWUSR, "isdn/capi20"); #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE if (capinc_tty_init() < 0) { + class_simple_device_remove(MKDEV(capi_major, 0)); + class_simple_destroy(capi_class); unregister_chrdev(capi_major, "capi20"); return -ENOMEM; } @@ -1514,6 +1526,8 @@ static void __exit capi_exit(void) { proc_exit(); + class_simple_device_remove(MKDEV(capi_major, 0)); + class_simple_destroy(capi_class); unregister_chrdev(capi_major, "capi20"); devfs_remove("isdn/capi20"); diff -puN drivers/video/fbmem.c~bk-driver-core drivers/video/fbmem.c --- 25/drivers/video/fbmem.c~bk-driver-core 2004-04-14 20:06:58.917254080 -0700 +++ 25-akpm/drivers/video/fbmem.c 2004-04-14 20:06:58.954248456 -0700 @@ -32,6 +32,9 @@ #include #endif #include +#include +#include +#include #if defined(__mc68000__) || defined(CONFIG_APUS) #include @@ -1245,6 +1248,8 @@ static struct file_operations fb_fops = #endif }; +static struct class_simple *fb_class; + /** * register_framebuffer - registers a frame buffer device * @fb_info: frame buffer info structure @@ -1259,6 +1264,7 @@ int register_framebuffer(struct fb_info *fb_info) { int i; + struct class_device *c; if (num_registered_fb == FB_MAX) return -ENXIO; @@ -1267,6 +1273,12 @@ register_framebuffer(struct fb_info *fb_ if (!registered_fb[i]) break; fb_info->node = i; + + c = class_simple_device_add(fb_class, MKDEV(FB_MAJOR, i), NULL, "fb%d", i); + if (IS_ERR(c)) { + /* Not fatal */ + printk(KERN_WARNING "Unable to create class_device for framebuffer %d; errno = %ld\n", i, PTR_ERR(c)); + } if (fb_info->pixmap.addr == NULL) { fb_info->pixmap.addr = kmalloc(FBPIXMAPSIZE, GFP_KERNEL); @@ -1332,6 +1344,7 @@ unregister_framebuffer(struct fb_info *f kfree(fb_info->sprite.addr); registered_fb[i]=NULL; num_registered_fb--; + class_simple_device_remove(MKDEV(FB_MAJOR, i)); return 0; } @@ -1393,6 +1406,12 @@ fbmem_init(void) if (register_chrdev(FB_MAJOR,"fb",&fb_fops)) printk("unable to get major %d for fb devs\n", FB_MAJOR); + fb_class = class_simple_create(THIS_MODULE, "graphics"); + if (IS_ERR(fb_class)) { + printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class)); + fb_class = NULL; + } + #ifdef CONFIG_FB_OF if (ofonly) { offb_init(); diff -puN fs/coda/psdev.c~bk-driver-core fs/coda/psdev.c --- 25/fs/coda/psdev.c~bk-driver-core 2004-04-14 20:06:58.918253928 -0700 +++ 25-akpm/fs/coda/psdev.c 2004-04-14 20:06:58.955248304 -0700 @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -61,6 +62,7 @@ unsigned long coda_timeout = 30; /* .. s struct venus_comm coda_comms[MAX_CODADEVS]; +static struct class_simple *coda_psdev_class; /* * Device operations @@ -358,20 +360,38 @@ static struct file_operations coda_psdev static int init_coda_psdev(void) { - int i; + int i, err = 0; if (register_chrdev(CODA_PSDEV_MAJOR,"coda_psdev", &coda_psdev_fops)) { printk(KERN_ERR "coda_psdev: unable to get major %d\n", CODA_PSDEV_MAJOR); return -EIO; } + coda_psdev_class = class_simple_create(THIS_MODULE, "coda_psdev"); + if (IS_ERR(coda_psdev_class)) { + err = PTR_ERR(coda_psdev_class); + goto out_chrdev; + } devfs_mk_dir ("coda"); for (i = 0; i < MAX_CODADEVS; i++) { - devfs_mk_cdev(MKDEV(CODA_PSDEV_MAJOR, i), + class_simple_device_add(coda_psdev_class, MKDEV(CODA_PSDEV_MAJOR,i), + NULL, "cfs%d", i); + err = devfs_mk_cdev(MKDEV(CODA_PSDEV_MAJOR, i), S_IFCHR|S_IRUSR|S_IWUSR, "coda/%d", i); + if (err) + goto out_class; } coda_sysctl_init(); - return 0; + goto out; + +out_class: + for (i = 0; i < MAX_CODADEVS; i++) + class_simple_device_remove(MKDEV(CODA_PSDEV_MAJOR, i)); + class_simple_destroy(coda_psdev_class); +out_chrdev: + unregister_chrdev(CODA_PSDEV_MAJOR, "coda_psdev"); +out: + return err; } @@ -408,8 +428,11 @@ static int __init init_coda(void) } return 0; out: - for (i = 0; i < MAX_CODADEVS; i++) + for (i = 0; i < MAX_CODADEVS; i++) { + class_simple_device_remove(MKDEV(CODA_PSDEV_MAJOR, i)); devfs_remove("coda/%d", i); + } + class_simple_destroy(coda_psdev_class); devfs_remove("coda"); unregister_chrdev(CODA_PSDEV_MAJOR,"coda_psdev"); coda_sysctl_clean(); @@ -427,8 +450,11 @@ static void __exit exit_coda(void) if ( err != 0 ) { printk("coda: failed to unregister filesystem\n"); } - for (i = 0; i < MAX_CODADEVS; i++) + for (i = 0; i < MAX_CODADEVS; i++) { + class_simple_device_remove(MKDEV(CODA_PSDEV_MAJOR, i)); devfs_remove("coda/%d", i); + } + class_simple_destroy(coda_psdev_class); devfs_remove("coda"); unregister_chrdev(CODA_PSDEV_MAJOR, "coda_psdev"); coda_sysctl_clean(); diff -puN lib/kobject.c~bk-driver-core lib/kobject.c --- 25/lib/kobject.c~bk-driver-core 2004-04-14 20:06:58.919253776 -0700 +++ 25-akpm/lib/kobject.c 2004-04-14 20:06:58.955248304 -0700 @@ -349,16 +349,16 @@ int kobject_set_name(struct kobject * ko /* * Need more space? Allocate it and try again */ - name = kmalloc(need,GFP_KERNEL); + limit = need + 1; + name = kmalloc(limit,GFP_KERNEL); if (!name) { error = -ENOMEM; goto Done; } - limit = need; need = vsnprintf(name,limit,fmt,args); /* Still? Give up. */ - if (need > limit) { + if (need >= limit) { kfree(name); error = -EFAULT; goto Done; _