diff options
Diffstat (limited to 'drivers/usb/misc/vstusb.c')
-rw-r--r-- | drivers/usb/misc/vstusb.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/usb/misc/vstusb.c b/drivers/usb/misc/vstusb.c index 874c81bb27b9..b787b25d4cc4 100644 --- a/drivers/usb/misc/vstusb.c +++ b/drivers/usb/misc/vstusb.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
28 | #include <linux/module.h> | 28 | #include <linux/module.h> |
29 | #include <linux/mutex.h> | 29 | #include <linux/mutex.h> |
30 | #include <linux/smp_lock.h> | ||
30 | #include <linux/uaccess.h> | 31 | #include <linux/uaccess.h> |
31 | #include <linux/usb.h> | 32 | #include <linux/usb.h> |
32 | 33 | ||
@@ -103,19 +104,23 @@ static int vstusb_open(struct inode *inode, struct file *file) | |||
103 | struct vstusb_device *vstdev; | 104 | struct vstusb_device *vstdev; |
104 | struct usb_interface *interface; | 105 | struct usb_interface *interface; |
105 | 106 | ||
107 | lock_kernel(); | ||
106 | interface = usb_find_interface(&vstusb_driver, iminor(inode)); | 108 | interface = usb_find_interface(&vstusb_driver, iminor(inode)); |
107 | 109 | ||
108 | if (!interface) { | 110 | if (!interface) { |
109 | printk(KERN_ERR KBUILD_MODNAME | 111 | printk(KERN_ERR KBUILD_MODNAME |
110 | ": %s - error, can't find device for minor %d\n", | 112 | ": %s - error, can't find device for minor %d\n", |
111 | __func__, iminor(inode)); | 113 | __func__, iminor(inode)); |
114 | unlock_kernel(); | ||
112 | return -ENODEV; | 115 | return -ENODEV; |
113 | } | 116 | } |
114 | 117 | ||
115 | vstdev = usb_get_intfdata(interface); | 118 | vstdev = usb_get_intfdata(interface); |
116 | 119 | ||
117 | if (!vstdev) | 120 | if (!vstdev) { |
121 | unlock_kernel(); | ||
118 | return -ENODEV; | 122 | return -ENODEV; |
123 | } | ||
119 | 124 | ||
120 | /* lock this device */ | 125 | /* lock this device */ |
121 | mutex_lock(&vstdev->lock); | 126 | mutex_lock(&vstdev->lock); |
@@ -123,6 +128,7 @@ static int vstusb_open(struct inode *inode, struct file *file) | |||
123 | /* can only open one time */ | 128 | /* can only open one time */ |
124 | if ((!vstdev->present) || (vstdev->isopen)) { | 129 | if ((!vstdev->present) || (vstdev->isopen)) { |
125 | mutex_unlock(&vstdev->lock); | 130 | mutex_unlock(&vstdev->lock); |
131 | unlock_kernel(); | ||
126 | return -EBUSY; | 132 | return -EBUSY; |
127 | } | 133 | } |
128 | 134 | ||
@@ -137,6 +143,7 @@ static int vstusb_open(struct inode *inode, struct file *file) | |||
137 | dev_dbg(&vstdev->usb_dev->dev, "%s: opened\n", __func__); | 143 | dev_dbg(&vstdev->usb_dev->dev, "%s: opened\n", __func__); |
138 | 144 | ||
139 | mutex_unlock(&vstdev->lock); | 145 | mutex_unlock(&vstdev->lock); |
146 | unlock_kernel(); | ||
140 | 147 | ||
141 | return 0; | 148 | return 0; |
142 | } | 149 | } |