diff options
Diffstat (limited to 'drivers/gpu/drm/drm_fops.c')
| -rw-r--r-- | drivers/gpu/drm/drm_fops.c | 17 | 
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c index 08d14df3bb4..9d532d7fdf5 100644 --- a/drivers/gpu/drm/drm_fops.c +++ b/drivers/gpu/drm/drm_fops.c @@ -36,6 +36,7 @@  #include "drmP.h"  #include <linux/poll.h> +#include <linux/slab.h>  #include <linux/smp_lock.h>  static int drm_open_helper(struct inode *inode, struct file *filp, @@ -140,14 +141,16 @@ int drm_open(struct inode *inode, struct file *filp)  		spin_unlock(&dev->count_lock);  	}  out: -	mutex_lock(&dev->struct_mutex); -	if (minor->type == DRM_MINOR_LEGACY) { -		BUG_ON((dev->dev_mapping != NULL) && -			(dev->dev_mapping != inode->i_mapping)); -		if (dev->dev_mapping == NULL) -			dev->dev_mapping = inode->i_mapping; +	if (!retcode) { +		mutex_lock(&dev->struct_mutex); +		if (minor->type == DRM_MINOR_LEGACY) { +			if (dev->dev_mapping == NULL) +				dev->dev_mapping = inode->i_mapping; +			else if (dev->dev_mapping != inode->i_mapping) +				retcode = -ENODEV; +		} +		mutex_unlock(&dev->struct_mutex);  	} -	mutex_unlock(&dev->struct_mutex);  	return retcode;  }  |