Commit e99f305b authored by Viresh Kumar's avatar Viresh Kumar Committed by Greg Kroah-Hartman

greybus: Cleanup connection leftovers

This wouldn't happen normally, but in a buggy corner case it is possible
that all the connections aren't removed properly and they are still
present after the interfaces and endo are removed.

Warn in such a case and cleanup connections, so that /sys/bus/greybus/
can be removed while removing greybus modules.
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent e4340b13
...@@ -313,3 +313,13 @@ void gb_connection_exit(struct gb_connection *connection) ...@@ -313,3 +313,13 @@ void gb_connection_exit(struct gb_connection *connection)
cport_id, ret); cport_id, ret);
} }
} }
void gb_hd_connections_exit(struct greybus_host_device *hd)
{
struct gb_connection *connection;
list_for_each_entry(connection, &hd->connections, hd_links) {
gb_connection_exit(connection);
gb_connection_destroy(connection);
}
}
...@@ -50,6 +50,7 @@ void gb_connection_destroy(struct gb_connection *connection); ...@@ -50,6 +50,7 @@ void gb_connection_destroy(struct gb_connection *connection);
int gb_connection_init(struct gb_connection *connection); int gb_connection_init(struct gb_connection *connection);
void gb_connection_exit(struct gb_connection *connection); void gb_connection_exit(struct gb_connection *connection);
void gb_hd_connections_exit(struct greybus_host_device *hd);
void greybus_data_rcvd(struct greybus_host_device *hd, u16 cport_id, void greybus_data_rcvd(struct greybus_host_device *hd, u16 cport_id,
u8 *data, size_t length); u8 *data, size_t length);
......
...@@ -235,6 +235,13 @@ void greybus_remove_hd(struct greybus_host_device *hd) ...@@ -235,6 +235,13 @@ void greybus_remove_hd(struct greybus_host_device *hd)
*/ */
gb_interfaces_remove(hd); gb_interfaces_remove(hd);
gb_endo_remove(hd->endo); gb_endo_remove(hd->endo);
/*
* Make sure there are no leftovers that can potentially corrupt sysfs.
*/
if (WARN_ON(!list_empty(&hd->connections)))
gb_hd_connections_exit(hd);
kref_put_mutex(&hd->kref, free_hd, &hd_mutex); kref_put_mutex(&hd->kref, free_hd, &hd_mutex);
} }
EXPORT_SYMBOL_GPL(greybus_remove_hd); EXPORT_SYMBOL_GPL(greybus_remove_hd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment