batman-adv: Store modification counter via hash helpers
authorSven Eckelmann <sven@narfation.org>
Tue, 30 Oct 2018 21:01:25 +0000 (22:01 +0100)
committerSimon Wunderlich <sw@simonwunderlich.de>
Mon, 12 Nov 2018 09:41:51 +0000 (10:41 +0100)
Multiple datastructures use the hash helper functions to add and remove
entries from the simple hlist based hashes. These are often also dumped to
userspace via netlink and thus should have a generation sequence counter.

Reported-by: Matthias Schiffer <mschiffer@universe-factory.net>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
net/batman-adv/hash.c
net/batman-adv/hash.h

index 7b49e4001778f0a53d14eb76ee96595a9a02e775..9194f4d891b1263c48f7442824c55095b56576c0 100644 (file)
@@ -32,6 +32,8 @@ static void batadv_hash_init(struct batadv_hashtable *hash)
                INIT_HLIST_HEAD(&hash->table[i]);
                spin_lock_init(&hash->list_locks[i]);
        }
+
+       atomic_set(&hash->generation, 0);
 }
 
 /**
index 9490a7ca2ba698399b2247799dd85004da5d04c8..0e36fa1c7c3eccdd33f8ede8ddac0780c3f8039e 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "main.h"
 
+#include <linux/atomic.h>
 #include <linux/compiler.h>
 #include <linux/list.h>
 #include <linux/rculist.h>
@@ -58,6 +59,9 @@ struct batadv_hashtable {
 
        /** @size: size of hashtable */
        u32 size;
+
+       /** @generation: current (generation) sequence number */
+       atomic_t generation;
 };
 
 /* allocates and clears the hash */
@@ -112,6 +116,7 @@ static inline int batadv_hash_add(struct batadv_hashtable *hash,
 
        /* no duplicate found in list, add new element */
        hlist_add_head_rcu(data_node, head);
+       atomic_inc(&hash->generation);
 
        ret = 0;
 
@@ -154,6 +159,7 @@ static inline void *batadv_hash_remove(struct batadv_hashtable *hash,
 
                data_save = node;
                hlist_del_rcu(node);
+               atomic_inc(&hash->generation);
                break;
        }
        spin_unlock_bh(&hash->list_locks[index]);