batman-adv: Store modification counter via hash helpers
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>
This commit is contained in:
parent
fb69be6979
commit
05abd7bcc9
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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]);
|
||||
|
|
Loading…
Reference in New Issue