| From d5363219287e11386f82638a6bd4ad78a8ba7071 Mon Sep 17 00:00:00 2001 | 
 | From: Tobias Klauser <tklauser@distanz.ch> | 
 | Date: Mon, 24 Apr 2017 16:34:21 -0500 | 
 | Subject: [PATCH 097/103] fpga: region: release FPGA region reference in error | 
 |  path | 
 |  | 
 | If fpga_region_get_manager() fails in fpga_region_program_fpga(), a | 
 | reference to the fpga_manager instance previously acquired through | 
 | fpga_region_get() is retained. Make sure to properly release it in the | 
 | error case by using a separate jump label which will call | 
 | fpga_region_put() in before returning. | 
 |  | 
 | Signed-off-by: Tobias Klauser <tklauser@distanz.ch> | 
 | Acked-by: Moritz Fischer <mdf@kernel.org> | 
 | Signed-off-by: Alan Tull <atull@kernel.org> | 
 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 
 | --- | 
 |  drivers/fpga/fpga-region.c |    4 +++- | 
 |  1 file changed, 3 insertions(+), 1 deletion(-) | 
 |  | 
 | --- a/drivers/fpga/fpga-region.c | 
 | +++ b/drivers/fpga/fpga-region.c | 
 | @@ -245,7 +245,8 @@ static int fpga_region_program_fpga(stru | 
 |  	mgr = fpga_region_get_manager(region); | 
 |  	if (IS_ERR(mgr)) { | 
 |  		pr_err("failed to get fpga region manager\n"); | 
 | -		return PTR_ERR(mgr); | 
 | +		ret = PTR_ERR(mgr); | 
 | +		goto err_put_region; | 
 |  	} | 
 |   | 
 |  	ret = fpga_region_get_bridges(region, overlay); | 
 | @@ -281,6 +282,7 @@ err_put_br: | 
 |  	fpga_bridges_put(®ion->bridge_list); | 
 |  err_put_mgr: | 
 |  	fpga_mgr_put(mgr); | 
 | +err_put_region: | 
 |  	fpga_region_put(region); | 
 |   | 
 |  	return ret; |