diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-02-21 14:07:35 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-02-21 14:07:35 -0800 |
commit | 5b693780711fb83c4ada2b9c3deece2aefdc9957 (patch) | |
tree | 759ddb90aa21756dd9fcb9e6bf1b73f25aa307a3 /usb | |
parent | f7548a8c177dd826a964700f1d93e99330f2652e (diff) | |
download | patches-5b693780711fb83c4ada2b9c3deece2aefdc9957.tar.gz |
updated usbfs2
Diffstat (limited to 'usb')
-rw-r--r-- | usb/usbfs2.patch | 201 |
1 files changed, 161 insertions, 40 deletions
diff --git a/usb/usbfs2.patch b/usb/usbfs2.patch index 64b1b9b5fb771a..06d788fd8f00ad 100644 --- a/usb/usbfs2.patch +++ b/usb/usbfs2.patch @@ -2,13 +2,16 @@ drivers/usb/Kconfig | 2 drivers/usb/Makefile | 2 drivers/usb/usbfs2/Kconfig | 7 - drivers/usb/usbfs2/Makefile | 5 - drivers/usb/usbfs2/usbfs2.c | 345 ++++++++++++++++++++++++++++++++++++++++++++ - 5 files changed, 361 insertions(+) + drivers/usb/usbfs2/Makefile | 7 + drivers/usb/usbfs2/inode.c | 445 ++++++++++++++++++++++++++++++++++++++++++++ + include/linux/usb.h | 2 + 6 files changed, 465 insertions(+) --- /dev/null +++ gregkh-2.6/drivers/usb/usbfs2/Makefile -@@ -0,0 +1,5 @@ +@@ -0,0 +1,7 @@ ++usbfs2-objs := inode.o ++ +obj-$(CONFIG_USB_USBFS2) += usbfs2.o + +ifeq ($(CONFIG_USB_DEBUG),y) @@ -47,8 +50,8 @@ + + Most users want to say Y here. --- /dev/null -+++ gregkh-2.6/drivers/usb/usbfs2/usbfs2.c -@@ -0,0 +1,345 @@ ++++ gregkh-2.6/drivers/usb/usbfs2/inode.c +@@ -0,0 +1,445 @@ +/* + * usbfs2.c - usbfs2 + * @@ -236,46 +239,45 @@ + return error; +} + -+#if 0 +/** -+ * securityfs_create_file - create a file in the securityfs filesystem ++ * usbfs2_create_file - create a file in the usbfs2 filesystem + * + * @name: a pointer to a string containing the name of the file to create. + * @mode: the permission that the file should have + * @parent: a pointer to the parent dentry for this file. This should be a + * directory dentry if set. If this paramater is NULL, then the -+ * file will be created in the root of the securityfs filesystem. ++ * file will be created in the root of the usbfs2 filesystem. + * @data: a pointer to something that the caller will want to get to later + * on. The inode.u.generic_ip pointer will point to this value on + * the open() call. + * @fops: a pointer to a struct file_operations that should be used for + * this file. + * -+ * This is the basic "create a file" function for securityfs. It allows for a ++ * This is the basic "create a file" function for usbfs2. It allows for a + * wide range of flexibility in createing a file, or a directory (if you -+ * want to create a directory, the securityfs_create_dir() function is ++ * want to create a directory, the usbfs2_create_dir() function is + * recommended to be used instead.) + * + * This function will return a pointer to a dentry if it succeeds. This -+ * pointer must be passed to the securityfs_remove() function when the file is ++ * pointer must be passed to the usbfs2_remove() function when the file is + * to be removed (no automatic cleanup happens if your module is unloaded, + * you are responsible here.) If an error occurs, NULL will be returned. + * -+ * If securityfs is not enabled in the kernel, the value -ENODEV will be ++ * If usbfs2 is not enabled in the kernel, the value -ENODEV will be + * returned. It is not wise to check for this value, but rather, check for + * NULL or !NULL instead as to eliminate the need for #ifdef in the calling + * code. + */ -+static struct dentry *securityfs_create_file(const char *name, mode_t mode, -+ struct dentry *parent, void *data, -+ struct file_operations *fops) ++static struct dentry *usbfs2_create_file(const char *name, mode_t mode, ++ struct dentry *parent, void *data, ++ struct file_operations *fops) +{ + struct dentry *dentry = NULL; + int error; + -+ pr_debug("securityfs: creating file '%s'\n",name); ++ pr_debug("usbfs2: creating file '%s'\n",name); + -+ error = simple_pin_fs("securityfs", &mount, &mount_count); ++ error = simple_pin_fs("usbfs2", &mount, &mount_count); + if (error) { + dentry = ERR_PTR(error); + goto exit; @@ -299,48 +301,47 @@ +} + +/** -+ * securityfs_create_dir - create a directory in the securityfs filesystem ++ * usbfs2_create_dir - create a directory in the usbfs2 filesystem + * + * @name: a pointer to a string containing the name of the directory to + * create. + * @parent: a pointer to the parent dentry for this file. This should be a + * directory dentry if set. If this paramater is NULL, then the -+ * directory will be created in the root of the securityfs filesystem. ++ * directory will be created in the root of the usbfs2 filesystem. + * -+ * This function creates a directory in securityfs with the given name. ++ * This function creates a directory in usbfs2 with the given name. + * + * This function will return a pointer to a dentry if it succeeds. This -+ * pointer must be passed to the securityfs_remove() function when the file is ++ * pointer must be passed to the usbfs2_remove() function when the file is + * to be removed (no automatic cleanup happens if your module is unloaded, + * you are responsible here.) If an error occurs, NULL will be returned. + * -+ * If securityfs is not enabled in the kernel, the value -ENODEV will be ++ * If usbfs2 is not enabled in the kernel, the value -ENODEV will be + * returned. It is not wise to check for this value, but rather, check for + * NULL or !NULL instead as to eliminate the need for #ifdef in the calling + * code. + */ -+static struct dentry *securityfs_create_dir(const char *name, struct dentry *parent) ++static struct dentry *usbfs2_create_dir(const char *name, struct dentry *parent) +{ -+ return securityfs_create_file(name, -+ S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO, -+ parent, NULL, NULL); ++ return usbfs2_create_file(name, S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO, ++ parent, NULL, NULL); +} + +/** -+ * securityfs_remove - removes a file or directory from the securityfs filesystem ++ * usbfs2_remove - removes a file or directory from the usbfs2 filesystem + * + * @dentry: a pointer to a the dentry of the file or directory to be + * removed. + * -+ * This function removes a file or directory in securityfs that was previously -+ * created with a call to another securityfs function (like -+ * securityfs_create_file() or variants thereof.) ++ * This function removes a file or directory in usbfs2 that was previously ++ * created with a call to another usbfs2 function (like ++ * usbfs2_create_file() or variants thereof.) + * + * This function is required to be called in order for the file to be + * removed, no automatic cleanup of files will happen when a module is + * removed, you are responsible here. + */ -+static void securityfs_remove(struct dentry *dentry) ++static void usbfs2_remove(struct dentry *dentry) +{ + struct dentry *parent; + @@ -364,33 +365,153 @@ + mutex_unlock(&parent->d_inode->i_mutex); + simple_release_fs(&mount, &mount_count); +} ++ ++ ++static void add_bus(struct usb_bus *bus) ++{ ++ struct dentry *parent; ++ char name[8]; ++ ++ sprintf(name, "%03d", bus->busnum); ++ ++ parent = mount->mnt_sb->s_root; ++ bus->usbfs2_dentry = usbfs2_create_dir(name, parent); ++ if (bus->usbfs2_dentry == NULL) { ++ dev_err(bus->controller, "error creating usbfs2 bus entry"); ++ return; ++ } ++} ++ ++static void remove_bus(struct usb_bus *bus) ++{ ++ if (bus->usbfs2_dentry) { ++ usbfs2_remove(bus->usbfs2_dentry); ++ bus->usbfs2_dentry = NULL; ++ } ++} ++ ++ ++static void add_device(struct usb_device *dev) ++{ ++ char name[8]; ++ int i; ++ int i_size; ++ ++ if (!dev->bus->usbfs2_dentry) { ++ dev_err(&dev->dev, "no directory created for the device's bus\n"); ++ return; ++ } ++ ++ sprintf(name, "%03d", dev->devnum); ++ dev->usbfs2_dentry = usbfs2_create_dir(name, dev->bus->usbfs2_dentry); ++ if (dev->usbfs2_dentry == NULL) { ++ dev_err(&dev->dev, "error creating usbfs2 device entry"); ++ return; ++ } ++ ++ /* Set the size of the device's file to be ++ * equal to the size of the device descriptors. */ ++ i_size = sizeof(struct usb_device_descriptor); ++ for (i = 0; i < dev->descriptor.bNumConfigurations; ++i) { ++ struct usb_config_descriptor *config = ++ (struct usb_config_descriptor *)dev->rawdescriptors[i]; ++ i_size += le16_to_cpu(config->wTotalLength); ++ } ++ if (dev->usbfs2_dentry->d_inode) ++ dev->usbfs2_dentry->d_inode->i_size = i_size; ++} ++ ++static void remove_device(struct usb_device *dev) ++{ ++ if (dev->usbfs2_dentry) { ++ usbfs2_remove(dev->usbfs2_dentry); ++ dev->usbfs2_dentry = NULL; ++ } ++#if 0 ++ /* FIXME need to do something like this here */ ++ while (!list_empty(&dev->filelist)) { ++ struct dev_state *ds; ++ struct siginfo sinfo; ++ ++ ds = list_entry(dev->filelist.next, struct dev_state, list); ++ wake_up_all(&ds->wait); ++ list_del_init(&ds->list); ++ if (ds->discsignr) { ++ sinfo.si_signo = SIGPIPE; ++ sinfo.si_errno = EPIPE; ++ sinfo.si_code = SI_ASYNCIO; ++ sinfo.si_addr = ds->disccontext; ++ kill_proc_info_as_uid(ds->discsignr, &sinfo, ds->disc_pid, ds->disc_uid, ds->disc_euid); ++ } ++ } +#endif ++} ++ ++static int usbfs2_notify(struct notifier_block *self, unsigned long action, ++ void *dev) ++{ ++ switch (action) { ++ case USB_DEVICE_ADD: ++ add_device(dev); ++ break; ++ case USB_DEVICE_REMOVE: ++ remove_device(dev); ++ break; ++ case USB_BUS_ADD: ++ add_bus(dev); ++ break; ++ case USB_BUS_REMOVE: ++ remove_bus(dev); ++ break; ++ } ++ return NOTIFY_OK; ++} ++ ++static struct notifier_block usbfs2_nb = { ++ .notifier_call = usbfs2_notify, ++}; + -+static decl_subsys(usbfs2, NULL, NULL); + +static int __init usbfs2_init(void) +{ + int retval; + -+ kset_set_kset_s(&usbfs2_subsys, kernel_subsys); -+ retval = subsystem_register(&usbfs2_subsys); -+ if (retval) -+ return retval; -+ + retval = register_filesystem(&fs_type); + if (retval) -+ subsystem_unregister(&usbfs2_subsys); ++ goto exit; ++ ++ usb_register_notify(&usbfs2_nb); ++ ++exit: + return retval; +} + +static void __exit usbfs2_exit(void) +{ ++ usb_unregister_notify(&usbfs2_nb); + simple_release_fs(&mount, &mount_count); + unregister_filesystem(&fs_type); -+ subsystem_unregister(&usbfs2_subsys); +} + +core_initcall(usbfs2_init); +module_exit(usbfs2_exit); +MODULE_LICENSE("GPL"); + +--- gregkh-2.6.orig/include/linux/usb.h ++++ gregkh-2.6/include/linux/usb.h +@@ -291,6 +291,7 @@ struct usb_bus { + int bandwidth_isoc_reqs; /* number of Isoc. requests */ + + struct dentry *usbfs_dentry; /* usbfs dentry entry for the bus */ ++ struct dentry *usbfs2_dentry; /* usbfs2 dentry entry for the bus */ + + struct class_device *class_dev; /* class device for this bus */ + struct kref kref; /* reference counting for this bus */ +@@ -361,6 +362,7 @@ struct usb_device { + struct list_head filelist; + struct class_device *class_dev; + struct dentry *usbfs_dentry; /* usbfs dentry entry for the device */ ++ struct dentry *usbfs2_dentry; /* usbfs2 dentry entry for the device */ + + /* + * Child devices - these can be either new devices |