drivers/iommu/msm_iommu_dev.c: fix leak and clean up error paths
authorLibo Chen <clbchenlibo.chen@huawei.com>
Mon, 8 Jul 2013 22:59:47 +0000 (15:59 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 9 Jul 2013 17:33:20 +0000 (10:33 -0700)
Fix two obvious problems:

1. We have registered msm_iommu_driver first, and need unregister it
   when registered msm_iommu_ctx_driver fail

2. We don't need to kfree drvdata before kzalloc was successful.

[akpm@linux-foundation.org: remove now-unneeded initialization of ctx_drvdata, remove unneeded braces]
Signed-off-by: Libo Chen <libo.chen@huawei.com>
Acked-by: David Brown <davidb@codeaurora.org>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: James Hogan <james.hogan@imgtec.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/iommu/msm_iommu_dev.c

index 9144a6b..6ba3514 100644 (file)
@@ -291,25 +291,20 @@ static int msm_iommu_ctx_probe(struct platform_device *pdev)
 {
        struct msm_iommu_ctx_dev *c = pdev->dev.platform_data;
        struct msm_iommu_drvdata *drvdata;
-       struct msm_iommu_ctx_drvdata *ctx_drvdata = NULL;
+       struct msm_iommu_ctx_drvdata *ctx_drvdata;
        int i, ret;
-       if (!c || !pdev->dev.parent) {
-               ret = -EINVAL;
-               goto fail;
-       }
 
-       drvdata = dev_get_drvdata(pdev->dev.parent);
+       if (!c || !pdev->dev.parent)
+               return -EINVAL;
 
-       if (!drvdata) {
-               ret = -ENODEV;
-               goto fail;
-       }
+       drvdata = dev_get_drvdata(pdev->dev.parent);
+       if (!drvdata)
+               return -ENODEV;
 
        ctx_drvdata = kzalloc(sizeof(*ctx_drvdata), GFP_KERNEL);
-       if (!ctx_drvdata) {
-               ret = -ENOMEM;
-               goto fail;
-       }
+       if (!ctx_drvdata)
+               return -ENOMEM;
+
        ctx_drvdata->num = c->num;
        ctx_drvdata->pdev = pdev;
 
@@ -403,6 +398,7 @@ static int __init msm_iommu_driver_init(void)
 
        ret = platform_driver_register(&msm_iommu_ctx_driver);
        if (ret != 0) {
+               platform_driver_unregister(&msm_iommu_driver);
                pr_err("Failed to register IOMMU context driver\n");
                goto error;
        }