| From 2c79c6444048a804883c65c6764415c0dd3ee9c2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 27 Aug 2018 21:15:39 -0700 |
| Subject: component: fix loop condition to call unbind() if bind() fails |
| |
| From: Banajit Goswami <bgoswami@codeaurora.org> |
| |
| [ Upstream commit bdae566d5d9733b6e32b378668b84eadf28a94d4 ] |
| |
| During component_bind_all(), if bind() fails for any |
| particular component associated with a master, unbind() |
| should be called for all previous components in that |
| master's match array, whose bind() might have completed |
| successfully. As per the current logic, if bind() fails |
| for the component at position 'n' in the master's match |
| array, it would start calling unbind() from component in |
| 'n'th position itself and work backwards, and will always |
| skip calling unbind() for component in 0th position in the |
| master's match array. |
| Fix this by updating the loop condition, and the logic to |
| refer to the components in master's match array, so that |
| unbind() is called for all components starting from 'n-1'st |
| position in the array, until (and including) component in |
| 0th position. |
| |
| Signed-off-by: Banajit Goswami <bgoswami@codeaurora.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/base/component.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/base/component.c b/drivers/base/component.c |
| index 8946dfee4768e..e8d676fad0c95 100644 |
| --- a/drivers/base/component.c |
| +++ b/drivers/base/component.c |
| @@ -536,9 +536,9 @@ int component_bind_all(struct device *master_dev, void *data) |
| } |
| |
| if (ret != 0) { |
| - for (; i--; ) |
| - if (!master->match->compare[i].duplicate) { |
| - c = master->match->compare[i].component; |
| + for (; i > 0; i--) |
| + if (!master->match->compare[i - 1].duplicate) { |
| + c = master->match->compare[i - 1].component; |
| component_unbind(c, master, data); |
| } |
| } |
| -- |
| 2.20.1 |
| |