[PATCH 06/15] net,9p: use new hashtable implementation
From: Sasha Levin <hidden>
Date: 2012-12-17 15:02:51
Also in:
lkml
Subsystem:
9p file system, the rest · Maintainers:
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet, Linus Torvalds
Switch 9p error table to use the new hashtable implementation. This reduces
the amount of generic unrelated code in 9p.
This patch depends on d9b482c ("hashtable: introduce a small and naive
hashtable") which was merged in v3.6.
Signed-off-by: Sasha Levin <redacted>
---
net/9p/error.c | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/net/9p/error.c b/net/9p/error.c
index 2ab2de7..a394b37 100644
--- a/net/9p/error.c
+++ b/net/9p/error.c@@ -34,6 +34,7 @@ #include <linux/jhash.h> #include <linux/errno.h> #include <net/9p/9p.h> +#include <linux/hashtable.h> /** * struct errormap - map string errors from Plan 9 to Linux numeric ids
@@ -50,8 +51,8 @@ struct errormap { struct hlist_node list; }; -#define ERRHASHSZ 32 -static struct hlist_head hash_errmap[ERRHASHSZ]; +#define ERR_HASH_BITS 5 +static DEFINE_HASHTABLE(hash_errmap, ERR_HASH_BITS); /* FixMe - reduce to a reasonable size */ static struct errormap errmap[] = {
@@ -193,18 +194,14 @@ static struct errormap errmap[] = { int p9_error_init(void) { struct errormap *c; - int bucket; - - /* initialize hash table */ - for (bucket = 0; bucket < ERRHASHSZ; bucket++) - INIT_HLIST_HEAD(&hash_errmap[bucket]); + u32 hash; /* load initial error map into hash table */ for (c = errmap; c->name != NULL; c++) { c->namelen = strlen(c->name); - bucket = jhash(c->name, c->namelen, 0) % ERRHASHSZ; + hash = jhash(c->name, c->namelen, 0); INIT_HLIST_NODE(&c->list); - hlist_add_head(&c->list, &hash_errmap[bucket]); + hash_add(hash_errmap, &c->list, hash); } return 1;
@@ -223,13 +220,13 @@ int p9_errstr2errno(char *errstr, int len) int errno; struct hlist_node *p; struct errormap *c; - int bucket; + u32 hash; errno = 0; p = NULL; c = NULL; - bucket = jhash(errstr, len, 0) % ERRHASHSZ; - hlist_for_each_entry(c, p, &hash_errmap[bucket], list) { + hash = jhash(errstr, len, 0); + hash_for_each_possible(hash_errmap, c, p, list, hash) { if (c->namelen == len && !memcmp(c->name, errstr, len)) { errno = c->val; break;
--
1.8.0