diff options
Diffstat (limited to 'drivers/gpu/drm/drm_file.c')
| -rw-r--r-- | drivers/gpu/drm/drm_file.c | 24 | 
1 files changed, 17 insertions, 7 deletions
| diff --git a/drivers/gpu/drm/drm_file.c b/drivers/gpu/drm/drm_file.c index 46f48f245eb5..83a5bbca6e7e 100644 --- a/drivers/gpu/drm/drm_file.c +++ b/drivers/gpu/drm/drm_file.c @@ -262,6 +262,18 @@ void drm_file_free(struct drm_file *file)  	kfree(file);  } +static void drm_close_helper(struct file *filp) +{ +	struct drm_file *file_priv = filp->private_data; +	struct drm_device *dev = file_priv->minor->dev; + +	mutex_lock(&dev->filelist_mutex); +	list_del(&file_priv->lhead); +	mutex_unlock(&dev->filelist_mutex); + +	drm_file_free(file_priv); +} +  static int drm_setup(struct drm_device * dev)  {  	int ret; @@ -318,8 +330,10 @@ int drm_open(struct inode *inode, struct file *filp)  		goto err_undo;  	if (need_setup) {  		retcode = drm_setup(dev); -		if (retcode) +		if (retcode) { +			drm_close_helper(filp);  			goto err_undo; +		}  	}  	return 0; @@ -473,11 +487,7 @@ int drm_release(struct inode *inode, struct file *filp)  	DRM_DEBUG("open_count = %d\n", dev->open_count); -	mutex_lock(&dev->filelist_mutex); -	list_del(&file_priv->lhead); -	mutex_unlock(&dev->filelist_mutex); - -	drm_file_free(file_priv); +	drm_close_helper(filp);  	if (!--dev->open_count) {  		drm_lastclose(dev); @@ -701,7 +711,7 @@ int drm_event_reserve_init(struct drm_device *dev,  EXPORT_SYMBOL(drm_event_reserve_init);  /** - * drm_event_cancel_free - free a DRM event and release it's space + * drm_event_cancel_free - free a DRM event and release its space   * @dev: DRM device   * @p: tracking structure for the pending event   * | 
