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: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Viresh Kumar 2015-07-09 10:56:30 +05:30 committed by Greg Kroah-Hartman
parent e4340b13fd
commit e99f305bb7
3 changed files with 18 additions and 0 deletions

View file

@ -313,3 +313,13 @@ void gb_connection_exit(struct gb_connection *connection)
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);
}
}

View file

@ -50,6 +50,7 @@ void gb_connection_destroy(struct gb_connection *connection);
int gb_connection_init(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,
u8 *data, size_t length);

View file

@ -235,6 +235,13 @@ void greybus_remove_hd(struct greybus_host_device *hd)
*/
gb_interfaces_remove(hd);
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);
}
EXPORT_SYMBOL_GPL(greybus_remove_hd);