diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/uio/uio.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c index 5dccf057a7dd..f9b4647255aa 100644 --- a/drivers/uio/uio.c +++ b/drivers/uio/uio.c | |||
@@ -47,6 +47,9 @@ static struct uio_class { | |||
47 | struct class *class; | 47 | struct class *class; |
48 | } *uio_class; | 48 | } *uio_class; |
49 | 49 | ||
50 | /* Protect idr accesses */ | ||
51 | static DEFINE_MUTEX(minor_lock); | ||
52 | |||
50 | /* | 53 | /* |
51 | * attributes | 54 | * attributes |
52 | */ | 55 | */ |
@@ -239,7 +242,6 @@ static void uio_dev_del_attributes(struct uio_device *idev) | |||
239 | 242 | ||
240 | static int uio_get_minor(struct uio_device *idev) | 243 | static int uio_get_minor(struct uio_device *idev) |
241 | { | 244 | { |
242 | static DEFINE_MUTEX(minor_lock); | ||
243 | int retval = -ENOMEM; | 245 | int retval = -ENOMEM; |
244 | int id; | 246 | int id; |
245 | 247 | ||
@@ -261,7 +263,9 @@ exit: | |||
261 | 263 | ||
262 | static void uio_free_minor(struct uio_device *idev) | 264 | static void uio_free_minor(struct uio_device *idev) |
263 | { | 265 | { |
266 | mutex_lock(&minor_lock); | ||
264 | idr_remove(&uio_idr, idev->minor); | 267 | idr_remove(&uio_idr, idev->minor); |
268 | mutex_unlock(&minor_lock); | ||
265 | } | 269 | } |
266 | 270 | ||
267 | /** | 271 | /** |
@@ -305,8 +309,9 @@ static int uio_open(struct inode *inode, struct file *filep) | |||
305 | struct uio_listener *listener; | 309 | struct uio_listener *listener; |
306 | int ret = 0; | 310 | int ret = 0; |
307 | 311 | ||
308 | lock_kernel(); | 312 | mutex_lock(&minor_lock); |
309 | idev = idr_find(&uio_idr, iminor(inode)); | 313 | idev = idr_find(&uio_idr, iminor(inode)); |
314 | mutex_unlock(&minor_lock); | ||
310 | if (!idev) { | 315 | if (!idev) { |
311 | ret = -ENODEV; | 316 | ret = -ENODEV; |
312 | goto out; | 317 | goto out; |
@@ -332,18 +337,15 @@ static int uio_open(struct inode *inode, struct file *filep) | |||
332 | if (ret) | 337 | if (ret) |
333 | goto err_infoopen; | 338 | goto err_infoopen; |
334 | } | 339 | } |
335 | unlock_kernel(); | ||
336 | return 0; | 340 | return 0; |
337 | 341 | ||
338 | err_infoopen: | 342 | err_infoopen: |
339 | |||
340 | kfree(listener); | 343 | kfree(listener); |
341 | err_alloc_listener: | ||
342 | 344 | ||
345 | err_alloc_listener: | ||
343 | module_put(idev->owner); | 346 | module_put(idev->owner); |
344 | 347 | ||
345 | out: | 348 | out: |
346 | unlock_kernel(); | ||
347 | return ret; | 349 | return ret; |
348 | } | 350 | } |
349 | 351 | ||