diff options
Diffstat (limited to 'drivers/gpu/drm/drm_global.c')
| -rw-r--r-- | drivers/gpu/drm/drm_global.c | 24 | 
1 files changed, 14 insertions, 10 deletions
| diff --git a/drivers/gpu/drm/drm_global.c b/drivers/gpu/drm/drm_global.c index 3d2e91c4d78e..b404287abb97 100644 --- a/drivers/gpu/drm/drm_global.c +++ b/drivers/gpu/drm/drm_global.c @@ -65,30 +65,34 @@ void drm_global_release(void)  int drm_global_item_ref(struct drm_global_reference *ref)  { -	int ret; +	int ret = 0;  	struct drm_global_item *item = &glob[ref->global_type];  	mutex_lock(&item->mutex);  	if (item->refcount == 0) { -		item->object = kzalloc(ref->size, GFP_KERNEL); -		if (unlikely(item->object == NULL)) { +		ref->object = kzalloc(ref->size, GFP_KERNEL); +		if (unlikely(ref->object == NULL)) {  			ret = -ENOMEM; -			goto out_err; +			goto error_unlock;  		} - -		ref->object = item->object;  		ret = ref->init(ref);  		if (unlikely(ret != 0)) -			goto out_err; +			goto error_free; +		item->object = ref->object; +	} else { +		ref->object = item->object;  	} +  	++item->refcount; -	ref->object = item->object;  	mutex_unlock(&item->mutex);  	return 0; -out_err: + +error_free: +	kfree(ref->object); +	ref->object = NULL; +error_unlock:  	mutex_unlock(&item->mutex); -	item->object = NULL;  	return ret;  }  EXPORT_SYMBOL(drm_global_item_ref); | 
