]> git.itanic.dy.fi Git - linux-stable/commitdiff
m68k: virt: Fix missing platform_device_unregister() on error in virt_platform_init()
authorYang Yingliang <yangyingliang@huawei.com>
Tue, 28 Jun 2022 08:49:03 +0000 (16:49 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 13:14:15 +0000 (15:14 +0200)
[ Upstream commit 566a2d6d8e429727832c7e347cbe736b12ad7297 ]

Add the missing platform_device_unregister() before return
from virt_platform_init() in the error handling case.

Fixes: 05d51e42df06 ("m68k: Introduce a virtual m68k machine")
Reported-by: Hulk Robot <hulkci@huawei.com>
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Link: https://lore.kernel.org/r/20220628084903.3147123-1-yangyingliang@huawei.com
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/m68k/virt/platform.c

index cb820f19a221907b93d91deb601beb2a99187b10..1560c4140ab91d3ed01f50ca45d690ddbca7d9cb 100644 (file)
@@ -8,20 +8,15 @@
 
 #define VIRTIO_BUS_NB  128
 
-static int __init virt_virtio_init(unsigned int id)
+static struct platform_device * __init virt_virtio_init(unsigned int id)
 {
        const struct resource res[] = {
                DEFINE_RES_MEM(virt_bi_data.virtio.mmio + id * 0x200, 0x200),
                DEFINE_RES_IRQ(virt_bi_data.virtio.irq + id),
        };
-       struct platform_device *pdev;
 
-       pdev = platform_device_register_simple("virtio-mmio", id,
+       return platform_device_register_simple("virtio-mmio", id,
                                               res, ARRAY_SIZE(res));
-       if (IS_ERR(pdev))
-               return PTR_ERR(pdev);
-
-       return 0;
 }
 
 static int __init virt_platform_init(void)
@@ -35,8 +30,10 @@ static int __init virt_platform_init(void)
                DEFINE_RES_MEM(virt_bi_data.rtc.mmio + 0x1000, 0x1000),
                DEFINE_RES_IRQ(virt_bi_data.rtc.irq + 1),
        };
-       struct platform_device *pdev;
+       struct platform_device *pdev1, *pdev2;
+       struct platform_device *pdevs[VIRTIO_BUS_NB];
        unsigned int i;
+       int ret = 0;
 
        if (!MACH_IS_VIRT)
                return -ENODEV;
@@ -44,29 +41,40 @@ static int __init virt_platform_init(void)
        /* We need this to have DMA'able memory provided to goldfish-tty */
        min_low_pfn = 0;
 
-       pdev = platform_device_register_simple("goldfish_tty",
-                                              PLATFORM_DEVID_NONE,
-                                              goldfish_tty_res,
-                                              ARRAY_SIZE(goldfish_tty_res));
-       if (IS_ERR(pdev))
-               return PTR_ERR(pdev);
+       pdev1 = platform_device_register_simple("goldfish_tty",
+                                               PLATFORM_DEVID_NONE,
+                                               goldfish_tty_res,
+                                               ARRAY_SIZE(goldfish_tty_res));
+       if (IS_ERR(pdev1))
+               return PTR_ERR(pdev1);
 
-       pdev = platform_device_register_simple("goldfish_rtc",
-                                              PLATFORM_DEVID_NONE,
-                                              goldfish_rtc_res,
-                                              ARRAY_SIZE(goldfish_rtc_res));
-       if (IS_ERR(pdev))
-               return PTR_ERR(pdev);
+       pdev2 = platform_device_register_simple("goldfish_rtc",
+                                               PLATFORM_DEVID_NONE,
+                                               goldfish_rtc_res,
+                                               ARRAY_SIZE(goldfish_rtc_res));
+       if (IS_ERR(pdev2)) {
+               ret = PTR_ERR(pdev2);
+               goto err_unregister_tty;
+       }
 
        for (i = 0; i < VIRTIO_BUS_NB; i++) {
-               int err;
-
-               err = virt_virtio_init(i);
-               if (err)
-                       return err;
+               pdevs[i] = virt_virtio_init(i);
+               if (IS_ERR(pdevs[i])) {
+                       ret = PTR_ERR(pdevs[i]);
+                       goto err_unregister_rtc_virtio;
+               }
        }
 
        return 0;
+
+err_unregister_rtc_virtio:
+       while (i > 0)
+               platform_device_unregister(pdevs[--i]);
+       platform_device_unregister(pdev2);
+err_unregister_tty:
+       platform_device_unregister(pdev1);
+
+       return ret;
 }
 
 arch_initcall(virt_platform_init);