batman-adv: refactor tt_global_del() to avoid misalignment
authorSven Eckelmann <sven@narfation.org>
Thu, 22 Dec 2011 12:31:12 +0000 (20:31 +0800)
committerMarek Lindner <lindner_marek@yahoo.de>
Thu, 16 Feb 2012 18:50:20 +0000 (02:50 +0800)
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Acked-by: Antonio Quartulli <ordex@autistici.org>
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
net/batman-adv/translation-table.c

index ff9a1b3..30c2d1b 100644 (file)
@@ -657,29 +657,31 @@ void tt_global_del(struct bat_priv *bat_priv,
        struct tt_local_entry *tt_local_entry = NULL;
 
        tt_global_entry = tt_global_hash_find(bat_priv, addr);
-       if (!tt_global_entry)
+       if (!tt_global_entry || tt_global_entry->orig_node != orig_node)
                goto out;
 
-       if (tt_global_entry->orig_node == orig_node) {
-               if (roaming) {
-                       /* if we are deleting a global entry due to a roam
-                        * event, there are two possibilities:
-                        * 1) the client roamed from node A to node B => we mark
-                        *    it with TT_CLIENT_ROAM, we start a timer and we
-                        *    wait for node B to claim it. In case of timeout
-                        *    the entry is purged.
-                        * 2) the client roamed to us => we can directly delete
-                        *    the global entry, since it is useless now. */
-                       tt_local_entry = tt_local_hash_find(bat_priv,
-                                                           tt_global_entry->common.addr);
-                       if (!tt_local_entry) {
-                               tt_global_entry->common.flags |= TT_CLIENT_ROAM;
-                               tt_global_entry->roam_at = jiffies;
-                               goto out;
-                       }
-               }
-               _tt_global_del(bat_priv, tt_global_entry, message);
+       if (!roaming)
+               goto out_del;
+
+       /* if we are deleting a global entry due to a roam
+        * event, there are two possibilities:
+        * 1) the client roamed from node A to node B => we mark
+        *    it with TT_CLIENT_ROAM, we start a timer and we
+        *    wait for node B to claim it. In case of timeout
+        *    the entry is purged.
+        * 2) the client roamed to us => we can directly delete
+        *    the global entry, since it is useless now. */
+       tt_local_entry = tt_local_hash_find(bat_priv,
+                                           tt_global_entry->common.addr);
+       if (!tt_local_entry) {
+               tt_global_entry->common.flags |= TT_CLIENT_ROAM;
+               tt_global_entry->roam_at = jiffies;
+               goto out;
        }
+
+out_del:
+       _tt_global_del(bat_priv, tt_global_entry, message);
+
 out:
        if (tt_global_entry)
                tt_global_entry_free_ref(tt_global_entry);