diff -ur linux-2.6.15-rc5/drivers/mtd/mtd_blkdevs.c linux-2.6.15-rc5-openwrt/drivers/mtd/mtd_blkdevs.c --- linux-2.6.15-rc5/drivers/mtd/mtd_blkdevs.c 2005-12-04 06:10:42.000000000 +0100 +++ linux-2.6.15-rc5-openwrt/drivers/mtd/mtd_blkdevs.c 2005-12-15 07:53:20.000000000 +0100 @@ -21,6 +21,9 @@ #include #include #include +#ifdef CONFIG_DEVFS_FS +#include +#endif static LIST_HEAD(blktrans_majors); @@ -302,6 +305,11 @@ snprintf(gd->disk_name, sizeof(gd->disk_name), "%s%d", tr->name, new->devnum); +#ifdef CONFIG_DEVFS_FS + snprintf(gd->devfs_name, sizeof(gd->devfs_name), + "%s/%c", tr->name, (tr->part_bits?'a':'0') + new->devnum); +#endif + /* 2.5 has capacity in units of 512 bytes while still having BLOCK_SIZE_BITS set to 10. Just to keep us amused. */ set_capacity(gd, (new->size * new->blksize) >> 9); @@ -418,6 +426,10 @@ return ret; } +#ifdef CONFIG_DEVFS_FS + devfs_mk_dir(tr->name); +#endif + INIT_LIST_HEAD(&tr->devs); list_add(&tr->list, &blktrans_majors); @@ -450,6 +462,10 @@ tr->remove_dev(dev); } +#ifdef CONFIG_DEVFS_FS + devfs_remove(tr->name); +#endif + blk_cleanup_queue(tr->blkcore_priv->rq); unregister_blkdev(tr->major, tr->name); diff -ur linux-2.6.15-rc5/drivers/mtd/mtdchar.c linux-2.6.15-rc5-openwrt/drivers/mtd/mtdchar.c --- linux-2.6.15-rc5/drivers/mtd/mtdchar.c 2005-12-04 06:10:42.000000000 +0100 +++ linux-2.6.15-rc5-openwrt/drivers/mtd/mtdchar.c 2005-12-15 07:49:15.000000000 +0100 @@ -6,7 +6,6 @@ */ #include -#include #include #include #include @@ -19,19 +18,33 @@ #include +#ifdef CONFIG_DEVFS_FS +#include +#else +#include + static struct class *mtd_class; +#endif static void mtd_notify_add(struct mtd_info* mtd) { if (!mtd) return; +#ifdef CONFIG_DEVFS_FS + devfs_mk_cdev(MKDEV(MTD_CHAR_MAJOR, mtd->index*2), + S_IFCHR | S_IRUGO | S_IWUGO, "mtd/%d", mtd->index); + + devfs_mk_cdev(MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1), + S_IFCHR | S_IRUGO, "mtd/%dro", mtd->index); +#else class_device_create(mtd_class, NULL, MKDEV(MTD_CHAR_MAJOR, mtd->index*2), NULL, "mtd%d", mtd->index); class_device_create(mtd_class, NULL, MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1), NULL, "mtd%dro", mtd->index); +#endif } static void mtd_notify_remove(struct mtd_info* mtd) @@ -39,8 +52,13 @@ if (!mtd) return; +#ifdef CONFIG_DEVFS_FS + devfs_remove("mtd/%d", mtd->index); + devfs_remove("mtd/%dro", mtd->index); +#else class_device_destroy(mtd_class, MKDEV(MTD_CHAR_MAJOR, mtd->index*2)); class_device_destroy(mtd_class, MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1)); +#endif } static struct mtd_notifier notifier = { @@ -48,6 +66,22 @@ .remove = mtd_notify_remove, }; +#ifdef CONFIG_DEVFS_FS + static inline void mtdchar_devfs_init(void) + { + devfs_mk_dir("mtd"); + register_mtd_user(¬ifier); + } + static inline void mtdchar_devfs_exit(void) + { + unregister_mtd_user(¬ifier); + devfs_remove("mtd"); + } + #else /* !DEVFS */ + #define mtdchar_devfs_init() do { } while(0) + #define mtdchar_devfs_exit() do { } while(0) +#endif + /* * We use file->private_data to store a pointer to the MTDdevice. * Since alighment is at least 32 bits, we have 2 bits free for OTP @@ -643,6 +677,9 @@ return -EAGAIN; } +#ifdef CONFIG_DEVFS_FS + mtdchar_devfs_init(); +#else mtd_class = class_create(THIS_MODULE, "mtd"); if (IS_ERR(mtd_class)) { @@ -652,13 +689,19 @@ } register_mtd_user(¬ifier); +#endif return 0; } static void __exit cleanup_mtdchar(void) { + +#ifdef CONFIG_DEVFS_FS + mtdchar_devfs_exit(); +#else unregister_mtd_user(¬ifier); class_destroy(mtd_class); +#endif unregister_chrdev(MTD_CHAR_MAJOR, "mtd"); } diff -ur linux-2.6.15-rc5/fs/Kconfig linux-2.6.15-rc5-openwrt/fs/Kconfig --- linux-2.6.15-rc5/fs/Kconfig 2005-12-04 06:10:42.000000000 +0100 +++ linux-2.6.15-rc5-openwrt/fs/Kconfig 2005-12-15 07:44:01.000000000 +0100 @@ -772,6 +772,56 @@ help Exports the dump image of crashed kernel in ELF format. +config DEVFS_FS + bool "/dev file system support (OBSOLETE)" + depends on EXPERIMENTAL + help + This is support for devfs, a virtual file system (like /proc) which + provides the file system interface to device drivers, normally found + in /dev. Devfs does not depend on major and minor number + allocations. Device drivers register entries in /dev which then + appear automatically, which means that the system administrator does + not have to create character and block special device files in the + /dev directory using the mknod command (or MAKEDEV script) anymore. + + This is work in progress. If you want to use this, you *must* read + the material in , especially + the file README there. + + Note that devfs no longer manages /dev/pts! If you are using UNIX98 + ptys, you will also need to mount the /dev/pts filesystem (devpts). + + Note that devfs has been obsoleted by udev, + . + It has been stripped down to a bare minimum and is only provided for + legacy installations that use its naming scheme which is + unfortunately different from the names normal Linux installations + use. + + If unsure, say N. + +config DEVFS_MOUNT + bool "Automatically mount at boot" + depends on DEVFS_FS + help + This option appears if you have CONFIG_DEVFS_FS enabled. Setting + this to 'Y' will make the kernel automatically mount devfs onto /dev + when the system is booted, before the init thread is started. + You can override this with the "devfs=nomount" boot option. + + If unsure, say N. + +config DEVFS_DEBUG + bool "Debug devfs" + depends on DEVFS_FS + help + If you say Y here, then the /dev file system code will generate + debugging messages. See the file + for more + details. + + If unsure, say N. + config SYSFS bool "sysfs file system support" if EMBEDDED default y