diff options
Diffstat (limited to 'drivers/usb/core/file.c')
| -rw-r--r-- | drivers/usb/core/file.c | 45 | 
1 files changed, 14 insertions, 31 deletions
diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c index 9fe34fb78ef..ea337a718cc 100644 --- a/drivers/usb/core/file.c +++ b/drivers/usb/core/file.c @@ -8,7 +8,7 @@   * (C) Copyright Deti Fliegl 1999 (new USB architecture)   * (C) Copyright Randy Dunlap 2000   * (C) Copyright David Brownell 2000-2001 (kernel hotplug, usb_device_id, - 	more docs, etc) + *	more docs, etc)   * (C) Copyright Yggdrasil Computing, Inc. 2000   *     (usb_device_id matching changes by Adam J. Richter)   * (C) Copyright Greg Kroah-Hartman 2002-2003 @@ -19,7 +19,6 @@  #include <linux/errno.h>  #include <linux/rwsem.h>  #include <linux/slab.h> -#include <linux/smp_lock.h>  #include <linux/usb.h>  #include "usb.h" @@ -28,29 +27,21 @@  static const struct file_operations *usb_minors[MAX_USB_MINORS];  static DECLARE_RWSEM(minor_rwsem); -static int usb_open(struct inode * inode, struct file * file) +static int usb_open(struct inode *inode, struct file *file)  { -	int minor = iminor(inode); -	const struct file_operations *c;  	int err = -ENODEV; -	const struct file_operations *old_fops, *new_fops = NULL; +	const struct file_operations *new_fops;  	down_read(&minor_rwsem); -	c = usb_minors[minor]; +	new_fops = fops_get(usb_minors[iminor(inode)]); -	if (!c || !(new_fops = fops_get(c))) +	if (!new_fops)  		goto done; -	old_fops = file->f_op; -	file->f_op = new_fops; +	replace_fops(file, new_fops);  	/* Curiouser and curiouser... NULL ->open() as "no device" ? */  	if (file->f_op->open) -		err = file->f_op->open(inode,file); -	if (err) { -		fops_put(file->f_op); -		file->f_op = fops_get(old_fops); -	} -	fops_put(old_fops); +		err = file->f_op->open(inode, file);   done:  	up_read(&minor_rwsem);  	return err; @@ -67,7 +58,7 @@ static struct usb_class {  	struct class *class;  } *usb_class; -static char *usb_devnode(struct device *dev, mode_t *mode) +static char *usb_devnode(struct device *dev, umode_t *mode)  {  	struct usb_class_driver *drv; @@ -93,9 +84,9 @@ static int init_usb_class(void)  	}  	kref_init(&usb_class->kref); -	usb_class->class = class_create(THIS_MODULE, "usb"); +	usb_class->class = class_create(THIS_MODULE, "usbmisc");  	if (IS_ERR(usb_class->class)) { -		result = IS_ERR(usb_class->class); +		result = PTR_ERR(usb_class->class);  		printk(KERN_ERR "class_create failed for usb devices\n");  		kfree(usb_class);  		usb_class = NULL; @@ -154,7 +145,7 @@ void usb_major_cleanup(void)   * usb_deregister_dev() must be called when the driver is done with   * the minor numbers given out by this function.   * - * Returns -EINVAL if something bad happens with trying to register a + * Return: -EINVAL if something bad happens with trying to register a   * device, and 0 on success.   */  int usb_register_dev(struct usb_interface *intf, @@ -167,7 +158,7 @@ int usb_register_dev(struct usb_interface *intf,  	char *temp;  #ifdef CONFIG_USB_DYNAMIC_MINORS -	/*  +	/*  	 * We don't care what the device tries to start at, we want to start  	 * at zero to pack the devices into the smallest available space with  	 * no holes in the minor range. @@ -184,7 +175,7 @@ int usb_register_dev(struct usb_interface *intf,  	if (retval)  		return retval; -	dev_dbg(&intf->dev, "looking for a minor, starting at %d", minor_base); +	dev_dbg(&intf->dev, "looking for a minor, starting at %d\n", minor_base);  	down_write(&minor_rwsem);  	for (minor = minor_base; minor < MAX_USB_MINORS; ++minor) { @@ -237,23 +228,15 @@ EXPORT_SYMBOL_GPL(usb_register_dev);  void usb_deregister_dev(struct usb_interface *intf,  			struct usb_class_driver *class_driver)  { -	int minor_base = class_driver->minor_base; -	char name[20]; - -#ifdef CONFIG_USB_DYNAMIC_MINORS -	minor_base = 0; -#endif -  	if (intf->minor == -1)  		return; -	dbg ("removing %d minor", intf->minor); +	dev_dbg(&intf->dev, "removing %d minor\n", intf->minor);  	down_write(&minor_rwsem);  	usb_minors[intf->minor] = NULL;  	up_write(&minor_rwsem); -	snprintf(name, sizeof(name), class_driver->name, intf->minor - minor_base);  	device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor));  	intf->usb_dev = NULL;  	intf->minor = -1;  | 
