diff options
| -rw-r--r-- | linux-core/drm_drv.c | 2 | ||||
| -rw-r--r-- | linux-core/drm_stub.c | 26 | ||||
| -rw-r--r-- | linux-core/drm_sysfs.c | 31 | 
3 files changed, 43 insertions, 16 deletions
diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index d5eb9713..6bbe7fca 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -311,7 +311,7 @@ int drm_init(struct drm_driver *driver,  	}  	if (!drm_fb_loaded) -		pci_register_driver(&driver->pci_driver); +		return pci_register_driver(&driver->pci_driver);  	else {  		for (i = 0; pciidlist[i].vendor != 0; i++) {  			pid = &pciidlist[i]; diff --git a/linux-core/drm_stub.c b/linux-core/drm_stub.c index f57ed9cc..b96408ab 100644 --- a/linux-core/drm_stub.c +++ b/linux-core/drm_stub.c @@ -232,18 +232,22 @@ int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,  	if (!drm_fb_loaded) {  		pci_set_drvdata(pdev, dev); -		pci_request_regions(pdev, driver->pci_driver.name); +		ret = pci_request_regions(pdev, driver->pci_driver.name); +		if (ret) +			goto err_g1;  	} -	pci_enable_device(pdev); +	ret = pci_enable_device(pdev); +	if (ret) +		goto err_g2;  	pci_set_master(pdev);  	if ((ret = drm_fill_in_dev(dev, pdev, ent, driver))) {  		printk(KERN_ERR "DRM: fill_in_dev failed\n"); -		goto err_g1; +		goto err_g3;  	}  	if ((ret = drm_get_head(dev, &dev->primary))) -		goto err_g1; +		goto err_g3;  	DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n",  		 driver->name, driver->major, driver->minor, driver->patchlevel, @@ -251,12 +255,16 @@ int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,  	return 0; -err_g1: -	if (!drm_fb_loaded) { -		pci_set_drvdata(pdev, NULL); -		pci_release_regions(pdev); + err_g3: +	if (!drm_fb_loaded)  		pci_disable_device(pdev); -	} + err_g2: +	if (!drm_fb_loaded) +		pci_release_regions(pdev); + err_g1: +	if (!drm_fb_loaded) +		pci_set_drvdata(pdev, NULL); +  	drm_free(dev, sizeof(*dev), DRM_MEM_STUB);  	printk(KERN_ERR "DRM: drm_get_dev failed.\n");  	return ret; diff --git a/linux-core/drm_sysfs.c b/linux-core/drm_sysfs.c index ace0778b..9b2f5dce 100644 --- a/linux-core/drm_sysfs.c +++ b/linux-core/drm_sysfs.c @@ -93,11 +93,15 @@ struct drm_sysfs_class *drm_sysfs_create(struct module *owner, char *name)  	retval = class_register(&cs->class);  	if (retval)  		goto error; -	class_create_file(&cs->class, &class_attr_version); +	retval = class_create_file(&cs->class, &class_attr_version); +	if (retval) +		goto error_with_class;  	return cs; -      error: + error_with_class: +	class_unregister(&cs->class); + error:  	kfree(cs);  	return ERR_PTR(retval);  } @@ -170,16 +174,31 @@ struct class_device *drm_sysfs_device_add(struct drm_sysfs_class *cs,  	if (retval)  		goto error; -	class_device_create_file(&s_dev->class_dev, &cs->attr); +	retval = class_device_create_file(&s_dev->class_dev, &cs->attr); +	if (retval) +		goto error_with_device; +  	class_set_devdata(&s_dev->class_dev, head); -	for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) -		class_device_create_file(&s_dev->class_dev, &class_device_attrs[i]); +	for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) { +		retval = class_device_create_file(&s_dev->class_dev, +						  &class_device_attrs[i]); +		if (retval) +			goto error_with_files; +	}  	return &s_dev->class_dev; -error: + error_with_files: +	while (i > 0) +		class_device_remove_file(&s_dev->class_dev, +					 &class_device_attrs[--i]); +	class_device_remove_file(&s_dev->class_dev, &cs->attr); + error_with_device: +	class_device_unregister(&s_dev->class_dev); + error:  	kfree(s_dev); +  	return ERR_PTR(retval);  }  | 
