summaryrefslogtreecommitdiff
path: root/drivers/staging/greybus/core.c
diff options
context:
space:
mode:
authorJohan Hovold <johan@hovoldconsulting.com>2016-01-19 12:51:10 +0100
committerGreg Kroah-Hartman <gregkh@google.com>2016-01-19 12:17:13 -0800
commit02a54dd18f1eb831f4bf02ac763a4e9d805e1ba3 (patch)
treee0b21f99c50452d05afc6d1b8a454162ed24e2f8 /drivers/staging/greybus/core.c
parentfa8369c130098da3276bafec425822aa74971905 (diff)
greybus: core: add defensive connection disable post disconnect
Bundle drivers *must* disable their connections in the disconnect callback, but add a defensive test and warn about buggy drivers nonetheless. Note that bundle drivers would generally release their state containers in disconnect so a failure stop I/O could potentially lead to use-after-free bugs in any late operation completion callbacks. Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/core.c')
-rw-r--r--drivers/staging/greybus/core.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/staging/greybus/core.c b/drivers/staging/greybus/core.c
index cf06c9fb5bdc..493f3920aaf0 100644
--- a/drivers/staging/greybus/core.c
+++ b/drivers/staging/greybus/core.c
@@ -165,6 +165,13 @@ static int greybus_remove(struct device *dev)
gb_connection_disable_rx(connection);
driver->disconnect(bundle);
+
+ /* Catch buggy drivers that fail to disable their connections. */
+ list_for_each_entry(connection, &bundle->connections, bundle_links) {
+ if (WARN_ON(connection->state != GB_CONNECTION_STATE_DISABLED))
+ gb_connection_disable(connection);
+ }
+
return 0;
}