OSDN Git Service

Fix must-check warnings and implement a few error paths.
authorKristian Høgsberg <krh@redhat.com>
Mon, 2 Jul 2007 21:52:07 +0000 (17:52 -0400)
committerKristian Høgsberg <krh@redhat.com>
Mon, 2 Jul 2007 21:52:07 +0000 (17:52 -0400)
linux-core/drm_drv.c
linux-core/drm_stub.c
linux-core/drm_sysfs.c

index d5eb971..6bbe7fc 100644 (file)
@@ -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];
index f57ed9c..b96408a 100644 (file)
@@ -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;
index ace0778..9b2f5dc 100644 (file)
@@ -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);
 }