diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/misc/rio500.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/usb/misc/rio500.c b/drivers/usb/misc/rio500.c index 47ce46bb5b01..a85771b1563d 100644 --- a/drivers/usb/misc/rio500.c +++ b/drivers/usb/misc/rio500.c | |||
@@ -77,11 +77,14 @@ static struct rio_usb_data rio_instance; | |||
77 | static int open_rio(struct inode *inode, struct file *file) | 77 | static int open_rio(struct inode *inode, struct file *file) |
78 | { | 78 | { |
79 | struct rio_usb_data *rio = &rio_instance; | 79 | struct rio_usb_data *rio = &rio_instance; |
80 | |||
81 | /* against disconnect() */ | ||
80 | lock_kernel(); | 82 | lock_kernel(); |
81 | mutex_lock(&(rio->lock)); | 83 | mutex_lock(&(rio->lock)); |
82 | 84 | ||
83 | if (rio->isopen || !rio->present) { | 85 | if (rio->isopen || !rio->present) { |
84 | mutex_unlock(&(rio->lock)); | 86 | mutex_unlock(&(rio->lock)); |
87 | unlock_kernel(); | ||
85 | return -EBUSY; | 88 | return -EBUSY; |
86 | } | 89 | } |
87 | rio->isopen = 1; | 90 | rio->isopen = 1; |
@@ -116,7 +119,6 @@ static long ioctl_rio(struct file *file, unsigned int cmd, unsigned long arg) | |||
116 | int retries; | 119 | int retries; |
117 | int retval=0; | 120 | int retval=0; |
118 | 121 | ||
119 | lock_kernel(); | ||
120 | mutex_lock(&(rio->lock)); | 122 | mutex_lock(&(rio->lock)); |
121 | /* Sanity check to make sure rio is connected, powered, etc */ | 123 | /* Sanity check to make sure rio is connected, powered, etc */ |
122 | if (rio->present == 0 || rio->rio_dev == NULL) { | 124 | if (rio->present == 0 || rio->rio_dev == NULL) { |
@@ -255,7 +257,6 @@ static long ioctl_rio(struct file *file, unsigned int cmd, unsigned long arg) | |||
255 | 257 | ||
256 | err_out: | 258 | err_out: |
257 | mutex_unlock(&(rio->lock)); | 259 | mutex_unlock(&(rio->lock)); |
258 | unlock_kernel(); | ||
259 | return retval; | 260 | return retval; |
260 | } | 261 | } |
261 | 262 | ||
@@ -490,6 +491,7 @@ static void disconnect_rio(struct usb_interface *intf) | |||
490 | struct rio_usb_data *rio = usb_get_intfdata (intf); | 491 | struct rio_usb_data *rio = usb_get_intfdata (intf); |
491 | 492 | ||
492 | usb_set_intfdata (intf, NULL); | 493 | usb_set_intfdata (intf, NULL); |
494 | lock_kernel(); | ||
493 | if (rio) { | 495 | if (rio) { |
494 | usb_deregister_dev(intf, &usb_rio_class); | 496 | usb_deregister_dev(intf, &usb_rio_class); |
495 | 497 | ||
@@ -499,6 +501,7 @@ static void disconnect_rio(struct usb_interface *intf) | |||
499 | /* better let it finish - the release will do whats needed */ | 501 | /* better let it finish - the release will do whats needed */ |
500 | rio->rio_dev = NULL; | 502 | rio->rio_dev = NULL; |
501 | mutex_unlock(&(rio->lock)); | 503 | mutex_unlock(&(rio->lock)); |
504 | unlock_kernel(); | ||
502 | return; | 505 | return; |
503 | } | 506 | } |
504 | kfree(rio->ibuf); | 507 | kfree(rio->ibuf); |
@@ -509,6 +512,7 @@ static void disconnect_rio(struct usb_interface *intf) | |||
509 | rio->present = 0; | 512 | rio->present = 0; |
510 | mutex_unlock(&(rio->lock)); | 513 | mutex_unlock(&(rio->lock)); |
511 | } | 514 | } |
515 | unlock_kernel(); | ||
512 | } | 516 | } |
513 | 517 | ||
514 | static const struct usb_device_id rio_table[] = { | 518 | static const struct usb_device_id rio_table[] = { |