diff options
Diffstat (limited to 'drivers/gpu/drm/drm_drv.c')
| -rw-r--r-- | drivers/gpu/drm/drm_drv.c | 13 | 
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index ff2f1042cb4..766c46875a2 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c @@ -434,11 +434,11 @@ static int drm_version(struct drm_device *dev, void *data,   * Looks up the ioctl function in the ::ioctls table, checking for root   * previleges if so required, and dispatches to the respective function.   */ -int drm_ioctl(struct inode *inode, struct file *filp, +long drm_ioctl(struct file *filp,  	      unsigned int cmd, unsigned long arg)  {  	struct drm_file *file_priv = filp->private_data; -	struct drm_device *dev = file_priv->minor->dev; +	struct drm_device *dev;  	struct drm_ioctl_desc *ioctl;  	drm_ioctl_t *func;  	unsigned int nr = DRM_IOCTL_NR(cmd); @@ -446,6 +446,7 @@ int drm_ioctl(struct inode *inode, struct file *filp,  	char stack_kdata[128];  	char *kdata = NULL; +	dev = file_priv->minor->dev;  	atomic_inc(&dev->ioctl_count);  	atomic_inc(&dev->counts[_DRM_STAT_IOCTLS]);  	++file_priv->ioctl_count; @@ -501,7 +502,13 @@ int drm_ioctl(struct inode *inode, struct file *filp,  				goto err_i1;  			}  		} -		retcode = func(dev, kdata, file_priv); +		if (ioctl->flags & DRM_UNLOCKED) +			retcode = func(dev, kdata, file_priv); +		else { +			lock_kernel(); +			retcode = func(dev, kdata, file_priv); +			unlock_kernel(); +		}  		if (cmd & IOC_OUT) {  			if (copy_to_user((void __user *)arg, kdata,  |