]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-4.19/pci-rpadlpar-fix-leaked-device_node-references-in-ad.patch
b304f2881808e436ff6dbc6cb713cca3d15d62c6
[thirdparty/kernel/stable-queue.git] / queue-4.19 / pci-rpadlpar-fix-leaked-device_node-references-in-ad.patch
1 From df2cc856ab698479bc93f9e09da627f580be57d4 Mon Sep 17 00:00:00 2001
2 From: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
3 Date: Fri, 22 Mar 2019 13:27:21 -0500
4 Subject: PCI: rpadlpar: Fix leaked device_node references in add/remove paths
5
6 [ Upstream commit fb26228bfc4ce3951544848555c0278e2832e618 ]
7
8 The find_dlpar_node() helper returns a device node with its reference
9 incremented. Both the add and remove paths use this helper for find the
10 appropriate node, but fail to release the reference when done.
11
12 Annotate the find_dlpar_node() helper with a comment about the incremented
13 reference count and call of_node_put() on the obtained device_node in the
14 add and remove paths. Also, fixup a reference leak in the find_vio_slot()
15 helper where we fail to call of_node_put() on the vdevice node after we
16 iterate over its children.
17
18 Signed-off-by: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
19 Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
20 Signed-off-by: Sasha Levin <sashal@kernel.org>
21 ---
22 drivers/pci/hotplug/rpadlpar_core.c | 4 ++++
23 1 file changed, 4 insertions(+)
24
25 diff --git a/drivers/pci/hotplug/rpadlpar_core.c b/drivers/pci/hotplug/rpadlpar_core.c
26 index e2356a9c7088..182f9e3443ee 100644
27 --- a/drivers/pci/hotplug/rpadlpar_core.c
28 +++ b/drivers/pci/hotplug/rpadlpar_core.c
29 @@ -51,6 +51,7 @@ static struct device_node *find_vio_slot_node(char *drc_name)
30 if (rc == 0)
31 break;
32 }
33 + of_node_put(parent);
34
35 return dn;
36 }
37 @@ -71,6 +72,7 @@ static struct device_node *find_php_slot_pci_node(char *drc_name,
38 return np;
39 }
40
41 +/* Returns a device_node with its reference count incremented */
42 static struct device_node *find_dlpar_node(char *drc_name, int *node_type)
43 {
44 struct device_node *dn;
45 @@ -306,6 +308,7 @@ int dlpar_add_slot(char *drc_name)
46 rc = dlpar_add_phb(drc_name, dn);
47 break;
48 }
49 + of_node_put(dn);
50
51 printk(KERN_INFO "%s: slot %s added\n", DLPAR_MODULE_NAME, drc_name);
52 exit:
53 @@ -439,6 +442,7 @@ int dlpar_remove_slot(char *drc_name)
54 rc = dlpar_remove_pci_slot(drc_name, dn);
55 break;
56 }
57 + of_node_put(dn);
58 vm_unmap_aliases();
59
60 printk(KERN_INFO "%s: slot %s removed\n", DLPAR_MODULE_NAME, drc_name);
61 --
62 2.20.1
63