]> git.itanic.dy.fi Git - linux-stable/commitdiff
powerpc/powermac/feature: Add missing of_node_put()
authorLiang He <windhl@126.com>
Sat, 16 Jul 2022 06:54:12 +0000 (14:54 +0800)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 5 Sep 2022 07:30:29 +0000 (17:30 +1000)
In probe_one_macio(), call of_node_put() for the refernece 'node'
escaped out of the for_each_node_by_name() which has increased its
refcount. While the 'node' will finally escaped into a global reference,
we should still call of_node_put() in fail path which will stop global
reference creation.

Signed-off-by: Liang He <windhl@126.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220716065412.539153-1-windhl@126.com
arch/powerpc/platforms/powermac/feature.c

index 5cc958adba13f1280b089261a4db3e8d3d161bd7..0382d20b56193446cdf2037b0dc30451a30cd8e1 100644 (file)
@@ -2632,31 +2632,31 @@ static void __init probe_one_macio(const char *name, const char *compat, int typ
                if (!macio_chips[i].of_node)
                        break;
                if (macio_chips[i].of_node == node)
-                       return;
+                       goto out_put;
        }
 
        if (i >= MAX_MACIO_CHIPS) {
                printk(KERN_ERR "pmac_feature: Please increase MAX_MACIO_CHIPS !\n");
                printk(KERN_ERR "pmac_feature: %pOF skipped\n", node);
-               return;
+               goto out_put;
        }
        addrp = of_get_pci_address(node, 0, &size, NULL);
        if (addrp == NULL) {
                printk(KERN_ERR "pmac_feature: %pOF: can't find base !\n",
                       node);
-               return;
+               goto out_put;
        }
        addr = of_translate_address(node, addrp);
        if (addr == 0) {
                printk(KERN_ERR "pmac_feature: %pOF, can't translate base !\n",
                       node);
-               return;
+               goto out_put;
        }
        base = ioremap(addr, (unsigned long)size);
        if (!base) {
                printk(KERN_ERR "pmac_feature: %pOF, can't map mac-io chip !\n",
                       node);
-               return;
+               goto out_put;
        }
        if (type == macio_keylargo || type == macio_keylargo2) {
                const u32 *did = of_get_property(node, "device-id", NULL);
@@ -2677,6 +2677,11 @@ static void __init probe_one_macio(const char *name, const char *compat, int typ
                macio_chips[i].rev = *revp;
        printk(KERN_INFO "Found a %s mac-io controller, rev: %d, mapped at 0x%p\n",
                macio_names[type], macio_chips[i].rev, macio_chips[i].base);
+
+       return;
+
+out_put:
+       of_node_put(node);
 }
 
 static int __init