diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2014-04-23 13:52:17 +0400 | 
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2014-07-03 14:32:37 +0400 | 
| commit | c334940ea26cb58f5514dcbb225a3f397b2684ad (patch) | |
| tree | ef00fb1054c92630e1f50ec5f0af46d7d9ade671 /drivers/base/component.c | |
| parent | 4c834452aad01531db949414f94f817a86348d59 (diff) | |
| download | linux-c334940ea26cb58f5514dcbb225a3f397b2684ad.tar.xz | |
component: fix missed cleanup in case of devres failure
In try_to_bring_up_master(), we tear down the master's component list
for each error case, except for devres group failure.  Fix this
oversight by making the code less prone to such mistakes.
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/base/component.c')
| -rw-r--r-- | drivers/base/component.c | 62 | 
1 files changed, 31 insertions, 31 deletions
diff --git a/drivers/base/component.c b/drivers/base/component.c index c4778995cd72..d0ebd4431736 100644 --- a/drivers/base/component.c +++ b/drivers/base/component.c @@ -113,44 +113,44 @@ static void master_remove_components(struct master *master)  static int try_to_bring_up_master(struct master *master,  	struct component *component)  { -	int ret = 0; +	int ret; -	if (!master->bound) { -		/* -		 * Search the list of components, looking for components that -		 * belong to this master, and attach them to the master. -		 */ -		if (master->ops->add_components(master->dev, master)) { -			/* Failed to find all components */ -			master_remove_components(master); -			ret = 0; -			goto out; -		} +	if (master->bound) +		return 0; -		if (component && component->master != master) { -			master_remove_components(master); -			ret = 0; -			goto out; -		} +	/* +	 * Search the list of components, looking for components that +	 * belong to this master, and attach them to the master. +	 */ +	if (master->ops->add_components(master->dev, master)) { +		/* Failed to find all components */ +		ret = 0; +		goto out; +	} -		if (!devres_open_group(master->dev, NULL, GFP_KERNEL)) { -			ret = -ENOMEM; -			goto out; -		} +	if (component && component->master != master) { +		ret = 0; +		goto out; +	} -		/* Found all components */ -		ret = master->ops->bind(master->dev); -		if (ret < 0) { -			devres_release_group(master->dev, NULL); -			dev_info(master->dev, "master bind failed: %d\n", ret); -			master_remove_components(master); -			goto out; -		} +	if (!devres_open_group(master->dev, NULL, GFP_KERNEL)) { +		ret = -ENOMEM; +		goto out; +	} -		master->bound = true; -		ret = 1; +	/* Found all components */ +	ret = master->ops->bind(master->dev); +	if (ret < 0) { +		devres_release_group(master->dev, NULL); +		dev_info(master->dev, "master bind failed: %d\n", ret); +		goto out;  	} + +	master->bound = true; +	return 1; +  out: +	master_remove_components(master);  	return ret;  }  | 
