diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-04-27 13:40:49 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-04-27 13:40:49 -0700 |
commit | 321d5359442bb69a57142639d7400a31964dab7c (patch) | |
tree | 56863a550254eed1af8f605b81dc2a907c479611 /bad | |
parent | 4adb3607657080447adafac85186a8f7ba013ac0 (diff) | |
download | patches-321d5359442bb69a57142639d7400a31964dab7c.tar.gz |
2.6.17-rc3 resync.
Dropped ndevfs patch, as I really don't want to debug it.
added a pci 64 bit resource patch
Diffstat (limited to 'bad')
-rw-r--r-- | bad/ndevfs.patch | 393 |
1 files changed, 393 insertions, 0 deletions
diff --git a/bad/ndevfs.patch b/bad/ndevfs.patch new file mode 100644 index 0000000000000..5af0742a2813d --- /dev/null +++ b/bad/ndevfs.patch @@ -0,0 +1,393 @@ +From foo@baz.org Sun Jun 5 14:33:21 2005 +Date: Mon, 20 Jun 2005 21:15:16 -0700 +To: Greg KH <gregkh@suse.de> +From: Greg Kroah-Hartman <gregkh@suse.de> +Subject: ndevfs: a nano-devfs like fs + +You don't really want to run this. But if you did, here's a simple hack +showing how easy it is to do it. + +Note, this patch will NOT be merged into mainline, so don't get your +panties into a bind... + + +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + drivers/base/class.c | 7 + + fs/Kconfig | 3 + fs/Makefile | 1 + fs/ndevfs/Makefile | 4 + fs/ndevfs/inode.c | 249 +++++++++++++++++++++++++++++++++++++++++++++++++ + fs/partitions/check.c | 6 + + include/linux/ndevfs.h | 13 ++ + 7 files changed, 282 insertions(+), 1 deletion(-) + +--- gregkh-2.6.orig/drivers/base/class.c ++++ gregkh-2.6/drivers/base/class.c +@@ -18,6 +18,7 @@ + #include <linux/kdev_t.h> + #include <linux/err.h> + #include <linux/slab.h> ++#include <linux/ndevfs.h> + #include "base.h" + + #define to_class_attr(_attr) container_of(_attr, struct class_attribute, attr) +@@ -577,6 +578,8 @@ int class_device_add(struct class_device + attr->show = show_dev; + class_device_create_file(class_dev, attr); + class_dev->devt_attr = attr; ++ ++ ndevfs_create(class_dev->class_id, class_dev->devt, 1); + } + + class_device_add_attrs(class_dev); +@@ -700,8 +703,10 @@ void class_device_del(struct class_devic + sysfs_remove_link(&class_dev->dev->kobj, class_name); + } + class_device_remove_file(class_dev, &class_dev->uevent_attr); +- if (class_dev->devt_attr) ++ if (class_dev->devt_attr) { + class_device_remove_file(class_dev, class_dev->devt_attr); ++ ndevfs_remove(class_dev->class_id); ++ } + class_device_remove_attrs(class_dev); + class_device_remove_groups(class_dev); + +--- gregkh-2.6.orig/fs/Kconfig ++++ gregkh-2.6/fs/Kconfig +@@ -1815,6 +1815,9 @@ config 9P_FS + + If unsure, say N. + ++config NDEV_FS ++ bool "Nano Device File System" ++ + endmenu + + menu "Partition Types" +--- gregkh-2.6.orig/fs/Makefile ++++ gregkh-2.6/fs/Makefile +@@ -101,3 +101,4 @@ obj-$(CONFIG_HPPFS) += hppfs/ + obj-$(CONFIG_DEBUG_FS) += debugfs/ + obj-$(CONFIG_CONFIGFS_FS) += configfs/ + obj-$(CONFIG_OCFS2_FS) += ocfs2/ ++obj-$(CONFIG_NDEV_FS) += ndevfs/ +--- /dev/null ++++ gregkh-2.6/fs/ndevfs/Makefile +@@ -0,0 +1,4 @@ ++ndevfs-objs := inode.o ++ ++obj-$(CONFIG_NDEV_FS) += ndevfs.o ++ +--- /dev/null ++++ gregkh-2.6/fs/ndevfs/inode.c +@@ -0,0 +1,249 @@ ++/* ++ * inode.c - part of ndevfs, a tiny little device file system ++ * ++ * Copyright (C) 2004,2005 Greg Kroah-Hartman <greg@kroah.com> ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License version ++ * 2 as published by the Free Software Foundation. ++ * ++ * Written for all of the people out there who just hate userspace solutions. ++ * ++ */ ++ ++/* uncomment to get debug messages */ ++#define DEBUG ++ ++#include <linux/config.h> ++#include <linux/module.h> ++#include <linux/fs.h> ++#include <linux/mount.h> ++#include <linux/pagemap.h> ++#include <linux/init.h> ++#include <linux/namei.h> ++#include <linux/device.h> ++#include <linux/ndevfs.h> ++ ++#define MAGIC 0x64756d62 ++ ++struct entry { ++ struct list_head node; ++ struct dentry *dentry; ++ char name[BUS_ID_SIZE]; ++}; ++static LIST_HEAD(entries); ++ ++static struct vfsmount *mount; ++static int mount_count; ++ ++static struct file_operations stupid_file_ops = { ++ .read = generic_file_read, ++ .write = generic_file_write, ++ .mmap = generic_file_mmap, ++ .fsync = simple_sync_file, ++ .llseek = generic_file_llseek, ++}; ++ ++static struct inode *get_inode(struct super_block *sb, int mode, dev_t dev) ++{ ++ struct inode *inode = new_inode(sb); ++ ++ if (inode) { ++ inode->i_mode = mode; ++ inode->i_uid = 0; ++ inode->i_gid = 0; ++ inode->i_blksize = PAGE_CACHE_SIZE; ++ inode->i_blocks = 0; ++ inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; ++ switch (mode & S_IFMT) { ++ default: ++ init_special_inode(inode, mode, dev); ++ break; ++ case S_IFREG: ++ inode->i_fop = &stupid_file_ops; ++ break; ++ case S_IFDIR: ++ inode->i_op = &simple_dir_inode_operations; ++ inode->i_fop = &simple_dir_operations; ++ ++ /* directory inodes start off with i_nlink == 2 (for "." entry) */ ++ inode->i_nlink++; ++ break; ++ } ++ } ++ return inode; ++} ++ ++/* SMP-safe */ ++static int mknod(struct inode *dir, struct dentry *dentry, ++ int mode, dev_t dev) ++{ ++ struct inode *inode = get_inode(dir->i_sb, mode, dev); ++ int error = -EPERM; ++ ++ if (dentry->d_inode) ++ return -EEXIST; ++ ++ if (inode) { ++ d_instantiate(dentry, inode); ++ dget(dentry); ++ error = 0; ++ } ++ return error; ++} ++ ++static inline int positive(struct dentry *dentry) ++{ ++ return dentry->d_inode && !d_unhashed(dentry); ++} ++ ++static int fill_super(struct super_block *sb, void *data, int silent) ++{ ++ static struct tree_descr files[] = {{""}}; ++ ++ return simple_fill_super(sb, MAGIC, files); ++} ++ ++static struct super_block *get_sb(struct file_system_type *fs_type, ++ int flags, const char *dev_name, ++ void *data) ++{ ++ return get_sb_single(fs_type, flags, data, fill_super); ++} ++ ++static void remove(struct dentry *dentry) ++{ ++ struct dentry *parent; ++ ++ if (!dentry) ++ return; ++ ++ parent = dentry->d_parent; ++ if (!parent || !parent->d_inode) ++ return; ++ ++ mutex_lock(&parent->d_inode->i_mutex); ++ if (positive(dentry)) { ++ if (dentry->d_inode) { ++ if (S_ISDIR(dentry->d_inode->i_mode)) ++ simple_rmdir(parent->d_inode, dentry); ++ else ++ simple_unlink(parent->d_inode, dentry); ++ dput(dentry); ++ } ++ } ++ mutex_unlock(&parent->d_inode->i_mutex); ++ simple_release_fs(&mount, &mount_count); ++} ++ ++/** ++ * ndevfs_create - create a device node in ndevfs ++ * ++ * @name: the name to create ++ * @dev: the dev_t of the node ++ * @is_char: if the node is a char device or not ++ */ ++void ndevfs_create(const char *name, dev_t dev, int is_char) ++{ ++ struct dentry *parent; ++ struct dentry *dentry; ++ struct entry *entry; ++ int err; ++ int mode = S_IRUSR | S_IWUSR; ++ ++ pr_debug("ndevfs: creating file '%s' with major %d and minor %d\n", ++ name, MAJOR(dev), MINOR(dev)); ++ ++ if (is_char) ++ mode |= S_IFCHR; ++ else ++ mode |= S_IFBLK; ++ ++ err = simple_pin_fs("ndevfs", &mount, &mount_count); ++ if (err) ++ return; ++ ++ /* everything is at the root fs, no directories allowed */ ++ if (mount && mount->mnt_sb) { ++ parent = mount->mnt_sb->s_root; ++ } else { ++ pr_debug("%s: no parent?\n", __FUNCTION__); ++ goto error; ++ } ++ ++ mutex_lock(&parent->d_inode->i_mutex); ++ dentry = lookup_one_len(name, parent, strlen(name)); ++ if (!IS_ERR(dentry)) ++ err = mknod(parent->d_inode, dentry, mode, dev); ++ else ++ err = PTR_ERR(dentry); ++ mutex_unlock(&parent->d_inode->i_mutex); ++ ++ if (err) ++ goto error; ++ ++ entry = kmalloc(sizeof(struct entry), GFP_KERNEL); ++ if (!entry) { ++ remove(dentry); ++ err = -ENOMEM; ++ goto error; ++ } ++ entry->dentry = dentry; ++ strcpy(&entry->name[0], name); ++ list_add(&entry->node, &entries); ++ return; ++ ++error: ++ pr_debug("%s failed with error %d\n", __FUNCTION__, err); ++ simple_release_fs(&mount, &mount_count); ++} ++EXPORT_SYMBOL_GPL(ndevfs_create); ++ ++/** ++ * ndevfs_remove - removes the node from the fs ++ * ++ * @name: the name to remove. ++ */ ++void ndevfs_remove(const char *name) ++{ ++ struct entry *entry; ++ struct dentry *dentry = NULL; ++ ++ pr_debug("ndevfs: removing file '%s'\n", name); ++ ++ list_for_each_entry(entry, &entries, node) { ++ if (strcmp(name, &entry->name[0]) == 0) { ++ dentry = entry->dentry; ++ break; ++ } ++ } ++ if (!dentry) { ++ pr_debug("%s: can't find %s\n", __FUNCTION__, name); ++ return; ++ } ++ remove (dentry); ++} ++EXPORT_SYMBOL_GPL(ndevfs_remove); ++ ++static struct file_system_type fs_type = { ++ .owner = THIS_MODULE, ++ .name = "ndevfs", ++ .get_sb = get_sb, ++ .kill_sb = kill_litter_super, ++}; ++ ++static int __init ndevfs_init(void) ++{ ++ return register_filesystem(&fs_type); ++} ++ ++static void __exit ndevfs_exit(void) ++{ ++ simple_release_fs(&mount, &mount_count); ++ unregister_filesystem(&fs_type); ++} ++ ++core_initcall(ndevfs_init); ++module_exit(ndevfs_exit); ++MODULE_LICENSE("GPL"); ++ +--- gregkh-2.6.orig/fs/partitions/check.c ++++ gregkh-2.6/fs/partitions/check.c +@@ -18,6 +18,7 @@ + #include <linux/fs.h> + #include <linux/kmod.h> + #include <linux/ctype.h> ++#include <linux/ndevfs.h> + + #include "check.h" + +@@ -321,6 +322,7 @@ void delete_partition(struct gendisk *di + p->sectors[0] = p->sectors[1] = 0; + if (p->holder_dir) + kobject_unregister(p->holder_dir); ++ ndevfs_remove(kobject_name(&p->kobj)); + kobject_uevent(&p->kobj, KOBJ_REMOVE); + kobject_del(&p->kobj); + kobject_put(&p->kobj); +@@ -349,6 +351,7 @@ void add_partition(struct gendisk *disk, + kobject_add(&p->kobj); + if (!disk->part_uevent_suppress) + kobject_uevent(&p->kobj, KOBJ_ADD); ++ ndevfs_create(kobject_name(&p->kobj), MKDEV(disk->major, p->partno), 0); + partition_sysfs_add_subdir(p); + disk->part[part-1] = p; + } +@@ -404,6 +407,8 @@ void register_disk(struct gendisk *disk) + return; + disk_sysfs_symlinks(disk); + disk_sysfs_add_subdirs(disk); ++ ndevfs_create(kobject_name(&disk->kobj), ++ MKDEV(disk->major, disk->first_minor), 0); + + /* No minors to use for partitions */ + if (disk->minors == 1) +@@ -524,6 +529,7 @@ void del_gendisk(struct gendisk *disk) + } + put_device(disk->driverfs_dev); + } ++ ndevfs_remove(kobject_name(&disk->kobj)); + kobject_uevent(&disk->kobj, KOBJ_REMOVE); + kobject_del(&disk->kobj); + } +--- /dev/null ++++ gregkh-2.6/include/linux/ndevfs.h +@@ -0,0 +1,13 @@ ++#ifndef _NDEVFS_H_ ++#define _NDEVFS_H_ ++ ++#if defined(CONFIG_NDEV_FS) ++extern void ndevfs_create(const char *name, dev_t dev, int is_char); ++extern void ndevfs_remove(const char *name); ++#else ++static inline void ndevfs_create(const char *name, dev_t dev, int is_char) {} ++static inline void ndevfs_remove(const char *name) {} ++#endif ++ ++#endif ++ |