History

fs, jbd: use a more generic hash function

While the hash function used by the revoke hashtable is good somewhere else, it's not really good here. The default hash shift (8) means that one third of the hashing function gets lost (and is undefined anyways (8 - 12 = negative shift)): "(block << (hash_shift - 12))) & (table->hash_size - 1)" Instead, just use the kernel's generic hash function that gets used everywhere else.

Sasha Levin committed 12 years ago

Commit 3c9cafe1 parent 474d2601 file · +2 −5Browse files

Unified · Split

fs/jbd/revoke.c+2−5
@@ -93,6 +93,7 @@ · 92 unmodified lines
93#include <linux/bio.h>93#include <linux/bio.h>
94#endif94#endif
95#include <linux/log2.h>95#include <linux/log2.h>
96#include <linux/hash.h>
96 97
97static struct kmem_cache *revoke_record_cache;98static struct kmem_cache *revoke_record_cache;
98static struct kmem_cache *revoke_table_cache;99static struct kmem_cache *revoke_table_cache;
@@ -129,15 +130,11 @@ static void flush_descriptor(journal_t *, struct journal_head *, int, int); · 30 unmodified lines
129 130
130/* Utility functions to maintain the revoke table */131/* Utility functions to maintain the revoke table */
131 132
132/* Borrowed from buffer.c: this is a tried and tested block hash function */
133static inline int hash(journal_t *journal, unsigned int block)133static inline int hash(journal_t *journal, unsigned int block)
134{134{
135 struct jbd_revoke_table_s *table = journal->j_revoke;135 struct jbd_revoke_table_s *table = journal->j_revoke;
136 int hash_shift = table->hash_shift;
137 136
138 return ((block << (hash_shift - 6)) ^137 return hash_32(block, table->hash_shift);
139 (block >> 13) ^
140 (block << (hash_shift - 12))) & (table->hash_size - 1);
141}138}
142 139
143static int insert_revoke_hash(journal_t *journal, unsigned int blocknr,140static int insert_revoke_hash(journal_t *journal, unsigned int blocknr,