+From 763f413b9c74ccb25cb066408f49f07e5dd78f9b Mon Sep 17 00:00:00 2001
+From: Antonio Quartulli <ordex@autistici.org>
+Date: Tue, 7 May 2013 01:06:18 +0200
+Subject: [PATCH 6/6] batman-adv: reorder clean up routine in order to avoid
+ race conditions
+
+nc_worker accesses the originator table during its periodic
+work, but since the originator table is freed before
+stopping the worker this leads to a global protection fault.
+
+Fix this by killing the worker (in nc_free) before freeing
+the originator table.
+
+Moreover tidy up the entire clean up routine by running all
+the subcomponents freeing procedures first and then killing
+the TT and the originator tables at the end.
+
+Signed-off-by: Antonio Quartulli <ordex@autistici.org>
+Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
+---
+ main.c | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+diff --git a/main.c b/main.c
+index 9c620cd..1240f07 100644
+--- a/main.c
++++ b/main.c
+@@ -163,14 +163,22 @@ void batadv_mesh_free(struct net_device *soft_iface)
+ batadv_vis_quit(bat_priv);
+
+ batadv_gw_node_purge(bat_priv);
+- batadv_originator_free(bat_priv);
+ batadv_nc_free(bat_priv);
++ batadv_dat_free(bat_priv);
++ batadv_bla_free(bat_priv);
+
++ /* Free the TT and the originator tables only after having terminated
++ * all the other depending components which may use these structures for
++ * their purposes.
++ */
+ batadv_tt_free(bat_priv);
+
+- batadv_bla_free(bat_priv);
+-
+- batadv_dat_free(bat_priv);
++ /* Since the originator table clean up routine is accessing the TT
++ * tables as well, it has to be invoked after the TT tables have been
++ * freed and marked as empty. This ensures that no cleanup RCU callbacks
++ * accessing the TT data are scheduled for later execution.
++ */
++ batadv_originator_free(bat_priv);
+
+ free_percpu(bat_priv->bat_counters);
+
+--
+1.7.10.4
+