}
/**
- * tb_path_free() - free a deactivated path
+ * tb_path_free() - free a path
+ * @path: Path to free
+ *
+ * Frees a path. The path does not need to be deactivated.
*/
void tb_path_free(struct tb_path *path)
{
int i;
- if (path->activated) {
- tb_WARN(path->tb, "trying to free an activated path\n")
- return;
- }
-
for (i = 0; i < path->path_length; i++) {
const struct tb_path_hop *hop = &path->hops[i];
struct tb_tunnel *n;
/* tunnels are only present after everything has been initialized */
- list_for_each_entry_safe(tunnel, n, &tcm->tunnel_list, list) {
- tb_tunnel_deactivate(tunnel);
+ list_for_each_entry_safe(tunnel, n, &tcm->tunnel_list, list)
tb_tunnel_free(tunnel);
- }
tb_switch_remove(tb->root_switch);
tcm->hotplug_active = false; /* signal tb_handle_hotplug to quit */
}
* tb_tunnel_free() - free a tunnel
* @tunnel: Tunnel to be freed
*
- * The tunnel must have been deactivated.
+ * Frees a tunnel. The tunnel does not need to be deactivated.
*/
void tb_tunnel_free(struct tb_tunnel *tunnel)
{
if (!tunnel)
return;
- for (i = 0; i < tunnel->npaths; i++) {
- if (tunnel->paths[i] && tunnel->paths[i]->activated) {
- tb_tunnel_WARN(tunnel,
- "trying to free an activated tunnel\n");
- return;
- }
- }
-
for (i = 0; i < tunnel->npaths; i++) {
if (tunnel->paths[i])
tb_path_free(tunnel->paths[i]);