mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
rhashtable: Restore RCU marking on rhash_lock_head
This patch restores the RCU marking on bucket_table->buckets as it really does need RCU protection. Its removal had led to a fatal bug. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
1748f6a2cb
commit
ce9b362bf6
@@ -31,7 +31,7 @@
|
||||
|
||||
union nested_table {
|
||||
union nested_table __rcu *table;
|
||||
struct rhash_lock_head *bucket;
|
||||
struct rhash_lock_head __rcu *bucket;
|
||||
};
|
||||
|
||||
static u32 head_hashfn(struct rhashtable *ht,
|
||||
@@ -222,7 +222,7 @@ static struct bucket_table *rhashtable_last_table(struct rhashtable *ht,
|
||||
}
|
||||
|
||||
static int rhashtable_rehash_one(struct rhashtable *ht,
|
||||
struct rhash_lock_head **bkt,
|
||||
struct rhash_lock_head __rcu **bkt,
|
||||
unsigned int old_hash)
|
||||
{
|
||||
struct bucket_table *old_tbl = rht_dereference(ht->tbl, ht);
|
||||
@@ -275,7 +275,7 @@ static int rhashtable_rehash_chain(struct rhashtable *ht,
|
||||
unsigned int old_hash)
|
||||
{
|
||||
struct bucket_table *old_tbl = rht_dereference(ht->tbl, ht);
|
||||
struct rhash_lock_head **bkt = rht_bucket_var(old_tbl, old_hash);
|
||||
struct rhash_lock_head __rcu **bkt = rht_bucket_var(old_tbl, old_hash);
|
||||
int err;
|
||||
|
||||
if (!bkt)
|
||||
@@ -485,7 +485,7 @@ fail:
|
||||
}
|
||||
|
||||
static void *rhashtable_lookup_one(struct rhashtable *ht,
|
||||
struct rhash_lock_head **bkt,
|
||||
struct rhash_lock_head __rcu **bkt,
|
||||
struct bucket_table *tbl, unsigned int hash,
|
||||
const void *key, struct rhash_head *obj)
|
||||
{
|
||||
@@ -535,12 +535,10 @@ static void *rhashtable_lookup_one(struct rhashtable *ht,
|
||||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
|
||||
static struct bucket_table *rhashtable_insert_one(struct rhashtable *ht,
|
||||
struct rhash_lock_head **bkt,
|
||||
struct bucket_table *tbl,
|
||||
unsigned int hash,
|
||||
struct rhash_head *obj,
|
||||
void *data)
|
||||
static struct bucket_table *rhashtable_insert_one(
|
||||
struct rhashtable *ht, struct rhash_lock_head __rcu **bkt,
|
||||
struct bucket_table *tbl, unsigned int hash, struct rhash_head *obj,
|
||||
void *data)
|
||||
{
|
||||
struct bucket_table *new_tbl;
|
||||
struct rhash_head *head;
|
||||
@@ -591,7 +589,7 @@ static void *rhashtable_try_insert(struct rhashtable *ht, const void *key,
|
||||
{
|
||||
struct bucket_table *new_tbl;
|
||||
struct bucket_table *tbl;
|
||||
struct rhash_lock_head **bkt;
|
||||
struct rhash_lock_head __rcu **bkt;
|
||||
unsigned int hash;
|
||||
void *data;
|
||||
|
||||
@@ -1173,8 +1171,8 @@ void rhashtable_destroy(struct rhashtable *ht)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rhashtable_destroy);
|
||||
|
||||
struct rhash_lock_head **__rht_bucket_nested(const struct bucket_table *tbl,
|
||||
unsigned int hash)
|
||||
struct rhash_lock_head __rcu **__rht_bucket_nested(
|
||||
const struct bucket_table *tbl, unsigned int hash)
|
||||
{
|
||||
const unsigned int shift = PAGE_SHIFT - ilog2(sizeof(void *));
|
||||
unsigned int index = hash & ((1 << tbl->nest) - 1);
|
||||
@@ -1202,10 +1200,10 @@ struct rhash_lock_head **__rht_bucket_nested(const struct bucket_table *tbl,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__rht_bucket_nested);
|
||||
|
||||
struct rhash_lock_head **rht_bucket_nested(const struct bucket_table *tbl,
|
||||
unsigned int hash)
|
||||
struct rhash_lock_head __rcu **rht_bucket_nested(
|
||||
const struct bucket_table *tbl, unsigned int hash)
|
||||
{
|
||||
static struct rhash_lock_head *rhnull;
|
||||
static struct rhash_lock_head __rcu *rhnull;
|
||||
|
||||
if (!rhnull)
|
||||
INIT_RHT_NULLS_HEAD(rhnull);
|
||||
@@ -1213,9 +1211,8 @@ struct rhash_lock_head **rht_bucket_nested(const struct bucket_table *tbl,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rht_bucket_nested);
|
||||
|
||||
struct rhash_lock_head **rht_bucket_nested_insert(struct rhashtable *ht,
|
||||
struct bucket_table *tbl,
|
||||
unsigned int hash)
|
||||
struct rhash_lock_head __rcu **rht_bucket_nested_insert(
|
||||
struct rhashtable *ht, struct bucket_table *tbl, unsigned int hash)
|
||||
{
|
||||
const unsigned int shift = PAGE_SHIFT - ilog2(sizeof(void *));
|
||||
unsigned int index = hash & ((1 << tbl->nest) - 1);
|
||||
|
Reference in New Issue
Block a user