if (!neigh_node)
                return NULL;
 
-       INIT_LIST_HEAD(&neigh_node->list);
+       INIT_HLIST_NODE(&neigh_node->list);
 
        memcpy(neigh_node->addr, neigh, ETH_ALEN);
        neigh_node->orig_node = orig_neigh_node;
        neigh_node->if_incoming = if_incoming;
        kref_init(&neigh_node->refcount);
 
-       list_add_tail(&neigh_node->list, &orig_node->neigh_list);
+       hlist_add_head(&neigh_node->list, &orig_node->neigh_list);
        return neigh_node;
 }
 
 static void free_orig_node(void *data, void *arg)
 {
-       struct list_head *list_pos, *list_pos_tmp;
+       struct hlist_node *node, *node_tmp;
        struct neigh_node *neigh_node;
        struct orig_node *orig_node = (struct orig_node *)data;
        struct bat_priv *bat_priv = (struct bat_priv *)arg;
 
        /* for all neighbors towards this originator ... */
-       list_for_each_safe(list_pos, list_pos_tmp, &orig_node->neigh_list) {
-               neigh_node = list_entry(list_pos, struct neigh_node, list);
-
-               list_del(list_pos);
+       hlist_for_each_entry_safe(neigh_node, node, node_tmp,
+                                 &orig_node->neigh_list, list) {
+               hlist_del(&neigh_node->list);
                kref_put(&neigh_node->refcount, neigh_node_free_ref);
        }
 
        if (!orig_node)
                return NULL;
 
-       INIT_LIST_HEAD(&orig_node->neigh_list);
+       INIT_HLIST_HEAD(&orig_node->neigh_list);
 
        memcpy(orig_node->orig, addr, ETH_ALEN);
        orig_node->router = NULL;
                                 struct orig_node *orig_node,
                                 struct neigh_node **best_neigh_node)
 {
-       struct list_head *list_pos, *list_pos_tmp;
+       struct hlist_node *node, *node_tmp;
        struct neigh_node *neigh_node;
        bool neigh_purged = false;
 
        *best_neigh_node = NULL;
 
        /* for all neighbors towards this originator ... */
-       list_for_each_safe(list_pos, list_pos_tmp, &orig_node->neigh_list) {
-               neigh_node = list_entry(list_pos, struct neigh_node, list);
+       hlist_for_each_entry_safe(neigh_node, node, node_tmp,
+                                 &orig_node->neigh_list, list) {
 
                if ((time_after(jiffies,
                        neigh_node->last_valid + PURGE_TIMEOUT * HZ)) ||
                                        (neigh_node->last_valid / HZ));
 
                        neigh_purged = true;
-                       list_del(list_pos);
+
+                       hlist_del(&neigh_node->list);
                        kref_put(&neigh_node->refcount, neigh_node_free_ref);
                } else {
                        if ((!*best_neigh_node) ||
        struct net_device *net_dev = (struct net_device *)seq->private;
        struct bat_priv *bat_priv = netdev_priv(net_dev);
        struct hashtable_t *hash = bat_priv->orig_hash;
-       struct hlist_node *walk;
+       struct hlist_node *walk, *node;
        struct hlist_head *head;
        struct element_t *bucket;
        struct orig_node *orig_node;
                                   neigh_node->addr,
                                   neigh_node->if_incoming->net_dev->name);
 
-                       list_for_each_entry(neigh_node, &orig_node->neigh_list,
-                                           list) {
+                       hlist_for_each_entry(neigh_node, node,
+                                            &orig_node->neigh_list, list) {
                                seq_printf(seq, " %pM (%3i)", neigh_node->addr,
                                                neigh_node->tq_avg);
                        }
 
 {
        struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
        struct neigh_node *neigh_node = NULL, *tmp_neigh_node = NULL;
+       struct hlist_node *node;
        unsigned char total_count;
 
        if (orig_node == orig_neigh_node) {
-               list_for_each_entry(tmp_neigh_node,
-                                   &orig_node->neigh_list,
-                                   list) {
+               hlist_for_each_entry(tmp_neigh_node, node,
+                                    &orig_node->neigh_list, list) {
 
                        if (compare_orig(tmp_neigh_node->addr,
                                         orig_neigh_node->orig) &&
                neigh_node->last_valid = jiffies;
        } else {
                /* find packet count of corresponding one hop neighbor */
-               list_for_each_entry(tmp_neigh_node,
-                                   &orig_neigh_node->neigh_list, list) {
+               hlist_for_each_entry(tmp_neigh_node, node,
+                                    &orig_neigh_node->neigh_list, list) {
 
                        if (compare_orig(tmp_neigh_node->addr,
                                         orig_neigh_node->orig) &&
                        char is_duplicate)
 {
        struct neigh_node *neigh_node = NULL, *tmp_neigh_node = NULL;
+       struct hlist_node *node;
        int tmp_hna_buff_len;
 
        bat_dbg(DBG_BATMAN, bat_priv, "update_originator(): "
                "Searching and updating originator entry of received packet\n");
 
-       list_for_each_entry(tmp_neigh_node, &orig_node->neigh_list, list) {
+       hlist_for_each_entry(tmp_neigh_node, node,
+                            &orig_node->neigh_list, list) {
                if (compare_orig(tmp_neigh_node->addr, ethhdr->h_source) &&
                    (tmp_neigh_node->if_incoming == if_incoming)) {
                        neigh_node = tmp_neigh_node;
        struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
        struct orig_node *orig_node;
        struct neigh_node *tmp_neigh_node;
+       struct hlist_node *node;
        char is_duplicate = 0;
        int32_t seq_diff;
        int need_update = 0;
                             &orig_node->batman_seqno_reset))
                return -1;
 
-       list_for_each_entry(tmp_neigh_node, &orig_node->neigh_list, list) {
+       hlist_for_each_entry(tmp_neigh_node, node,
+                            &orig_node->neigh_list, list) {
 
                is_duplicate |= get_bit_status(tmp_neigh_node->real_bits,
                                               orig_node->last_real_seqno,
        int candidates;
        int interference_candidate;
        int best_tq;
+       struct hlist_node *node, *node2;
        struct neigh_node *tmp_neigh_node, *tmp_neigh_node2;
        struct neigh_node *first_candidate, *last_candidate;
 
         * as "bonding partner" */
 
        /* first, zero the list */
-       list_for_each_entry(tmp_neigh_node, &orig_node->neigh_list, list) {
+       hlist_for_each_entry(tmp_neigh_node, node,
+                            &orig_node->neigh_list, list) {
                tmp_neigh_node->next_bond_candidate = NULL;
        }
 
        first_candidate = NULL;
        last_candidate = NULL;
-       list_for_each_entry(tmp_neigh_node, &orig_node->neigh_list, list) {
+       hlist_for_each_entry(tmp_neigh_node, node,
+                            &orig_node->neigh_list, list) {
 
                /* only consider if it has the same primary address ...  */
                if (memcmp(orig_node->orig,
                 * select this candidate because of possible interference. */
 
                interference_candidate = 0;
-               list_for_each_entry(tmp_neigh_node2,
-                               &orig_node->neigh_list, list) {
+               hlist_for_each_entry(tmp_neigh_node2, node2,
+                                    &orig_node->neigh_list, list) {
 
                        if (tmp_neigh_node2 == tmp_neigh_node)
                                continue;