On 04/03/2018 15:26, Paul Blakey wrote: > When inserting duplicate objects (those with the same key), > current rhlist implementation messes up the chain pointers by > updating the bucket pointer instead of prev next pointer to the > newly inserted node. This causes missing elements on removal and > travesal. > > Fix that by properly updating pprev pointer to point to > the correct rhash_head next pointer. > > Fixes: ca26893f05e8 ('rhashtable: Add rhlist interface') > Signed-off-by: Paul Blakey <pa...@mellanox.com> > --- > include/linux/rhashtable.h | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/include/linux/rhashtable.h b/include/linux/rhashtable.h > index c9df252..668a21f 100644 > --- a/include/linux/rhashtable.h > +++ b/include/linux/rhashtable.h > @@ -766,8 +766,10 @@ static inline void *__rhashtable_insert_fast( > if (!key || > (params.obj_cmpfn ? > params.obj_cmpfn(&arg, rht_obj(ht, head)) : > - rhashtable_compare(&arg, rht_obj(ht, head)))) > + rhashtable_compare(&arg, rht_obj(ht, head)))) { > + pprev = &head->next;
It seems rhashtable_lookup_one() might need the same fix. > continue; > + } > > data = rht_obj(ht, head); > > Mark