summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYing Xue <ying.xue@windriver.com>2015-01-07 05:41:55 (GMT)
committerDavid S. Miller <davem@davemloft.net>2015-01-09 03:47:11 (GMT)
commitbd6d4db552ceb52fb19890a454836dcda59743ce (patch)
tree1045ebbe9ecbd7ada7d610c0b8028440761593f6 /lib
parentdb30485408326a6f466a843b291b23535f63eda0 (diff)
downloadlinux-bd6d4db552ceb52fb19890a454836dcda59743ce.tar.xz
rhashtable: future table needs to be traversed when remove an object
When remove an object from hash table, we currently only traverse old bucket table to check whether the object exists. If the object is not found in it, we will try again. But in the second search loop, we still search the object from the old table instead of future table. As a result, the object may be not removed from hash table especially when resizing is currently in progress and the object is just saved in the future table. Signed-off-by: Ying Xue <ying.xue@windriver.com> Cc: Thomas Graf <tgraf@suug.ch> Acked-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'lib')
-rw-r--r--lib/rhashtable.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/rhashtable.c b/lib/rhashtable.c
index 4430233..1aef942 100644
--- a/lib/rhashtable.c
+++ b/lib/rhashtable.c
@@ -608,10 +608,10 @@ restart:
return true;
}
- if (tbl != rht_dereference_rcu(ht->tbl, ht)) {
+ if (tbl != rht_dereference_rcu(ht->future_tbl, ht)) {
spin_unlock_bh(lock);
- tbl = rht_dereference_rcu(ht->tbl, ht);
+ tbl = rht_dereference_rcu(ht->future_tbl, ht);
hash = head_hashfn(ht, tbl, obj);
lock = bucket_lock(tbl, hash);