diff options
| author | Grant Likely <grant.likely@secretlab.ca> | 2010-12-29 22:20:30 -0700 | 
|---|---|---|
| committer | Grant Likely <grant.likely@secretlab.ca> | 2010-12-29 22:21:47 -0700 | 
| commit | d392da5207352f09030e95d9ea335a4225667ec0 (patch) | |
| tree | 7d6cd1932afcad0a5619a5c504a6d93ca318187c /drivers/usb/core/file.c | |
| parent | e39d5ef678045d61812c1401f04fe8edb14d6359 (diff) | |
| parent | 387c31c7e5c9805b0aef8833d1731a5fe7bdea14 (diff) | |
Merge v2.6.37-rc8 into powerpc/next
Diffstat (limited to 'drivers/usb/core/file.c')
| -rw-r--r-- | drivers/usb/core/file.c | 37 | 
1 files changed, 17 insertions, 20 deletions
diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c index f06f5dbc8cd..cf6a5423de0 100644 --- a/drivers/usb/core/file.c +++ b/drivers/usb/core/file.c @@ -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" @@ -59,6 +58,7 @@ static int usb_open(struct inode * inode, struct file * file)  static const struct file_operations usb_fops = {  	.owner =	THIS_MODULE,  	.open =		usb_open, +	.llseek =	noop_llseek,  };  static struct usb_class { @@ -159,9 +159,9 @@ void usb_major_cleanup(void)  int usb_register_dev(struct usb_interface *intf,  		     struct usb_class_driver *class_driver)  { -	int retval = -EINVAL; +	int retval;  	int minor_base = class_driver->minor_base; -	int minor = 0; +	int minor;  	char name[20];  	char *temp; @@ -173,12 +173,17 @@ int usb_register_dev(struct usb_interface *intf,  	 */  	minor_base = 0;  #endif -	intf->minor = -1; - -	dbg ("looking for a minor, starting at %d", minor_base);  	if (class_driver->fops == NULL) -		goto exit; +		return -EINVAL; +	if (intf->minor >= 0) +		return -EADDRINUSE; + +	retval = init_usb_class(); +	if (retval) +		return retval; + +	dev_dbg(&intf->dev, "looking for a minor, starting at %d", minor_base);  	down_write(&minor_rwsem);  	for (minor = minor_base; minor < MAX_USB_MINORS; ++minor) { @@ -186,20 +191,12 @@ int usb_register_dev(struct usb_interface *intf,  			continue;  		usb_minors[minor] = class_driver->fops; - -		retval = 0; +		intf->minor = minor;  		break;  	}  	up_write(&minor_rwsem); - -	if (retval) -		goto exit; - -	retval = init_usb_class(); -	if (retval) -		goto exit; - -	intf->minor = minor; +	if (intf->minor < 0) +		return -EXFULL;  	/* create a usb class device for this usb interface */  	snprintf(name, sizeof(name), class_driver->name, minor - minor_base); @@ -213,11 +210,11 @@ int usb_register_dev(struct usb_interface *intf,  				      "%s", temp);  	if (IS_ERR(intf->usb_dev)) {  		down_write(&minor_rwsem); -		usb_minors[intf->minor] = NULL; +		usb_minors[minor] = NULL; +		intf->minor = -1;  		up_write(&minor_rwsem);  		retval = PTR_ERR(intf->usb_dev);  	} -exit:  	return retval;  }  EXPORT_SYMBOL_GPL(usb_register_dev);  | 
