diff options
author | Jonathan Corbet <corbet@lwn.net> | 2008-05-15 11:34:16 -0600 |
---|---|---|
committer | Jonathan Corbet <corbet@lwn.net> | 2008-06-20 14:05:48 -0600 |
commit | 70ffa16e604bab22b12bf72cb7796f1dd01ec335 (patch) | |
tree | bd07484ca841d370fb2edb338ad90453431c3b93 | |
parent | abedd296e97a5d943e76999de97253f1b62a4846 (diff) | |
download | op-kernel-dev-70ffa16e604bab22b12bf72cb7796f1dd01ec335.zip op-kernel-dev-70ffa16e604bab22b12bf72cb7796f1dd01ec335.tar.gz |
drm: cdev lock_kernel() pushdown
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
-rw-r--r-- | drivers/char/drm/drm_fops.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/char/drm/drm_fops.c b/drivers/char/drm/drm_fops.c index 68f0da8..7a25726 100644 --- a/drivers/char/drm/drm_fops.c +++ b/drivers/char/drm/drm_fops.c @@ -37,6 +37,7 @@ #include "drmP.h" #include "drm_sarea.h" #include <linux/poll.h> +#include <linux/smp_lock.h> static int drm_open_helper(struct inode *inode, struct file *filp, struct drm_device * dev); @@ -174,12 +175,14 @@ int drm_stub_open(struct inode *inode, struct file *filp) DRM_DEBUG("\n"); + /* BKL pushdown: note that nothing else serializes idr_find() */ + lock_kernel(); minor = idr_find(&drm_minors_idr, minor_id); if (!minor) - return -ENODEV; + goto out; if (!(dev = minor->dev)) - return -ENODEV; + goto out; old_fops = filp->f_op; filp->f_op = fops_get(&dev->driver->fops); @@ -189,6 +192,8 @@ int drm_stub_open(struct inode *inode, struct file *filp) } fops_put(old_fops); +out: + unlock_kernel(); return err; } |