Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d1ed7d4 authored by Ian Abbott's avatar Ian Abbott Committed by Greg Kroah-Hartman
Browse files

fpga: region: release of_parse_phandle nodes after use



commit 0f5eb1545907edeea7672a9c1652c4231150ff22 upstream.

Both fpga_region_get_manager() and fpga_region_get_bridges() call
of_parse_phandle(), but nothing calls of_node_put() on the returned
struct device_node pointers.  Make sure to do that to stop their
reference counters getting out of whack.

Fixes: 0fa20cdf ("fpga: fpga-region: device tree control for FPGA")
Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarAlan Tull <atull@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a252f37c
Loading
Loading
Loading
Loading
+10 −3
Original line number Original line Diff line number Diff line
@@ -147,6 +147,7 @@ static struct fpga_manager *fpga_region_get_manager(struct fpga_region *region)
			mgr_node = of_parse_phandle(np, "fpga-mgr", 0);
			mgr_node = of_parse_phandle(np, "fpga-mgr", 0);
			if (mgr_node) {
			if (mgr_node) {
				mgr = of_fpga_mgr_get(mgr_node);
				mgr = of_fpga_mgr_get(mgr_node);
				of_node_put(mgr_node);
				of_node_put(np);
				of_node_put(np);
				return mgr;
				return mgr;
			}
			}
@@ -192,10 +193,13 @@ static int fpga_region_get_bridges(struct fpga_region *region,
		parent_br = region_np->parent;
		parent_br = region_np->parent;


	/* If overlay has a list of bridges, use it. */
	/* If overlay has a list of bridges, use it. */
	if (of_parse_phandle(overlay, "fpga-bridges", 0))
	br = of_parse_phandle(overlay, "fpga-bridges", 0);
	if (br) {
		of_node_put(br);
		np = overlay;
		np = overlay;
	else
	} else {
		np = region_np;
		np = region_np;
	}


	for (i = 0; ; i++) {
	for (i = 0; ; i++) {
		br = of_parse_phandle(np, "fpga-bridges", i);
		br = of_parse_phandle(np, "fpga-bridges", i);
@@ -203,12 +207,15 @@ static int fpga_region_get_bridges(struct fpga_region *region,
			break;
			break;


		/* If parent bridge is in list, skip it. */
		/* If parent bridge is in list, skip it. */
		if (br == parent_br)
		if (br == parent_br) {
			of_node_put(br);
			continue;
			continue;
		}


		/* If node is a bridge, get it and add to list */
		/* If node is a bridge, get it and add to list */
		ret = fpga_bridge_get_to_list(br, region->info,
		ret = fpga_bridge_get_to_list(br, region->info,
					      &region->bridge_list);
					      &region->bridge_list);
		of_node_put(br);


		/* If any of the bridges are in use, give up */
		/* If any of the bridges are in use, give up */
		if (ret == -EBUSY) {
		if (ret == -EBUSY) {